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


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

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

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

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

8 311

8 ответов:

openssl genrsa -out mykey.pem 1024

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

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

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

изменить: проверьте раздел ПРИМЕРЫ здесь. Чтобы просто вывести открытую часть закрытого ключа:

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

люди ищут открытый ключ 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 к stdout.

в большинстве программ, которые генерируют закрытые ключи 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.

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

openssl rsa-text-in mykey.Пем

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 тут

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

чтобы зашифровать что-то с помощью алгоритма RSA, вам нужны модуль и пара экспонент шифрования (public) (n, e). Это ваш открытый ключ. Чтобы расшифровать что-то с помощью алгоритма RSA, вам нужна пара модуля и дешифровки (частная) экспонента (n, d). Это ваш личный ключ.

To зашифруйте что-то с помощью открытого ключа 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

чтобы проанализировать содержимое частного.ключ PEM private RSA, созданный командой 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 может быть сгенерирован/извлечен/получен из частного.PEM закрытый ключ RSA. Остальные 5 компонентов для ускорения процесса расшифровки. Оно оказывается, что путем предварительного вычисления и хранения этих 5 значений можно ускорить расшифровку RSA в 4 раза. Расшифровка будет работать без этих 5 компонентов, но это может быть сделано быстрее, если иметь их под рукой. Алгоритм ускорения основан на Китайская Теорема Остатка.

да, частная.закрытый ключ 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 и П2.2 предложить дальнейшие изменения в альтернативном представлении, опционально включив больше связанных с ЭЛТ комплектующие.

чтобы увидеть содержание общественности.PEM public RSA key выполните следующее (выходные данные усечены до меток здесь):

openssl rsa -in public.pem -text -pubin -noout

Modulus             - n
Exponent (public)   - e

здесь нет никаких сюрпризов. Это просто (n, e) пара, как и было обещано.

теперь, наконец, отвечая на первоначальный вопрос: как было показано выше, закрытый ключ RSA, созданный с помощью openssl, содержит компоненты как открытых, так и закрытых ключей и некоторые другие. Когда вы создаете/извлекаете/производите открытый ключ из закрытого ключа, openssl копирует два из них компоненты (e, n) в отдельный файл, который становится вашим открытым ключом.

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

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

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

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

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

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

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

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

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

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.