Функция rsa.VerifyPKCS1v15

Функция rsa.VerifyPKCS1v15 проверяет корректность цифровой подписи, созданной с использованием алгоритма RSA и схемы подписи PKCS#1 v1.5. В первый параметр функция принимает открытый ключ rsa.PublicKey, во второй параметр - хеш-функцию crypto.Hash, в третий параметр - хеш подписываемого сообщения, в четвертый параметр - подпись для проверки. Функция возвращает error: nil, если подпись верна, или ошибку в противном случае.

Синтаксис

gorsa.VerifyPKCS1v15(pub *rsa.PublicKey, hash crypto.Hash, hashed []byte, sig []byte) error

Пример

Давайте проверим подпись для сообщения с использованием хеша SHA-256:

gopackage main

import (
  "crypto"
  "crypto/rand"
  "crypto/rsa"
  "crypto/sha256"
  "fmt"
)

func main() {
  // Генерируем ключевую пару
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    fmt.Println(err)
    return
  }
  publicKey := &privateKey.PublicKey

  // Сообщение для подписи
  message := []byte("Hello, World!")

  // Вычисляем хеш сообщения
  hash := sha256.Sum256(message)

  // Создаем подпись
  signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hash[:])
  if err != nil {
    fmt.Println(err)
    return
  }

  // Проверяем подпись
  err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hash[:], signature)
  if err != nil {
    fmt.Println("Подпись неверна:", err)
    return
  }

  fmt.Println("Подпись верна")
}

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

go"Подпись верна"

Пример

Давайте проверим подпись для неверного сообщения:

gopackage main

import (
  "crypto"
  "crypto/rand"
  "crypto/rsa"
  "crypto/sha256"
  "fmt"
)

func main() {
  // Генерируем ключевую пару
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    fmt.Println(err)
    return
  }
  publicKey := &privateKey.PublicKey

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

  // Создаем подпись для оригинального сообщения
  signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, originalHash[:])
  if err != nil {
    fmt.Println(err)
    return
  }

  // Измененное сообщение
  fakeMessage := []byte("Fake message")
  fakeHash := sha256.Sum256(fakeMessage)

  // Проверяем подпись для измененного сообщения
  err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, fakeHash[:], signature)
  if err != nil {
    fmt.Println("Подпись неверна:", err)
  } else {
    fmt.Println("Подпись верна")
  }
}

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

go"Подпись неверна: crypto/rsa: verification error"

Пример

Давайте проверим подпись с использованием хеша SHA-512:

gopackage main

import (
  "crypto"
  "crypto/rand"
  "crypto/rsa"
  "crypto/sha512"
  "fmt"
)

func main() {
  // Генерируем ключевую пару
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    fmt.Println(err)
    return
  }
  publicKey := &privateKey.PublicKey

  // Сообщение для подписи
  message := []byte("Important document")

  // Вычисляем хеш SHA-512
  hash := sha512.Sum512(message)

  // Создаем подпись
  signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA512, hash[:])
  if err != nil {
    fmt.Println(err)
    return
  }

  // Проверяем подпись
  err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA512, hash[:], signature)
  if err != nil {
    fmt.Println("Подпись неверна:", err)
    return
  }

  fmt.Println("Подпись верна")
}

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

go"Подпись верна"

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

  • функцию rsa.SignPKCS1v15,
    которая создает цифровую подпись по схеме PKCS#1 v1.5
  • функцию rsa.VerifyPSS,
    которая проверяет подпись PSS с улучшенной безопасностью
  • функцию rsa.SignPSS,
    которая создает подпись по схеме PSS
  • функцию rsa.GenerateKey,
    которая генерирует пару RSA-ключей для подписи и шифрования