Моя відповідь нижче трохи тривала, але, сподіваємось, вона містить деякі деталі, яких не вистачає в попередніх відповідях. Почну з деяких пов’язаних тверджень і, нарешті, відповім на початкове запитання.
Щоб зашифрувати щось за допомогою алгоритму RSA, вам потрібні параметри модуля та шифрування (public) (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
Для розсічення вмісту приватного ключа 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.
Щоб побачити вміст загальнодоступного ключа RS.pem RSA, виконайте наступне (висновок, урізаний тут у мітки):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Тут немає сюрпризів. Це просто (п, е) пара, як і обіцяли.
Тепер, нарешті, відповідь на початкове запитання: Як було показано вище, приватний ключ RSA, згенерований за допомогою openssl, містить компоненти як відкритих, так і приватних ключів та деякі інші. Коли ви генеруєте / витягуєте / отримуєте відкритий ключ із приватного ключа, openssl копіює два з цих компонентів (e, n) в окремий файл, який стає вашим відкритим ключем.