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

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