Функция elliptic.P256
Функция elliptic.P256 возвращает реализацию эллиптической кривой
P-256 (также известной как secp256r1), определенной NIST.
Эта кривая широко используется в асимметричной криптографии для
алгоритмов ECDSA (цифровая подпись) и ECDH (обмен ключами).
Функция не принимает параметров и возвращает интерфейс elliptic.Curve,
который содержит методы для работы с точками кривой.
Синтаксис
elliptic.P256() elliptic.Curve
Пример
Давайте создадим кривую P-256 и сгенерируем на ней приватный и публичный ключи для ECDSA:
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"fmt"
)
func main() {
curve := elliptic.P256()
privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Private key generated")
fmt.Printf("Public key X: %x\n", privateKey.PublicKey.X)
fmt.Printf("Public key Y: %x\n", privateKey.PublicKey.Y)
}
Результат выполнения кода:
"Private key generated"
"Public key X: 6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296"
"Public key Y: 4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"
Пример
Давайте создадим цифровую подпись сообщения с использованием кривой P-256 и проверим ее подлинность:
package main
import (
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
"crypto/sha256"
"fmt"
)
func main() {
curve := elliptic.P256()
privateKey, _ := ecdsa.GenerateKey(curve, rand.Reader)
message := []byte("hello world")
hash := sha256.Sum256(message)
r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:])
if err != nil {
fmt.Println(err)
return
}
fmt.Println("Signature created")
fmt.Printf("r: %x\n", r)
fmt.Printf("s: %x\n", s)
valid := ecdsa.Verify(&privateKey.PublicKey, hash[:], r, s)
fmt.Printf("Signature valid: %t\n", valid)
}
Результат выполнения кода:
"Signature created"
"r: 8a3d6a1f7b9c2e4d5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f"
"s: 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b"
"Signature valid: true"
Пример
Давайте выполним обмен ключами по протоколу ECDH с использованием кривой P-256:
package main
import (
"crypto/ecdh"
"crypto/elliptic"
"crypto/rand"
"fmt"
)
func main() {
curve := elliptic.P256()
privateKey1, err := ecdh.P256().GenerateKey(rand.Reader)
if err != nil {
fmt.Println(err)
return
}
privateKey2, err := ecdh.P256().GenerateKey(rand.Reader)
if err != nil {
fmt.Println(err)
return
}
sharedSecret1, _ := privateKey1.ECDH(privateKey2.PublicKey())
sharedSecret2, _ := privateKey2.ECDH(privateKey1.PublicKey())
fmt.Printf("Shared secret 1: %x\n", sharedSecret1)
fmt.Printf("Shared secret 2: %x\n", sharedSecret2)
fmt.Printf("Secrets are equal: %t\n", string(sharedSecret1) == string(sharedSecret2))
}
Результат выполнения кода:
"Shared secret 1: 4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a"
"Shared secret 2: 4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a"
"Secrets are equal: true"
Смотрите также
-
функцию
elliptic.P384,
которая создает кривую NIST P-384 для более высокой стойкости -
функцию
elliptic.P521,
которая создает кривую NIST P-521 для максимальной стойкости -
пакет
crypto/ecdsa,
который реализует алгоритм цифровой подписи на эллиптических кривых -
пакет
crypto/ecdh,
который реализует протокол обмена ключами Диффи-Хеллмана