Функция rsa.DecryptPKCS1v15
Функция rsa.DecryptPKCS1v15 расшифровывает данные,
которые были зашифрованы с помощью RSA и схемы заполнения
PKCS#1 v1.5. В первый параметр функция принимает
источник случайных данных rand.Reader, во второй
параметр - приватный ключ *rsa.PrivateKey,
в третий параметр - зашифрованные данные в виде
среза байт []byte. Функция возвращает
расшифрованные данные в виде среза байт и ошибку,
если расшифровка не удалась.
Важно отметить, что данная функция не проверяет
целостность данных и уязвима к атакам на основе
оракула заполнения. Для новых проектов рекомендуется
использовать более безопасную схему OAEP
(функция rsa.DecryptOAEP).
Синтаксис
rsa.DecryptPKCS1v15(rand io.Reader, priv *rsa.PrivateKey, ciphertext []byte) ([]byte, error)
Пример
Давайте расшифруем сообщение, зашифрованное с помощью открытого ключа RSA:
package 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)
}
Результат выполнения кода:
"Original: hello world"
"Decrypted: hello world"
Пример
Давайте обработаем ситуацию, когда расшифровка не удалась из-за неправильного ключа:
package 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)
}
}
Результат выполнения кода:
"Error: crypto/rsa: decryption error"
Пример
Давайте расшифруем данные, используя приватный ключ, загруженный из переменной:
package 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 заданной длины