Функция rsa.DecryptPKCS1v15

Функция rsa.DecryptPKCS1v15 расшифровывает данные, которые были зашифрованы с помощью RSA и схемы заполнения PKCS#1 v1.5. В первый параметр функция принимает источник случайных данных rand.Reader, во второй параметр - приватный ключ *rsa.PrivateKey, в третий параметр - зашифрованные данные в виде среза байт []byte. Функция возвращает расшифрованные данные в виде среза байт и ошибку, если расшифровка не удалась.

Важно отметить, что данная функция не проверяет целостность данных и уязвима к атакам на основе оракула заполнения. Для новых проектов рекомендуется использовать более безопасную схему OAEP (функция rsa.DecryptOAEP).

Синтаксис

gorsa.DecryptPKCS1v15(rand io.Reader, priv *rsa.PrivateKey, ciphertext []byte) ([]byte, error)

Пример

Давайте расшифруем сообщение, зашифрованное с помощью открытого ключа RSA:

gopackage main

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

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

  // Исходное сообщение
  message := []byte("hello world")

  // Шифруем сообщение открытым ключом
  ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, message)
  if err != nil {
    log.Fatal(err)
  }

  // Расшифровываем сообщение приватным ключом
  plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, ciphertext)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("Original: %s\n", message)
  fmt.Printf("Decrypted: %s\n", plaintext)
}

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

go"Original: hello world"
"Decrypted: hello world"

Пример

Давайте обработаем ситуацию, когда расшифровка не удалась из-за неправильного ключа:

gopackage main

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

func main() {
  // Генерируем две разных ключевых пары
  key1, _ := rsa.GenerateKey(rand.Reader, 2048)
  key2, _ := rsa.GenerateKey(rand.Reader, 2048)

  message := []byte("secret data")

  // Шифруем первым ключом
  ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, &key1.PublicKey, message)
  if err != nil {
    log.Fatal(err)
  }

  // Пытаемся расшифровать вторым ключом
  plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, key2, ciphertext)
  if err != nil {
    fmt.Printf("Error: %v\n", err)
  } else {
    fmt.Printf("Decrypted: %s\n", plaintext)
  }
}

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

go"Error: crypto/rsa: decryption error"

Пример

Давайте расшифруем данные, используя приватный ключ, загруженный из переменной:

gopackage main

import (
  "crypto/rand"
  "crypto/rsa"
  "crypto/x509"
  "encoding/pem"
  "fmt"
  "log"
)

func main() {
  // Пример приватного ключа в формате PEM
  pemData := []byte(`
  -----BEGIN RSA PRIVATE KEY-----
  MIIEpQIBAAKCAQEAyQnR1n... (здесь должен быть полный ключ)
  -----END RSA PRIVATE KEY-----
  `)

  // Декодируем PEM блок
  block, _ := pem.Decode(pemData)
  if block == nil {
    log.Fatal("failed to parse PEM block containing the private key")
  }

  // Парсим приватный ключ
  privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
  if err != nil {
    log.Fatal(err)
  }

  // Зашифрованные данные
  ciphertext := []byte{0x01, 0x02, 0x03, 0x04, 0x05}

  // Расшифровываем данные
  plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, ciphertext)
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("Decrypted: %s\n", plaintext)
}

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

  • функцию rsa.EncryptPKCS1v15,
    которая шифрует данные с использованием RSA и схемы заполнения PKCS#1 v1.5
  • функцию rsa.DecryptOAEP,
    которая расшифровывает данные с использованием более безопасной схемы OAEP
  • функцию rsa.EncryptOAEP,
    которая шифрует данные с использованием схемы OAEP
  • функцию rsa.GenerateKey,
    которая генерирует пару ключей RSA заданной длины