Функция rsa.SignPKCS1v15
Функция rsa.SignPKCS1v15 создает цифровую подпись для переданного хеша сообщения с использованием закрытого ключа RSA. Первым аргументом передается источник случайных данных (обычно rand.Reader), вторым — закрытый ключ (*rsa.PrivateKey), третьим — хеш-функция (тип crypto.Hash), а четвертым — хеш сообщения в виде байтового среза. Функция возвращает подпись в виде []byte или ошибку, если подпись не удалось создать.
Важно, что длина хеша должна соответствовать выбранной хеш-функции. Например, для sha256.New хеш должен быть длиной 32 байта. Функция используется для асимметричной подписи данных, где закрытый ключ хранится в секрете, а открытый ключ используется для верификации подписи с помощью rsa.VerifyPKCS1v15.
Синтаксис
func SignPKCS1v15(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error)
Пример
Создадим подпись для сообщения с использованием хеша SHA-256:
package 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)
}
Результат выполнения кода:
"Signature: 4a7b8c9d... (длинная шестнадцатеричная строка)"
Пример
Проверим, что функция возвращает ошибку при передаче неверной длины хеша:
package 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)
}
}
Результат выполнения кода:
"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 хеш для сообщения