РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1267 of 1593 menu

Тип 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,
    которая парсит ключ из байтового представления
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить