Функция rsa.EncryptPKCS1v15

Функция rsa.EncryptPKCS1v15 шифрует переданное сообщение с использованием открытого ключа RSA и схемы заполнения PKCS#1 v1.5. Первым параметром функция принимает криптографически безопасный генератор случайных чисел (обычно rand.Reader), вторым параметром - открытый ключ типа *rsa.PublicKey, третьим - байтовый срез с данными для шифрования. Функция возвращает зашифрованный байтовый срез и ошибку, если шифрование не удалось.

Синтаксис

gociphertext, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, msg)

Пример

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

gopackage main

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

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

  // Сообщение для шифрования
  msg := []byte("hello world")

  // Шифруем сообщение
  ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, msg)
  if err != nil {
    panic(err)
  }

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

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

go"4c6f8a9b1e2d3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a"

Пример

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

gopackage main

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

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

  // Сообщение для шифрования
  msg := []byte("secret data")

  // Шифруем сообщение
  ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, msg)
  if err != nil {
    panic(err)
  }

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

  fmt.Printf("Decrypted: %s", decrypted)
}

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

go"Decrypted: secret data"

Пример

Обработка ошибки при попытке зашифровать слишком длинное сообщение (максимальная длина зависит от размера ключа):

gopackage main

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

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

  // Создаем слишком длинное сообщение
  msg := make([]byte, 300)

  // Пытаемся зашифровать
  _, err = rsa.EncryptPKCS1v15(rand.Reader, publicKey, msg)
  if err != nil {
    fmt.Println(err)
  }
}

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

go"crypto/rsa: message too long for RSA key size"

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

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