Использовать закрытый ключ RSA для генерации открытого ключа? - PullRequest
352 голосов
/ 09 марта 2011

Я не совсем понимаю это:

в соответствии с: http://www.madboa.com/geek/openssl/#key-rsa, Вы можете сгенерировать открытый ключ из личного ключа.

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub

Мой начальныйдумать было, что они создаются в паре вместе.Закрытый ключ RSA содержит сумму?или открытый ключ?

Ответы [ 8 ]

500 голосов
/ 09 марта 2011
openssl genrsa -out mykey.pem 1024

фактически создаст пару открытый - закрытый ключ. Пара сохраняется в сгенерированном файле mykey.pem.

openssl rsa -in mykey.pem -pubout > mykey.pub

извлечет открытый ключ и распечатает его. Здесь - ссылка на страницу, которая описывает это лучше.

РЕДАКТИРОВАТЬ: Проверьте раздел примеров здесь . Чтобы просто вывести открытую часть закрытого ключа:

openssl rsa -in key.pem -pubout -out pubkey.pem

Чтобы получить открытый ключ для использования в SSH, используйте ssh-keygen :

ssh-keygen -y -f key.pem > key.pub
262 голосов
/ 07 апреля 2013

Люди ищут открытый ключ SSH ...

Если вы хотите извлечь открытый ключ для использования с OpenSSH, вам нужно будет получить открытый ключ немного по-другому

$ ssh-keygen -y -f mykey.pem > mykey.pub

Этот формат открытого ключа совместим с OpenSSH.Прикрепите открытый ключ к remote:~/.ssh/authorized_keys, и вы сможете отправлять


документов из SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

-y Эта опция будет читать приватный файл формата OpenSSH и печатать открытый ключ OpenSSH на стандартный вывод.

65 голосов
/ 09 марта 2011

В большинстве программ, которые генерируют закрытые ключи RSA, включая openssl, закрытый ключ представляется как PKCS # 1 RSAPrivatekey или какой-либо его вариант:

A.1.2 Синтаксис закрытого ключа RSA

Закрытый ключ RSA должен быть представлен с типом ASN.1
RSAPrivateKey:

* * 1010

Как видите, этот формат имеет ряд полей, включая модуль и открытый показатель, и поэтому является строгим расширенным набором информации в открытом ключе RSA .

22 голосов
/ 04 июня 2017

Мой ответ, приведенный ниже, является довольно длинным, но, надеюсь, он содержит некоторые детали, которые отсутствуют в предыдущих ответах.Я начну с некоторых связанных утверждений и, наконец, отвечу на первоначальный вопрос.

Чтобы зашифровать что-либо с помощью алгоритма 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) в отдельный файл, который становится вашим открытым ключом.

21 голосов
/ 26 сентября 2014

Открытый ключ не хранится в файле PEM, как думают некоторые. В файле закрытого ключа присутствует следующая структура DER:

openssl rsa -text -in mykey.pem

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

Таким образом, имеется достаточно данных для вычисления открытого ключа (модуль и открытый показатель), что openssl rsa -in mykey.pem -pubout делает

8 голосов
/ 26 июня 2012

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

openssl rsa -in mykey.pem -pubout > mykey.pub

надеюсь, вы получите больше информации проверьте это

5 голосов
/ 11 мая 2018

Во-первых, быстрое резюме по генерации ключа RSA.

  1. Произвольно выберите два случайных вероятных простых числа соответствующего размера (p и q).
  2. Умножьте два простых числа вместе, чтобы получитьмодуль (n).
  3. Выберите открытый показатель (e).
  4. Сделайте некоторую математику с простыми числами и открытым показателем для получения частного показателя (d).

Открытый ключ состоит из модуля и открытого показателя.

Минимальный закрытый ключ состоит из модуля и частного показателя.Не существует надежного в вычислительном отношении способа безошибочного перехода от известного модуля и частного показателя к соответствующему общему показателю.

Однако:

  1. Практические форматы закрытого ключа почти всегда хранят больше n ид.
  2. e обычно не выбирается случайным образом, используется одно из нескольких известных значений.Если e является одним из общеизвестных значений и вы знаете d, тогда было бы легко определить e методом проб и ошибок.

Таким образом, в большинстве практических реализаций RSA вы можете получить открытый ключ из закрытого ключа.Можно было бы построить криптосистему на основе RSA, где это было бы невозможно, но это не готово.

0 голосов
/ 06 сентября 2016
Use the following commands:

1. openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mycert.pem -out mycert.pem

Loading 'screen' into random state - done
Generating a 2048 bit RSA private key
.............+++
..................................................................................................................................................................+++
writing new private key to 'mycert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

2. If you check there will be a file created by the name : mycert.pem

3. openssl rsa -in mycert.pem -pubout > mykey.txt
writing RSA key

4. If you check the same file location a new public key : mykey.txt will be created.
...