Функция ecdsa.VerifyASN1
Функция ecdsa.VerifyASN1 проверяет,
является ли цифровая подпись ECDSA, переданная в формате ASN.1,
действительной для указанного хеша сообщения и открытого ключа.
В первый параметр мы передаем указатель на открытый ключ
*ecdsa.PublicKey, во второй параметр мы передаем
хеш сообщения в виде среза байт, а в третий параметр —
подпись в формате ASN.1, также в виде среза байт.
Функция возвращает true, если подпись действительна,
и false в противном случае.
Синтаксис
ecdsa.VerifyASN1(pubKey *ecdsa.PublicKey, hash []byte, signature []byte) bool
Пример
Давайте проверим подпись для сообщения "hello world", используя открытый ключ и подпись в формате ASN.1:
package 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)
}
Результат выполнения кода:
true
Пример
Давайте проверим подпись, но изменим сообщение, чтобы получить недействительную подпись:
package 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)
}
Результат выполнения кода:
false
Смотрите также
-
функцию
ecdsa.Verify,
которая проверяет подпись ECDSA в виде двух больших чисел -
функцию
ecdsa.SignASN1,
которая создает подпись ECDSA в формате ASN.1 -
функцию
ecdsa.GenerateKey,
которая генерирует пару ключей ECDSA -
функцию
ecdsa.Sign,
которая создает подпись ECDSA в виде двух больших чисел