Тип rsa.PrivateKey

Тип rsa.PrivateKey представляет собой структуру, которая хранит закрытый ключ для алгоритма RSA. Он содержит как сам закрытый ключ, так и соответствующий ему открытый ключ (в поле PublicKey). Структура используется для операций расшифровки данных, которые были зашифрованы с помощью открытого ключа, а также для создания цифровых подписей. В первом параметре мы передаем указатель на структуру, во второй параметр мы передаем данные для расшифровки или подписи.

Синтаксис

gotype PrivateKey struct {
  PublicKey      // встроенная структура с открытым ключом
  D     *big.Int   // закрытая экспонента
  Primes  []*big.Int // простые числа, использованные при генерации
  Precomputed struct {
    Dp, Dq *big.Int
    Qinv   *big.Int
    // CRTValues для оптимизации
  }
}

Основные поля структуры rsa.PrivateKey:

Пример с генерацией ключа

Для создания нового закрытого ключа используется функция rsa.GenerateKey. Давайте сгенерируем ключ длиной 2048 бит и выведем его публичную часть:

gopackage 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)
}

Результат выполнения кода (значения будут уникальными):

go"N: b3a4d5f6..."
"E: 65537"
"D: c1e2f3a4..."

Пример расшифровки данных

Давайте расшифруем данные, которые были зашифрованы с помощью открытого ключа. Для расшифровки используем функцию rsa.DecryptPKCS1v15:

gopackage 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))
}

Результат выполнения кода:

go"Hello, RSA!"

Пример создания цифровой подписи

Закрытый ключ используется для создания подписи. В этом примере мы подписываем сообщение с помощью функции rsa.SignPKCS1v15:

gopackage 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)
}

Результат выполнения кода (значение подписи будет уникальным):

go"Signature: a1b2c3d4e5f6..."

Смотрите также

  • функцию rsa.GenerateKey,
    которая генерирует новую пару RSA-ключей
  • функцию rsa.DecryptOAEP,
    которая расшифровывает данные с использованием OAEP
  • функцию rsa.SignPKCS1v15,
    которая создает подпись PKCS1v15
  • функцию x509.ParsePKCS1PrivateKey,
    которая парсит ключ из байтового представления