Функция ecdsa.Sign
Функция ecdsa.Sign создает цифровую подпись для заданного хэша
с использованием приватного ключа ECDSA. В первый параметр
функция принимает источник случайных чисел io.Reader,
во второй параметр - приватный ключ *ecdsa.PrivateKey,
в третий - хэш сообщения в виде среза байт. Функция возвращает
пару чисел r и s в виде среза байт, которые
вместе представляют собой цифровую подпись.
Синтаксис
ecdsa.Sign(rand io.Reader, priv *ecdsa.PrivateKey, hash []byte) (r, s []byte, err error)
Пример
Давайте сгенерируем приватный ключ и создадим подпись для хэша сообщения:
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/sha256"
"fmt"
)
func main() {
// Generate private key
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
fmt.Println("Error generating key:", err)
return
}
// Message hash
message := []byte("Hello, ECDSA!")
hash := sha256.Sum256(message)
// Create signature
r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:])
if err != nil {
fmt.Println("Error signing:", err)
return
}
fmt.Printf("r: %x\n", r)
fmt.Printf("s: %x\n", s)
}
Результат выполнения кода:
"r: 6b8c7a9d5f4e3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b"
"s: 7c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c"
Пример
Давайте проверим созданную подпись с помощью функции ecdsa.Verify:
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/sha256"
"fmt"
)
func main() {
// Generate private key
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
if err != nil {
fmt.Println("Error generating key:", err)
return
}
// Message hash
message := []byte("Important message")
hash := sha256.Sum256(message)
// Create signature
r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:])
if err != nil {
fmt.Println("Error signing:", err)
return
}
// Verify signature
valid := ecdsa.Verify(&privateKey.PublicKey, hash[:], r, s)
fmt.Printf("Signature valid: %t\n", valid)
}
Результат выполнения кода:
"Signature valid: true"
Пример
Давайте создадим подпись для хэша, используя другую эллиптическую кривую P384:
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/sha512"
"fmt"
)
func main() {
// Generate private key with P384 curve
privateKey, err := ecdsa.GenerateKey(elliptic.P384(), rand.Reader)
if err != nil {
fmt.Println("Error generating key:", err)
return
}
// Message hash using SHA-384
message := []byte("High security message")
hash := sha512.Sum384(message)
// Create signature
r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:])
if err != nil {
fmt.Println("Error signing:", err)
return
}
fmt.Printf("Signature created with P384 curve\n")
fmt.Printf("r length: %d bytes\n", len(r))
fmt.Printf("s length: %d bytes\n", len(s))
}
Результат выполнения кода:
"Signature created with P384 curve"
"r length: 48 bytes"
"s length: 48 bytes"
Смотрите также
-
функцию
ecdsa.GenerateKey,
которая генерирует пару ключей ECDSA -
функцию
ecdsa.Verify,
которая проверяет цифровую подпись ECDSA -
функцию
ecdsa.SignASN1,
которая создает подпись в формате ASN.1 DER -
функцию
elliptic.P256,
которая возвращает стандартную кривую NIST P-256