В чем разница между pubKey и PubKeyPEM?

#python #encryption

Вопрос:

Я изучаю алгоритм RSA шифрования и хочу использовать его в Python. Я использую pycryptodome пакет, и оттуда я вижу, что есть две переменные закрытых ключей.

В чем разница между pubKey и pubKeyPEM , и какие из них мне нужно использовать для части шифрования?

Кроме того, зачем Decryptor использовать оба ключа ( keyPair ) вместо закрытого ключа ( privKeyPEM ) ?

 from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

keyPair = RSA.generate(1024)

pubKey = keyPair.publickey()
pubKeyPEM = pubKey.exportKey()

privKeyPEM = keyPair.exportKey()

Encryptor = PKCS1_OAEP.new(pubKey)
Decryptor = PKCS1_OAEP.new(keyPair)
 

Ответ №1:

pubKey это просто представление ключа, используемого Python. Он состоит из двух целых чисел: модуля и публичного показателя. Конечно, это может быть, например, также ссылка на ключ в аппаратном устройстве, где это применимо.

pubKeyPEM это определенная кодировка открытого ключа в байтах или символах. Это SubjectPublicKeyInfo структура в соответствии со спецификациями API. SubjectPublicKeyInfo или SPKI-это двоичная структура, PEM-это броня ASCII вокруг нее, т. Е. Она определяет структуру, а затем кодирует двоичный файл с использованием базы 64. Он обычно используется, например, OpenSSL.

Для части шифрования, которая вам нужна pubKey . Но вы, вероятно, сначала должны передать pubKey их отправителю или, возможно, вам придется сохранить pubKey их в БД или файловой системе. Вот где появляется функциональность экспорта.

Закрытый ключ обычно содержит открытый ключ (как поле открытого показателя), или его легко вычислить по закрытому ключу (в случае ключа с эллиптической кривой). Так что вы можете с таким же успехом думать о закрытом ключе как о паре ключей. Это зависит от библиотеки, могут ли эти понятия использоваться взаимозаменяемо.

Комментарии:

1. PS обратите внимание, что функция экспорта принимает pkcs=1 в качестве параметра по умолчанию, а затем экспортирует идентификатор subjectPublicKey. Это немного иронично, поскольку PKCS#1 указывает другой формат открытого ключа с меньшим количеством информации; SPKI содержит открытый ключ в формате PKCS#1, но они не совместимы напрямую. Это ошибка в дизайне API, если вы спросите меня.