Як зашифрувати повідомлення / текст за допомогою RSA та OpenSSL?


29

У мене є відкритий ключ Аліси. Я хочу надіслати Алісі зашифроване повідомлення RSA. Як я можу це зробити за допомогою opensslкоманди?

Повідомлення:

Привіт Алісе! Будь ласка, принесіть на вечерю malacpörkölt!

Відповіді:


36

У посібнику по Opensl ( opensslman page) знайдіть RSA, і ви побачите, що команда для шифрування RSA є rsautl. Потім прочитайте сторінку rsautlman, щоб побачити її синтаксис.

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.