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



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



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



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


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

8 ответов:

openssl genrsa -out mykey.pem 1024

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

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

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

EDIT: проверьте раздел примеров здесь. Чтобы просто вывести открытую часть закрытого ключа:

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.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

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

Чтобы зашифровать что-то с помощью алгоритма 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

Препарировать содержание частного.PEM private RSA key, генерируемый командой 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 (public exponent), так что открытый ключ 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 иv2.2 предлагают дальнейшие изменения альтернативного представления, необязательно включая больше компонентов, связанных с ЭЛТ.

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

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).

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

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

Однако:

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

Comments

    Ничего не найдено.