Как зашифровать сообщения / текст с помощью RSA и OpenSSL?


29

У меня есть открытый ключ Алисы. Я хочу отправить Алисе зашифрованное сообщение RSA. Как я могу сделать это с помощью opensslкоманды?

Сообщение:

Привет Алиса! Пожалуйста, принесите малакпёркельт на ужин!

Ответы:


36

В руководстве openssl ( opensslman-страница) найдите RSAи вы увидите, что команда для шифрования RSA - это rsautl. Затем прочитайте rsautlсправочную страницу, чтобы увидеть ее синтаксис.

echo 'Hi Alice! Please bring malacpörkölt for dinner!' |
openssl rsautl -encrypt -pubin -inkey alice.pub >message.encrypted

Схема заполнения по умолчанию является оригинальной PKCS # 1 v1.5 (все еще используется во многих протоколах); openssl также поддерживает OAEP (сейчас рекомендуется) и необработанное шифрование (полезно только в особых случаях).

Обратите внимание, что использование openssl напрямую - это в основном упражнение. На практике вы используете такой инструмент, как gpg (который использует RSA, но не напрямую для шифрования сообщения).


В чем проблема с использованием openssl?
Братчли

2
@Bratchley Инструмент opensslкомандной строки представляет собой смесь различных команд. Некоторые из них, в основном те, которые манипулируют сертификатами, могут быть полезны, но их трудно использовать правильно, потому что их синтаксис и параметры причудливы. Некоторые вроде бы rsautlхороши, но не предоставляют полезной функциональности, они просто предоставляют необработанные криптографические примитивы - например, шифрование RSA в значительной степени используется только для шифрования симметричного ключа для гибридного шифрования. Некоторые, например enc, очень трудно использовать безопасно, и мир был бы лучше, если бы их не было.
Жиль "ТАК - перестань быть злым"

Отличный ответ. Я добавил отступ с этим флагом -OAEP. Затем при дешифровании укажите то же самое ... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet

24

Во-первых, если вы просто хотите хорошее шифрование, вы должны взглянуть на GnuPG . Но если вы экспериментируете и просто хотите узнать, как это работает, вам нужно понять, что такое RSA . RSA не предназначен для шифрования произвольной строки, это алгоритм, который шифрует целое число. В частности, целое число от 0 до n-1, где n - это значение модуля из открытого ключа. Когда вы говорите о ключе RSA, который имеет длину 1024 бита, это означает, что для сохранения модуля в двоичном виде требуется 1024 бита. Это одна из причин, RSA используется в сочетании с шифром с симметричным ключом, таким как DES или AES, Вы можете сгенерировать случайный 256-битный ключ для AES и зашифровать этот ключ с помощью 1024-битного открытого ключа RSA. Тогда любой, у кого есть доступ к закрытому ключу, может извлечь симметричный ключ и декодировать сообщение с помощью AES. Полный стандарт для RSA называется PKCS # 1

Кроме того, DES и AES являются блочными шифрами. Они только шифруют данные в блоке определенного размера. DES использует 64-битные блоки, а AES использует 128-битные блоки. Чтобы зашифровать больше, чем блок, вы должны использовать режим работы, такой как CBC или CTR. Эти режимы определяют, как шифровать поток битов с использованием шифра блочного режима.

Наконец, важно проверить данные, которые вы получаете. Хотя злоумышленник может не прочитать данные в пути, он может перебрасывать биты без обнаружения, если к потоку данных не применяется целостность или аутентичность. Злоумышленник может легко догадаться, что SSL-соединение с портом 443, вероятно, является запросом веб-страницы, начиная с него, GET /и он может слегка изменить его, PUT /не мешая остальной части шифрования. Простой подход к целостности заключается в добавлении суммы MD5 или SHA-1 в конце, но это обеспечивает только целостность данных, а не их подлинность. Любой, обладающий полным знанием потока данных, может сгенерировать правильную сумму, более безопасный подход заключается в использовании хеширования с ключами, такого как HMAC который требует знания секретного ключа для генерации, обеспечивая тем самым аутентичность данных в дополнение к целостности.


2
Это действительно хорошо
Mko

5

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

используйте "openssl enc -help", чтобы получить список поддерживаемых шифров в вашей системе и передать его в качестве аргумента. например, "-aes256"

Обратите внимание, в моей системе у меня нет RSA в моих опциях - по крайней мере, с таким именем.


Как зашифровать сообщение S / MIME?

Допустим, кто-то отправляет вам ее открытый сертификат и просит вас зашифровать ей какое-то сообщение. Вы сохранили ее сертификат как her-cert.pem. Вы сохранили свой ответ как my-message.txt.

Чтобы получить стандартное, хотя и довольно слабое, шифрование RC2-40, вы просто указываете openssl, где находится сообщение и сертификат.

openssl smime her-cert.pem -encrypt -in my-message.txt

Если вы уверены, что у вашего удаленного корреспондента есть надежный инструментарий SSL, вы можете указать более надежный алгоритм шифрования, например тройной DES:

openssl smime her-cert.pem -encrypt -des3 -in my-message.txt

По умолчанию зашифрованное сообщение, включая заголовки почты, отправляется на стандартный вывод. Используйте опцию -out или вашу оболочку, чтобы перенаправить ее в файл. Или, что еще сложнее, направить вывод напрямую в sendmail.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My encrypted reply' |\
 sendmail her@heraddress.com

Как мне подписать сообщение S / MIME?

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

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <you@youraddress.com>' \
   -to 'Her Fullname <her@heraddress.com>' \
   -subject 'My signed reply' |\
 sendmail her@heraddress.com

http://www.madboa.com/geek/openssl/ )

(э-э ... все эти обратные слэши - это те, которые должны быть экранированы новыми строками. не уверен, что происходит, так как это хорошо отображается в моем окне редактирования здесь!


1
Вам нужно поставить четыре пробела в начале каждой строки, чтобы сохранить новые строки. Я изменил первый блок, чтобы показать вам, как. Вы можете исправить второй?
Микель

1
Вы не нашли RSA, openssl encпотому что encэто только для симметричного шифрования. Да, варианты openssl не очень хорошо организованы. Асимметричные алгоритмы имеют свои собственные команды: rsa/ dsa/ dhдля манипулирования ключами, rsautl/ dsautlдля шифрования / дешифрования / проверки / подписи и genrsa/ gendsa/ gendhдля генерации ключей.
Жиль "ТАК - перестань быть злым"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.