Функция ed25519.GenerateKey
Функция ed25519.GenerateKey генерирует новую пару открытого и закрытого ключей для алгоритма цифровой подписи Ed25519.
Первый параметр - источник криптографически безопасного случайного числа (обычно используется rand.Reader).
Функция возвращает два значения: закрытый ключ (тип PrivateKey) и открытый ключ (тип PublicKey).
Закрытый ключ используется для подписи данных, а открытый - для проверки подписи.
Синтаксис
privateKey, publicKey, err := ed25519.GenerateKey(rand.Reader)
Пакет ed25519 находится в стандартной библиотеке Go, поэтому для его использования достаточно импортировать crypto/ed25519 и crypto/rand.
Пример
Давайте сгенерируем ключевую пару и выведем размеры ключей:
package main
import (
"crypto/ed25519"
"crypto/rand"
"fmt"
)
func main() {
privateKey, publicKey, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
fmt.Println("Error generating keys:", err)
return
}
fmt.Println("Private key length:", len(privateKey))
fmt.Println("Public key length:", len(publicKey))
}
Результат выполнения кода:
"Private key length: 64"
"Public key length: 32"
Закрытый ключ в Ed25519 имеет длину 64 байта (32 байта для открытого ключа + 32 байта для закрытого), а открытый ключ - 32 байта.
Пример
Давайте сгенерируем ключевую пару и используем её для подписи и проверки сообщения:
package main
import (
"crypto/ed25519"
"crypto/rand"
"fmt"
)
func main() {
// Generate key pair
privateKey, publicKey, err := ed25519.GenerateKey(rand.Reader)
if err != nil {
fmt.Println("Error generating keys:", err)
return
}
// Message to sign
message := []byte("Hello, Ed25519!")
// Sign the message
signature := ed25519.Sign(privateKey, message)
// Verify the signature
isValid := ed25519.Verify(publicKey, message, signature)
fmt.Println("Signature is valid:", isValid)
}
Результат выполнения кода:
"Signature is valid: true"
В этом примере мы сгенерировали ключевую пару, подписали сообщение закрытым ключом и проверили подпись открытым ключом.
Пример
Давайте покажем, что подпись, созданная с помощью одного закрытого ключа, не проходит проверку с другим открытым ключом:
package main
import (
"crypto/ed25519"
"crypto/rand"
"fmt"
)
func main() {
// Generate first key pair
privateKey1, publicKey1, _ := ed25519.GenerateKey(rand.Reader)
// Generate second key pair
_, publicKey2, _ := ed25519.GenerateKey(rand.Reader)
// Message to sign
message := []byte("Test message for verification")
// Sign with first private key
signature := ed25519.Sign(privateKey1, message)
// Try to verify with second public key
isValid := ed25519.Verify(publicKey2, message, signature)
fmt.Println("Verification with wrong key:", isValid)
}
Результат выполнения кода:
"Verification with wrong key: false"
Как видим, подпись не проходит проверку, если используется другой открытый ключ.
Смотрите также
-
функцию
ed25519.Sign,
которая создает цифровую подпись сообщения с использованием закрытого ключа -
функцию
ed25519.Verify,
которая проверяет цифровую подпись с использованием открытого ключа -
функцию
rsa.GenerateKey,
которая генерирует пару ключей RSA для асимметричного шифрования -
функцию
ecdsa.GenerateKey,
которая генерирует пару ключей ECDSA для цифровой подписи