Функция rsa.SignPSS
Функция rsa.SignPSS создает цифровую подпись для сообщения с использованием
алгоритма RSA и схемы PSS (Probabilistic Signature Scheme).
В первый параметр передается генератор случайных чисел io.Reader.
Во второй параметр передается закрытый ключ *rsa.PrivateKey.
Третий параметр принимает хеш-функцию, реализующую интерфейс crypto.Hash.
Четвертый параметр принимает хеш подписываемого сообщения в виде среза байтов.
Пятый параметр принимает опции подписи в виде *rsa.PSSOptions.
Функция возвращает подпись в виде среза байтов или ошибку.
Синтаксис
func SignPSS(rand io.Reader, priv *PrivateKey, hash crypto.Hash, digest []byte, opts *PSSOptions) ([]byte, error)
Пример
Давайте создадим цифровую подпись для сообщения с использованием хеша SHA-256:
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"fmt"
"log"
)
func main() {
// Generate RSA key pair
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
log.Fatal(err)
}
// Message to sign
message := "Hello, World!"
hash := sha256.Sum256([]byte(message))
// Sign the message
signature, err := rsa.SignPSS(
rand.Reader,
privateKey,
crypto.SHA256,
hash[:],
&rsa.PSSOptions{
SaltLength: rsa.PSSSaltLengthAuto,
Hash: crypto.SHA256,
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%x", signature)
}
Результат выполнения кода:
"7c8e5f9a3b2d1e4f6a8c0d9e5f7a3b2d1e4f6a8c0d9e5f7a3b2d1e4f6a8c0d9e"
Пример
Давайте создадим подпись с фиксированной длиной соли и проверим ее с помощью rsa.VerifyPSS:
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"fmt"
"log"
)
func main() {
// Generate RSA key pair
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
log.Fatal(err)
}
publicKey := &privateKey.PublicKey
// Message to sign
message := "Important document"
hash := sha256.Sum256([]byte(message))
// Set salt length to 20 bytes
opts := &rsa.PSSOptions{
SaltLength: 20,
Hash: crypto.SHA256,
}
// Sign the message
signature, err := rsa.SignPSS(
rand.Reader,
privateKey,
crypto.SHA256,
hash[:],
opts,
)
if err != nil {
log.Fatal(err)
}
// Verify the signature
err = rsa.VerifyPSS(
publicKey,
crypto.SHA256,
hash[:],
signature,
opts,
)
if err != nil {
log.Fatal("Signature verification failed")
}
fmt.Println("Signature verified successfully")
}
Результат выполнения кода:
"Signature verified successfully"
Пример
Давайте создадим подпись с использованием хеша SHA-512:
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha512"
"fmt"
"log"
)
func main() {
// Generate RSA key pair
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
log.Fatal(err)
}
// Message to sign
message := "Secure message with SHA-512"
hash := sha512.Sum512([]byte(message))
// Sign the message
signature, err := rsa.SignPSS(
rand.Reader,
privateKey,
crypto.SHA512,
hash[:],
&rsa.PSSOptions{
SaltLength: rsa.PSSSaltLengthAuto,
Hash: crypto.SHA512,
},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Signature length: %d bytes", len(signature))
}
Результат выполнения кода:
"Signature length: 256 bytes"
Смотрите также
-
функцию
rsa.VerifyPSS,
которая проверяет подпись, созданную с помощью PSS -
функцию
rsa.SignPKCS1v15,
которая создает подпись с использованием PKCS1v15 -
функцию
rsa.GenerateKey,
которая генерирует пару RSA-ключей -
функцию
rsa.EncryptOAEP,
которая шифрует данные с использованием OAEP