РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1274 of 1593 menu

Функция 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 для цифровой подписи
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить