Функция ecdsa.Sign

Функция ecdsa.Sign создает цифровую подпись для заданного хэша с использованием приватного ключа ECDSA. В первый параметр функция принимает источник случайных чисел io.Reader, во второй параметр - приватный ключ *ecdsa.PrivateKey, в третий - хэш сообщения в виде среза байт. Функция возвращает пару чисел r и s в виде среза байт, которые вместе представляют собой цифровую подпись.

Синтаксис

goecdsa.Sign(rand io.Reader, priv *ecdsa.PrivateKey, hash []byte) (r, s []byte, err error)

Пример

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

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

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

go"r: 6b8c7a9d5f4e3a2b1c0d9e8f7a6b5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b"
"s: 7c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2a1b0c"

Пример

Давайте проверим созданную подпись с помощью функции ecdsa.Verify:

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

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

go"Signature valid: true"

Пример

Давайте создадим подпись для хэша, используя другую эллиптическую кривую P384:

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

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

go"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