У меня есть открытый ключ Алисы. Я хочу отправить Алисе зашифрованное сообщение RSA. Как я могу сделать это с помощью openssl
команды?
Сообщение:
Привет Алиса! Пожалуйста, принесите малакпёркельт на ужин!
У меня есть открытый ключ Алисы. Я хочу отправить Алисе зашифрованное сообщение RSA. Как я могу сделать это с помощью openssl
команды?
Сообщение:
Привет Алиса! Пожалуйста, принесите малакпёркельт на ужин!
Ответы:
В руководстве openssl ( openssl
man-страница) найдите 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
командной строки представляет собой смесь различных команд. Некоторые из них, в основном те, которые манипулируют сертификатами, могут быть полезны, но их трудно использовать правильно, потому что их синтаксис и параметры причудливы. Некоторые вроде бы rsautl
хороши, но не предоставляют полезной функциональности, они просто предоставляют необработанные криптографические примитивы - например, шифрование RSA в значительной степени используется только для шифрования симметричного ключа для гибридного шифрования. Некоторые, например enc
, очень трудно использовать безопасно, и мир был бы лучше, если бы их не было.
Во-первых, если вы просто хотите хорошее шифрование, вы должны взглянуть на 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 который требует знания секретного ключа для генерации, обеспечивая тем самым аутентичность данных в дополнение к целостности.
Обратите внимание, что ниже вы можете указать любой алгоритм, который вы хотите, будь то перечисленные или 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/ )
(э-э ... все эти обратные слэши - это те, которые должны быть экранированы новыми строками. не уверен, что происходит, так как это хорошо отображается в моем окне редактирования здесь!
openssl enc
потому что enc
это только для симметричного шифрования. Да, варианты openssl не очень хорошо организованы. Асимметричные алгоритмы имеют свои собственные команды: rsa
/ dsa
/ dh
для манипулирования ключами, rsautl
/ dsautl
для шифрования / дешифрования / проверки / подписи и genrsa
/ gendsa
/ gendh
для генерации ключей.
openssl
?