Функция ed25519.GenerateKey

Функция ed25519.GenerateKey генерирует новую пару открытого и закрытого ключей для алгоритма цифровой подписи Ed25519. Первый параметр - источник криптографически безопасного случайного числа (обычно используется rand.Reader). Функция возвращает два значения: закрытый ключ (тип PrivateKey) и открытый ключ (тип PublicKey). Закрытый ключ используется для подписи данных, а открытый - для проверки подписи.

Синтаксис

goprivateKey, publicKey, err := ed25519.GenerateKey(rand.Reader)

Пакет ed25519 находится в стандартной библиотеке Go, поэтому для его использования достаточно импортировать crypto/ed25519 и crypto/rand.

Пример

Давайте сгенерируем ключевую пару и выведем размеры ключей:

gopackage 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))
}

Результат выполнения кода:

go"Private key length: 64"
"Public key length: 32"

Закрытый ключ в Ed25519 имеет длину 64 байта (32 байта для открытого ключа + 32 байта для закрытого), а открытый ключ - 32 байта.

Пример

Давайте сгенерируем ключевую пару и используем её для подписи и проверки сообщения:

gopackage 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)
}

Результат выполнения кода:

go"Signature is valid: true"

В этом примере мы сгенерировали ключевую пару, подписали сообщение закрытым ключом и проверили подпись открытым ключом.

Пример

Давайте покажем, что подпись, созданная с помощью одного закрытого ключа, не проходит проверку с другим открытым ключом:

gopackage 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)
}

Результат выполнения кода:

go"Verification with wrong key: false"

Как видим, подпись не проходит проверку, если используется другой открытый ключ.

Смотрите также

  • функцию ed25519.Sign,
    которая создает цифровую подпись сообщения с использованием закрытого ключа
  • функцию ed25519.Verify,
    которая проверяет цифровую подпись с использованием открытого ключа
  • функцию rsa.GenerateKey,
    которая генерирует пару ключей RSA для асимметричного шифрования
  • функцию ecdsa.GenerateKey,
    которая генерирует пару ключей ECDSA для цифровой подписи