У мене є відкритий ключ Аліси. Я хочу надіслати Алісі зашифроване повідомлення RSA. Як я можу це зробити за допомогою openssl
команди?
Повідомлення:
Привіт Алісе! Будь ласка, принесіть на вечерю malacpörkölt!
У мене є відкритий ключ Аліси. Я хочу надіслати Алісі зашифроване повідомлення RSA. Як я можу це зробити за допомогою openssl
команди?
Повідомлення:
Привіт Алісе! Будь ласка, принесіть на вечерю malacpörkölt!
Відповіді:
У посібнику по Opensl ( openssl
man page) знайдіть RSA
, і ви побачите, що команда для шифрування RSA є rsautl
. Потім прочитайте сторінку rsautl
man, щоб побачити її синтаксис.
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
?