Функция rsa.SignPKCS1v15

Функция rsa.SignPKCS1v15 создает цифровую подпись для переданного хеша сообщения с использованием закрытого ключа RSA. Первым аргументом передается источник случайных данных (обычно rand.Reader), вторым — закрытый ключ (*rsa.PrivateKey), третьим — хеш-функция (тип crypto.Hash), а четвертым — хеш сообщения в виде байтового среза. Функция возвращает подпись в виде []byte или ошибку, если подпись не удалось создать.

Важно, что длина хеша должна соответствовать выбранной хеш-функции. Например, для sha256.New хеш должен быть длиной 32 байта. Функция используется для асимметричной подписи данных, где закрытый ключ хранится в секрете, а открытый ключ используется для верификации подписи с помощью rsa.VerifyPKCS1v15.

Синтаксис

gofunc SignPKCS1v15(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error)

Пример

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

gopackage main

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

func main() {
  // Генерируем закрытый ключ (в реальном приложении он загружается из защищенного хранилища)
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    log.Fatal(err)
  }

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

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

  fmt.Printf("Signature: %x\n", signature)
}

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

go"Signature: 4a7b8c9d... (длинная шестнадцатеричная строка)"

Пример

Проверим, что функция возвращает ошибку при передаче неверной длины хеша:

gopackage main

import (
  "crypto"
  "crypto/rand"
  "crypto/rsa"
  "log"
)

func main() {
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    log.Fatal(err)
  }

  // Некорректный хеш (должен быть 32 байта для SHA-256)
  wrongHash := []byte("short")

  _, err = rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, wrongHash)
  if err != nil {
    log.Printf("Error: %v", err)
  }
}

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

go"Error: crypto/rsa: input must be hashed message"

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

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