Функция rsa.EncryptPKCS1v15
Функция rsa.EncryptPKCS1v15 шифрует переданное сообщение с использованием открытого ключа RSA и схемы заполнения PKCS#1 v1.5. Первым параметром функция принимает криптографически безопасный генератор случайных чисел (обычно rand.Reader), вторым параметром - открытый ключ типа *rsa.PublicKey, третьим - байтовый срез с данными для шифрования. Функция возвращает зашифрованный байтовый срез и ошибку, если шифрование не удалось.
Синтаксис
ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, msg)
Пример
Давайте зашифруем сообщение "hello world" с использованием сгенерированного открытого ключа RSA:
package 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)
}
Результат выполнения кода (пример вывода):
"4c6f8a9b1e2d3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a"
Пример
Давайте зашифруем сообщение "secret data" и расшифруем его с помощью закрытого ключа:
package 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)
}
Результат выполнения кода:
"Decrypted: secret data"
Пример
Обработка ошибки при попытке зашифровать слишком длинное сообщение (максимальная длина зависит от размера ключа):
package 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)
}
}
Результат выполнения кода:
"crypto/rsa: message too long for RSA key size"
Смотрите также
-
функцию
rsa.DecryptPKCS1v15,
которая расшифровывает данные, зашифрованные с использованием PKCS#1 v1.5 -
функцию
rsa.EncryptOAEP,
которая шифрует данные с использованием более безопасной схемы OAEP -
функцию
rsa.GenerateKey,
которая генерирует пару открытого и закрытого ключей RSA -
функцию
crypto/rand.Read,
которая заполняет байтовый срез криптографически безопасными случайными числами