Мой ответ, приведенный ниже, является довольно длинным, но, надеюсь, он содержит некоторые детали, которые отсутствуют в предыдущих ответах.Я начну с некоторых связанных утверждений и, наконец, отвечу на первоначальный вопрос.
Чтобы зашифровать что-либо с помощью алгоритма RSA, вам нужна пара модулей (n, e) модуля и шифрования (общедоступная).Это твой открытый ключ.Чтобы расшифровать что-либо с помощью алгоритма RSA, вам нужна пара модулей экспонент (n, d) для модуля и дешифрования (приватная).Это ваш личный ключ.
Чтобы зашифровать что-либо с помощью открытого ключа RSA, вы рассматриваете свой открытый текст как число и возводите его в степень модуля e 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 компонентов, но это можно сделать быстрее, если они у вас под рукой.Алгоритм ускорения основан на китайской теореме об остатках .
Да, закрытый ключ RSA private.pem на самом деле содержит все эти 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) в отдельный файл, который становится вашим открытым ключом.