Функция rsa.DecryptOAEP
Функция rsa.DecryptOAEP выполняет расшифровку данных,
которые были зашифрованы с использованием алгоритма RSA
и схемы дополнения OAEP. В первый параметр передается хеш-функция,
которая используется для вычисления хешей в рамках схемы OAEP.
Во второй параметр передается источник случайных данных
(обычно rand.Reader). В третий параметр передается
приватный ключ для расшифровки. В четвертый параметр
передаются зашифрованные данные. В пятый параметр
передается метка (label), которая использовалась при шифровании
(может быть пустой строкой).
Синтаксис
rsa.DecryptOAEP(hash hash.Hash, random io.Reader, priv *rsa.PrivateKey, ciphertext []byte, label []byte) ([]byte, error)
Базовый пример расшифровки
Давайте расшифруем данные, которые были зашифрованы с помощью
функции rsa.EncryptOAEP:
package 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))
}
Результат выполнения кода:
"secret message"
Пример с использованием метки
Давайте используем метку при шифровании и расшифровке данных:
package 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))
}
Результат выполнения кода:
"confidential data"
Обработка ошибки при неверной метке
При расшифровке данных с неверной меткой возникает ошибка:
package 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))
}
Результат выполнения кода:
"Error: crypto/rsa: decryption error"
Расшифровка с использованием различных хешей
Функция rsa.DecryptOAEP может использовать разные хеши,
например sha512.New:
package 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))
}
Результат выполнения кода:
"secure data with SHA512"
Смотрите также
-
функцию
rsa.EncryptOAEP,
которая выполняет шифрование по схеме OAEP -
функцию
rsa.DecryptPKCS1v15,
которая расшифровывает данные по схеме PKCS1v15 -
функцию
rsa.GenerateKey,
которая генерирует пару RSA-ключей -
функцию
rand.Read,
которая заполняет слайс криптостойкими случайными данными