Использовать закрытый ключ RSA для генерации открытого ключа?

Я действительно не понимаю этого:

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

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

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

Ответ 1

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

Ответ 2

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

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

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

Этот формат открытого ключа совместим с OpenSSH. Добавьте открытый ключ к remote:~/.ssh/authorized_keys, и вам будет хорошо идти


docs из SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

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

Ответ 3

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

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

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

  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
  }

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

Ответ 4

Открытый ключ не сохраняется в файле 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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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.