Функция ecdsa.VerifyASN1

Функция ecdsa.VerifyASN1 проверяет, является ли цифровая подпись ECDSA, переданная в формате ASN.1, действительной для указанного хеша сообщения и открытого ключа. В первый параметр мы передаем указатель на открытый ключ *ecdsa.PublicKey, во второй параметр мы передаем хеш сообщения в виде среза байт, а в третий параметр — подпись в формате ASN.1, также в виде среза байт. Функция возвращает true, если подпись действительна, и false в противном случае.

Синтаксис

goecdsa.VerifyASN1(pubKey *ecdsa.PublicKey, hash []byte, signature []byte) bool

Пример

Давайте проверим подпись для сообщения "hello world", используя открытый ключ и подпись в формате ASN.1:

gopackage main

import (
  "crypto/ecdsa"
  "crypto/elliptic"
  "crypto/rand"
  "crypto/sha256"
  "encoding/hex"
  "fmt"
  "log"
)

func main() {
  // Генерируем закрытый ключ
  privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  if err != nil {
    log.Fatal(err)
  }

  // Сообщение для подписи
  message := []byte("hello world")
  hash := sha256.Sum256(message)

  // Создаем подпись в формате ASN.1
  signature, err := ecdsa.SignASN1(rand.Reader, privateKey, hash[:])
  if err != nil {
    log.Fatal(err)
  }

  // Проверяем подпись
  res := ecdsa.VerifyASN1(&privateKey.PublicKey, hash[:], signature)
  fmt.Println(res)
}

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

gotrue

Пример

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

gopackage main

import (
  "crypto/ecdsa"
  "crypto/elliptic"
  "crypto/rand"
  "crypto/sha256"
  "encoding/hex"
  "fmt"
  "log"
)

func main() {
  // Генерируем закрытый ключ
  privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  if err != nil {
    log.Fatal(err)
  }

  // Оригинальное сообщение
  originalMessage := []byte("hello world")
  originalHash := sha256.Sum256(originalMessage)

  // Создаем подпись для оригинального сообщения
  signature, err := ecdsa.SignASN1(rand.Reader, privateKey, originalHash[:])
  if err != nil {
    log.Fatal(err)
  }

  // Изменяем сообщение
  tamperedMessage := []byte("hello go")
  tamperedHash := sha256.Sum256(tamperedMessage)

  // Проверяем подпись для измененного сообщения
  res := ecdsa.VerifyASN1(&privateKey.PublicKey, tamperedHash[:], signature)
  fmt.Println(res)
}

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

gofalse

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

  • функцию ecdsa.Verify,
    которая проверяет подпись ECDSA в виде двух больших чисел
  • функцию ecdsa.SignASN1,
    которая создает подпись ECDSA в формате ASN.1
  • функцию ecdsa.GenerateKey,
    которая генерирует пару ключей ECDSA
  • функцию ecdsa.Sign,
    которая создает подпись ECDSA в виде двух больших чисел