Мой ответ ниже немного длинен, но, надеюсь, он содержит некоторые детали, которые отсутствуют в предыдущих ответах. Я начну с некоторых связанных утверждений и, наконец, отвечу на первоначальный вопрос.
Чтобы зашифровать что-либо с помощью алгоритма RSA, вам понадобится пара модулей экспоненты и модуля шифрования (общедоступная) (n, e). Это твой открытый ключ. Чтобы расшифровать что-либо с помощью алгоритма RSA, вам нужна пара модулей экспонент (n, d) для модуля и дешифрования (приватная). Это твой закрытый ключ.
Чтобы зашифровать что-либо с помощью открытого ключа RSA, вы рассматриваете свой открытый текст как число и повышаете его до степени e modulus n:
ciphertext = ( plaintext^e ) mod n
Чтобы расшифровать что-либо с помощью закрытого ключа RSA, вы рассматриваете свой зашифрованный текст как число и повышаете его до степени d модуля n:
plaintext = ( ciphertext^d ) mod n
Чтобы сгенерировать закрытый (d, n) ключ с помощью openssl, вы можете использовать следующую команду:
openssl genrsa -out private.pem 1024
Чтобы сгенерировать открытый (e, n) ключ из закрытого ключа с помощью openssl, вы можете использовать следующую команду:
openssl rsa -in private.pem -out public.pem -pubout
Чтобы проанализировать содержимое частного RSA-ключа private.pem, сгенерированного вышеуказанной командой openssl, выполните следующее (выходные данные урезаны до меток здесь):
openssl rsa -in private.pem -text -noout | less
modulus - n
privateExponent - d
publicExponent - e
prime1 - p
prime2 - q
exponent1 - d mod (p-1)
exponent2 - d mod (q-1)
coefficient - (q^-1) mod p
Разве закрытый ключ не должен состоять только из (n, d) пары? Почему есть 6 дополнительных компонентов? Он содержит e (открытый показатель), так что открытый ключ RSA можно сгенерировать / извлечь / извлечь из частного ключа RSA private.pem. Остальные 5 компонентов предназначены для ускорения процесса расшифровки. Оказывается, что путем предварительного вычисления и сохранения этих 5 значений можно ускорить дешифрование RSA в 4 раза. Дешифрование будет работать без этих 5 компонентов, но это можно сделать быстрее, если они вам пригодятся. Алгоритм ускорения основан на китайской теореме об остатках .
Да, закрытый ключ private.pem RSA на самом деле содержит все эти 8 значений; ни один из них не генерируется на лету при запуске предыдущей команды. Попробуйте выполнить следующие команды и сравните вывод:
# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der
# Print private.der private key contents as binary stream
xxd -p private.der
# Now compare the output of the above command with output
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less
Эта структура закрытого ключа RSA рекомендуется PKCS # 1 v1.5 в качестве альтернативного ( второго ) представления. Стандарт PKCS # 1 v2.0 исключает показатели e и d из альтернативного представления. PKCS # 1 v2.1 и v2.2 предлагают дальнейшие изменения в альтернативном представлении путем необязательного включения большего количества компонентов, связанных с CRT.
Чтобы увидеть содержимое публичного RSA-ключа public.pem, выполните следующее (выходные данные обрезаны до меток здесь):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Здесь нет сюрпризов. Это просто (n, e) пара, как и обещано.
Теперь, наконец, отвечаем на первоначальный вопрос: как было показано выше, закрытый ключ RSA, сгенерированный с использованием openssl, содержит компоненты открытого и закрытого ключей и некоторые другие. Когда вы генерируете / извлекаете / извлекаете открытый ключ из закрытого ключа, openssl копирует два из этих компонентов (e, n) в отдельный файл, который становится вашим открытым ключом.