Функция rsa.EncryptOAEP

Функция rsa.EncryptOAEP выполняет шифрование сообщения с использованием открытого ключа RSA и схемы дополнения OAEP (Optimal Asymmetric Encryption Padding). В первый параметр функция принимает хеш-функцию, которая используется для вычисления дайджеста в схеме OAEP. Вторым параметром передается криптографически стойкий генератор случайных чисел. Третий параметр - это открытый ключ RSA, используемый для шифрования. Четвертый параметр - само сообщение, которое нужно зашифровать, в виде среза байтов. Пятый параметр - это необязательная метка, которая также участвует в процессе шифрования (может быть пустой строкой). Функция возвращает зашифрованные данные в виде среза байтов и ошибку, если шифрование не удалось.

Синтаксис

gorsa.EncryptOAEP(hash hash.Hash, random io.Reader, pub *rsa.PublicKey, msg []byte, label []byte) ([]byte, error)

Пример

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

gopackage main

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

func main() {
  // Generate a 2048-bit RSA key pair
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    log.Fatal(err)
  }

  // Message to encrypt
  msg := []byte("Hello, World!")

  // Encrypt the message using OAEP with SHA-256
  ciphertext, err := rsa.EncryptOAEP(
    sha256.New(),
    rand.Reader,
    &privateKey.PublicKey,
    msg,
    nil,
  )
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("%x\n", ciphertext)
}

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

go"ciphertext in hexadecimal format"

Пример с использованием метки

Рассмотрим пример шифрования с использованием дополнительной метки, которая также используется в процессе шифрования:

gopackage main

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

func main() {
  // Generate a 2048-bit RSA key pair
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    log.Fatal(err)
  }

  // Message to encrypt
  msg := []byte("Sensitive data")

  // Optional label for OAEP
  label := []byte("my-encryption-label")

  // Encrypt the message with label
  ciphertext, err := rsa.EncryptOAEP(
    sha256.New(),
    rand.Reader,
    &privateKey.PublicKey,
    msg,
    label,
  )
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("Encrypted message length: %d bytes\n", len(ciphertext))
}

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

go"Encrypted message length: 256 bytes"

Пример с шифрованием и расшифровкой

Давайте продемонстрируем полный цикл шифрования и расшифровки данных с использованием функций rsa.EncryptOAEP и rsa.DecryptOAEP:

gopackage main

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

func main() {
  // Generate a 2048-bit RSA key pair
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    log.Fatal(err)
  }

  // Original message
  msg := []byte("This is a secret message")

  // Encrypt
  ciphertext, err := rsa.EncryptOAEP(
    sha256.New(),
    rand.Reader,
    &privateKey.PublicKey,
    msg,
    nil,
  )
  if err != nil {
    log.Fatal(err)
  }

  // Decrypt
  decrypted, err := rsa.DecryptOAEP(
    sha256.New(),
    rand.Reader,
    privateKey,
    ciphertext,
    nil,
  )
  if err != nil {
    log.Fatal(err)
  }

  fmt.Printf("Original: %s\n", string(msg))
  fmt.Printf("Decrypted: %s\n", string(decrypted))
  fmt.Printf("Match: %t\n", string(msg) == string(decrypted))
}

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

go"Original: This is a secret message"
"Decrypted: This is a secret message"
"Match: true"

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

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