Тип rsa.PrivateKey
Тип rsa.PrivateKey представляет собой структуру, которая хранит закрытый ключ для алгоритма RSA.
Он содержит как сам закрытый ключ, так и соответствующий ему открытый ключ (в поле PublicKey).
Структура используется для операций расшифровки данных, которые были зашифрованы с помощью открытого ключа,
а также для создания цифровых подписей. В первом параметре мы передаем указатель на структуру,
во второй параметр мы передаем данные для расшифровки или подписи.
Синтаксис
type PrivateKey struct {
PublicKey // встроенная структура с открытым ключом
D *big.Int // закрытая экспонента
Primes []*big.Int // простые числа, использованные при генерации
Precomputed struct {
Dp, Dq *big.Int
Qinv *big.Int
// CRTValues для оптимизации
}
}
Основные поля структуры rsa.PrivateKey:
-
PublicKey- встроенная структура, содержащая открытый ключ (поляNиE). -
D- закрытая экспонента (тип*big.Int), используется для расшифровки. -
Primes- слайс простых чисел, использованных при генерации ключа.
Пример с генерацией ключа
Для создания нового закрытого ключа используется функция rsa.GenerateKey.
Давайте сгенерируем ключ длиной 2048 бит и выведем его публичную часть:
package main
import (
"crypto/rand"
"crypto/rsa"
"fmt"
)
func main() {
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
fmt.Println("Error generating key:", err)
return
}
fmt.Printf("N: %x\n", privateKey.N)
fmt.Printf("E: %d\n", privateKey.E)
fmt.Printf("D: %x\n", privateKey.D)
}
Результат выполнения кода (значения будут уникальными):
"N: b3a4d5f6..."
"E: 65537"
"D: c1e2f3a4..."
Пример расшифровки данных
Давайте расшифруем данные, которые были зашифрованы с помощью открытого ключа.
Для расшифровки используем функцию rsa.DecryptPKCS1v15:
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"fmt"
)
func main() {
// Генерируем ключи
privateKey, _ := rsa.GenerateKey(rand.Reader, 2048)
publicKey := &privateKey.PublicKey
// Шифруем данные открытым ключом
message := []byte("Hello, RSA!")
ciphertext, _ := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, message, nil)
// Расшифровываем закрытым ключом
plaintext, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, nil)
if err != nil {
fmt.Println("Decryption error:", err)
return
}
fmt.Println(string(plaintext))
}
Результат выполнения кода:
"Hello, RSA!"
Пример создания цифровой подписи
Закрытый ключ используется для создания подписи. В этом примере мы подписываем сообщение
с помощью функции rsa.SignPKCS1v15:
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"fmt"
)
func main() {
// Генерируем ключи
privateKey, _ := rsa.GenerateKey(rand.Reader, 2048)
// Создаем хеш сообщения
message := []byte("Important document")
hash := sha256.Sum256(message)
// Создаем подпись
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hash[:])
if err != nil {
fmt.Println("Sign error:", err)
return
}
fmt.Printf("Signature: %x\n", signature)
}
Результат выполнения кода (значение подписи будет уникальным):
"Signature: a1b2c3d4e5f6..."
Смотрите также
-
функцию
rsa.GenerateKey,
которая генерирует новую пару RSA-ключей -
функцию
rsa.DecryptOAEP,
которая расшифровывает данные с использованием OAEP -
функцию
rsa.SignPKCS1v15,
которая создает подпись PKCS1v15 -
функцию
x509.ParsePKCS1PrivateKey,
которая парсит ключ из байтового представления