Функция rsa.DecryptOAEP

Функция rsa.DecryptOAEP выполняет расшифровку данных, которые были зашифрованы с использованием алгоритма RSA и схемы дополнения OAEP. В первый параметр передается хеш-функция, которая используется для вычисления хешей в рамках схемы OAEP. Во второй параметр передается источник случайных данных (обычно rand.Reader). В третий параметр передается приватный ключ для расшифровки. В четвертый параметр передаются зашифрованные данные. В пятый параметр передается метка (label), которая использовалась при шифровании (может быть пустой строкой).

Синтаксис

gorsa.DecryptOAEP(hash hash.Hash, random io.Reader, priv *rsa.PrivateKey, ciphertext []byte, label []byte) ([]byte, error)

Базовый пример расшифровки

Давайте расшифруем данные, которые были зашифрованы с помощью функции rsa.EncryptOAEP:

gopackage main

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

func main() {
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    fmt.Println("Error generating key:", err)
    return
  }

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

  ciphertext, err := rsa.EncryptOAEP(
    sha256.New(),
    rand.Reader,
    &privateKey.PublicKey,
    message,
    label,
  )
  if err != nil {
    fmt.Println("Error encrypting:", err)
    return
  }

  plaintext, err := rsa.DecryptOAEP(
    sha256.New(),
    rand.Reader,
    privateKey,
    ciphertext,
    label,
  )
  if err != nil {
    fmt.Println("Error decrypting:", err)
    return
  }

  fmt.Println(string(plaintext))
}

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

go"secret message"

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

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

gopackage main

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

func main() {
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    fmt.Println("Error generating key:", err)
    return
  }

  message := []byte("confidential data")
  label := []byte("top-secret")

  ciphertext, err := rsa.EncryptOAEP(
    sha256.New(),
    rand.Reader,
    &privateKey.PublicKey,
    message,
    label,
  )
  if err != nil {
    fmt.Println("Error encrypting:", err)
    return
  }

  plaintext, err := rsa.DecryptOAEP(
    sha256.New(),
    rand.Reader,
    privateKey,
    ciphertext,
    label,
  )
  if err != nil {
    fmt.Println("Error decrypting:", err)
    return
  }

  fmt.Println(string(plaintext))
}

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

go"confidential data"

Обработка ошибки при неверной метке

При расшифровке данных с неверной меткой возникает ошибка:

gopackage main

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

func main() {
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    fmt.Println("Error generating key:", err)
    return
  }

  message := []byte("important data")
  labelCorrect := []byte("correct-label")
  labelWrong := []byte("wrong-label")

  ciphertext, err := rsa.EncryptOAEP(
    sha256.New(),
    rand.Reader,
    &privateKey.PublicKey,
    message,
    labelCorrect,
  )
  if err != nil {
    fmt.Println("Error encrypting:", err)
    return
  }

  plaintext, err := rsa.DecryptOAEP(
    sha256.New(),
    rand.Reader,
    privateKey,
    ciphertext,
    labelWrong,
  )
  if err != nil {
    fmt.Println("Error:", err)
    return
  }

  fmt.Println(string(plaintext))
}

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

go"Error: crypto/rsa: decryption error"

Расшифровка с использованием различных хешей

Функция rsa.DecryptOAEP может использовать разные хеши, например sha512.New:

gopackage main

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

func main() {
  privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    fmt.Println("Error generating key:", err)
    return
  }

  message := []byte("secure data with SHA512")
  label := []byte("")

  ciphertext, err := rsa.EncryptOAEP(
    sha512.New(),
    rand.Reader,
    &privateKey.PublicKey,
    message,
    label,
  )
  if err != nil {
    fmt.Println("Error encrypting:", err)
    return
  }

  plaintext, err := rsa.DecryptOAEP(
    sha512.New(),
    rand.Reader,
    privateKey,
    ciphertext,
    label,
  )
  if err != nil {
    fmt.Println("Error decrypting:", err)
    return
  }

  fmt.Println(string(plaintext))
}

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

go"secure data with SHA512"

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

  • функцию rsa.EncryptOAEP,
    которая выполняет шифрование по схеме OAEP
  • функцию rsa.DecryptPKCS1v15,
    которая расшифровывает данные по схеме PKCS1v15
  • функцию rsa.GenerateKey,
    которая генерирует пару RSA-ключей
  • функцию rand.Read,
    которая заполняет слайс криптостойкими случайными данными