Функция rsa.SignPSS

Функция rsa.SignPSS создает цифровую подпись для сообщения с использованием алгоритма RSA и схемы PSS (Probabilistic Signature Scheme). В первый параметр передается генератор случайных чисел io.Reader. Во второй параметр передается закрытый ключ *rsa.PrivateKey. Третий параметр принимает хеш-функцию, реализующую интерфейс crypto.Hash. Четвертый параметр принимает хеш подписываемого сообщения в виде среза байтов. Пятый параметр принимает опции подписи в виде *rsa.PSSOptions. Функция возвращает подпись в виде среза байтов или ошибку.

Синтаксис

gofunc SignPSS(rand io.Reader, priv *PrivateKey, hash crypto.Hash, digest []byte, opts *PSSOptions) ([]byte, error)

Пример

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

gopackage 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)
}

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

go"7c8e5f9a3b2d1e4f6a8c0d9e5f7a3b2d1e4f6a8c0d9e5f7a3b2d1e4f6a8c0d9e"

Пример

Давайте создадим подпись с фиксированной длиной соли и проверим ее с помощью rsa.VerifyPSS:

gopackage 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")
}

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

go"Signature verified successfully"

Пример

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

gopackage 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))
}

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

go"Signature length: 256 bytes"

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

  • функцию rsa.VerifyPSS,
    которая проверяет подпись, созданную с помощью PSS
  • функцию rsa.SignPKCS1v15,
    которая создает подпись с использованием PKCS1v15
  • функцию rsa.GenerateKey,
    которая генерирует пару RSA-ключей
  • функцию rsa.EncryptOAEP,
    которая шифрует данные с использованием OAEP