it-swarm-ru.tech

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

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

Сообщение:

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

29
LanceBaynes

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

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, но не напрямую для шифрования сообщения).

37
Gilles 'SO- stop being evil'

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

25
penguin359

Обратите внимание, что ниже вы можете указать любой алгоритм, который вы хотите, будь то перечисленные или 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 или ваш Shell, чтобы перенаправить его в файл. Или, что еще сложнее, направить вывод напрямую в sendmail.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

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

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

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My signed reply' |\
 sendmail [email protected]

(из http://www.madboa.com/geek/openssl/ )

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

5
draeath