Функция rsa.EncryptOAEP
Функция rsa.EncryptOAEP выполняет шифрование сообщения с использованием открытого ключа RSA и схемы дополнения OAEP (Optimal Asymmetric Encryption Padding). В первый параметр функция принимает хеш-функцию, которая используется для вычисления дайджеста в схеме OAEP. Вторым параметром передается криптографически стойкий генератор случайных чисел. Третий параметр - это открытый ключ RSA, используемый для шифрования. Четвертый параметр - само сообщение, которое нужно зашифровать, в виде среза байтов. Пятый параметр - это необязательная метка, которая также участвует в процессе шифрования (может быть пустой строкой). Функция возвращает зашифрованные данные в виде среза байтов и ошибку, если шифрование не удалось.
Синтаксис
rsa.EncryptOAEP(hash hash.Hash, random io.Reader, pub *rsa.PublicKey, msg []byte, label []byte) ([]byte, error)
Пример
Давайте сгенерируем пару RSA-ключей и зашифруем сообщение "Hello, World!" с помощью открытого ключа:
package 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)
}
Результат выполнения кода:
"ciphertext in hexadecimal format"
Пример с использованием метки
Рассмотрим пример шифрования с использованием дополнительной метки, которая также используется в процессе шифрования:
package 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))
}
Результат выполнения кода:
"Encrypted message length: 256 bytes"
Пример с шифрованием и расшифровкой
Давайте продемонстрируем полный цикл шифрования и расшифровки данных с использованием функций rsa.EncryptOAEP и rsa.DecryptOAEP:
package 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))
}
Результат выполнения кода:
"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,
которая генерирует криптографически стойкое случайное число