Использовать закрытый ключ RSA для генерации открытого ключа?
Я не очень понимаю это:
Согласно: http://www.madboa.com/geek/openssl/, Вы можете создать открытый ключ из закрытого ключа.
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
Сначала я думал, что они создаются в паре вместе. Закрытый ключ RSA содержит сумму? или открытый ключ?
10 ответов
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 открытый ключ...
Если вы хотите извлечь открытый ключ для использования с 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 на стандартный вывод.
В большинстве программ, которые генерируют закрытые ключи RSA, включая openssl, закрытый ключ представляется как объект RSAPrivatekey PKCS#1 или какой-либо его вариант:
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.
Мой ответ, приведенный ниже, является немного длинным, но, надеюсь, он содержит некоторые детали, которые отсутствуют в предыдущих ответах. Я начну с некоторых связанных утверждений и, наконец, отвечу на первоначальный вопрос.
Чтобы зашифровать что-либо с использованием алгоритма RSA, вам понадобится пара модулей экспоненты и модуля шифрования (общедоступная) (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
Чтобы проанализировать содержимое частного 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) в отдельный файл, который становится вашим открытым ключом.
Открытый ключ не хранится в файле 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, который является закрытым, но у него также есть пара открытых ключей, поэтому, чтобы получить ваш действительный открытый ключ, мы просто делаем это
openssl rsa -in mykey.pem -pubout > mykey.pub
надеюсь, вы получите его для получения дополнительной информации, проверьте это
Во-первых, быстрый обзор генерации ключей RSA.
- Случайно выберите два случайных вероятных простых числа подходящего размера (p и q).
- Умножьте два простых числа вместе, чтобы получить модуль (n).
- Выберите публичный показатель (е).
- Сделайте некоторую математику с простыми числами и открытым показателем, чтобы получить частный показатель (d).
Открытый ключ состоит из модуля и открытого показателя.
Минимальный закрытый ключ состоит из модуля и частного показателя. Не существует надежного в вычислительном отношении способа безошибочного перехода от известного модуля и частного показателя к соответствующему общему показателю.
Тем не мение:
- Практические форматы закрытых ключей почти всегда хранят больше n и d.
- Обычно он выбирается не случайно, используется одно из нескольких известных значений. Если e - одно из общеизвестных значений, и вы знаете d, тогда было бы легко определить e методом проб и ошибок.
Таким образом, в большинстве практических реализаций RSA вы можете получить открытый ключ из закрытого ключа. Можно было бы построить криптосистему на основе RSA, где это было бы невозможно, но это еще не сделано.
Файл под названием «закрытый ключ» включает гораздо больше информации, чем только закрытый ключ, он включает все данные (простые числа, модуль, экспоненты и т. Д.), Необходимые для генерации пары закрытый / открытый ключ.
И увидеть эту информацию очень легко:
openssl genrsa -out private.pem 1024 #generate private key file
openssl rsa -in private.pem -text #view info in the private key file
openssl rsa -in private.pem -pubout -out public.pem #extract public key to file
openssl rsa -in public.pem -pubin -text #view info in the public key file
Вы увидите, что этот файл закрытого ключа включает простые числа со всей другой информацией, в то время как открытый файл включает только модуль и открытый показатель степени.
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.
Кажется, это общая черта распространенной асимметричной криптографии; Генерация открытого / закрытого ключей включает в себя создание закрытого ключа, который содержит пару ключей:
openssl genrsa -out mykey.pem 1024
Затем опубликуйте открытый ключ:
openssl rsa -in mykey.pem -pubout > mykey.pub
или же
openssl rsa -in mykey.pem -pubout -out mykey.pub
Криптографические ключи DSA и EC имеют одинаковую функцию: например.
openssl genpkey -algorithm ed25519 -out pvt.pem
потом
openssl pkey -in pvt.pem -pubout > public.pem
или же
openssl ec -in ecprivkey.pem -pubout -out ecpubkey.pem
Открытый компонент участвует в дешифровании, и сохранение его в составе закрытого ключа ускоряет дешифрование; он может быть удален из закрытого ключа и вычислен при необходимости (для дешифрования) в качестве альтернативы или дополнения к шифрованию или защите закрытого ключа паролем / ключом / фразой. например.
openssl pkey -in key.pem -des3 -out keyout.pem
или же
openssl ec -aes-128-cbc -in pk8file.pem -out tradfile.pem
Вы можете заменить первый аргумент "aes-128-cbc" любым другим допустимым именем шифра openssl.