OpenSSL поддерживает симметричное и ассиметричное шифрование данных (файлов и строк). Для симметричного шифрования и расшифровки достаточно указать пароль, для ассиметричное шифрования предварительно нужно сгенерировать приватный ключ и публичный ключ.
Для шифрования файлов вместо OpenSSL рекомендуется использовать инструмент gpg. С этим инструментом вы можете познакомиться в статье «Как пользоваться gpg: шифрование, расшифровка файлов и сообщений, подпись файлов и проверка подписи, управление ключами».
Симметричное шифрование файлов в OpenSSL
Данный вид шифрования выполняется командой enc. Кстати она также задействуется при создании ключей, если выбрано их шифрование — это шифрование выполняется с помощью enc.
Для шифрования используется команда следующего вида:
openssl enc -ШИФР -in ДЛЯ-ШИФРОВАНИЯ -out ЗАШИФРОВАНЫЕ-ДАННЫЕ
Для расшифровки похожая команда, но с опцией -d, также ЗАШИФРОВАНЫЕ-ДАННЫЕ теперь являются входными, а на выходе РАСШИФРОВАННЫЕ-ДАННЫЕ:
openssl enc -ШИФР -d -in ЗАШИФРОВАНЫЕ-ДАННЫЕ -out РАСШИФРОВАННЫЕ-ДАННЫЕ
В качестве ШИФРА рекомендуют aes-256-cbc, а полный список шифров вы можете посмотреть командой:
openssl enc -list
Ещё настоятельно рекомендуется использовать опцию -iter ЧИСЛО. Она использует указанное ЧИСЛО итераций для пароля при получении ключа шифрования. Высокие значения увеличивают время, необходимое для взлома пароля брут-форсом зашифрованного файла. Эта опция включает использование алгоритма PBKDF2 для получения ключа. Указывать можно большие значения — десятки и сотни тысяч.
Пример шифрования файла art.txt шифром aes-256-cbc, зашифрованные данные будут помещены в файл с именем art.txt.enc, при получении ключа шифрования используется десять миллионов итераций (на моём железе выполнение команды заняло несколько секунд):
openssl enc -aes-256-cbc -in art.txt -out art.txt.enc -iter 10000000
Введите, а затем подтвердите пароль для шифрования:
В результате будет создан зашифрованный файл art.txt.enc.
Для расшифровки файла art.txt.enc и сохранения данных в файл art-new.txt:
openssl enc -aes-256-cbc -d -in art.txt.enc -out art-new.txt -iter 10000000
Если файл успешно расшифрован, то не будет выведена никакая дополнительная информация.
В случае неудачной расшифровки будет показано примерно следующее:
bad decrypt 140381536523584:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto/evp/evp_enc.c:583:
Возможные причины ошибки:
- неверный пароль
- неверный алгоритм для расшифровки
- неправильно указано количество итераций с опцией -iter
- неверно указан файл для расшифровки
Обратите внимание, что для расшифровки также нужно указать опцию -iter с тем же самым значением, которое было указано при шифровании. Конечно, можно не использовать опцию -iter при шифровании (а, следовательно, и при расшифровке), но в этом случае шифрование считается ненадёжным! Не рекомендуется пропускать опцию. Если у вас слабое железо ИЛИ если файл будет расшифровываться на слабом железе, то вам необязательно использовать такие большие значения -iter — укажите хотя бы десятки или сотни тысяч (например, полмиллиона).
Предыдущие команды для шифрования и расшифровки могут запускаться чуть иначе:
openssl ШИФР
Например:
openssl aes-256-cbc -in art.txt -out art.txt.enc -iter 10000000
То есть пропускается слово enc, и перед шифром убирается дефис. Обе команды равнозначны.
Зашифрованный файл представляет собой бинарные данные, которые не получится передать, например, в текстовом сообщении (в чате). Используя опцию -a (или её псевдоним -base64), можно закодировать зашифрованные данные в кодировку Base64:
openssl enc -aes-256-cbc -in art.txt -out art.txt.b64 -iter 10000000 -a
Содержимое полученного файла art.txt.b64 можно открыть любым текстовым редактором и переслать в мессенджере или в чате.
Для расшифровки также нужно указать опцию -a:
openssl enc -aes-256-cbc -d -in art.txt.b64 -out art-new.txt -iter 10000000 -a
Чтобы просто закодировать бинарный файл в кодировку base64:
openssl enc -base64 -in file.bin -out file.b64
Чтобы раскодировать этот файл:
openssl enc -base64 -d -in file.b64 -out file.bin
Чтобы зашифровать файл используя указанный ПАРОЛЬ в команде (не интерактивный режим):
openssl enc -aes128 -pbkdf2 -d -in file.aes128 -out file.txt -pass pass:ПАРОЛЬ
Зашифровать файл, затем закодировать его с помощью base64 (например, его можно отправить по почте), используя AES-256 в режиме CTR и с получением производной ключа PBKDF2:
openssl enc -aes-256-ctr -pbkdf2 -a -in file.txt -out file.aes256
Декодировать файл из Base64 , затем расшифровывать его, используя пароль, указанный в файле:
openssl enc -aes-256-ctr -pbkdf2 -d -a -in file.aes256 -out file.txt -pass file:<ФАЙЛ-С-ПАРОЛЕМ>
Асимметричное шифрование файлов в OpenSSL
Необходимо сгенерировать приватный ключ и извлечь из него публичный ключ. Публичным ключом данные будут шифроваться, а приватным ключом — расшифровываться. Следующая команда генерирует приватный ключ, который будет сохранён в файл private.key:
openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:8192
Для извлечения публичного ключа в файл (public.key) из приватного ключа (private.key):
openssl rsa -in private.key -pubout -out public.key
Для шифрования файла:
openssl rsautl -encrypt -pubin -inkey ПУБЛИЧНЫЙ-КЛЮЧ.key -in ЗАШИФРОВАТЬ.txt -out ЗАШИФРОВАНО.txt
Для расшифровки:
openssl rsautl -decrypt -inkey ПРИВАТНЫЙ-КЛЮЧ.key -in ЗАШИФРОВАНО.txt -out РАСШИФРОВАНО.txt
Описанным методом невозможно зашифровать большие файлы!
Рассмотрим парочку способов обхода проблемы с невозможностью зашифровать большие файлы.
1. Ассиметричное шифрование для симметричного ключа
Сгенерируйте симметричный ключ, которым вы сможете зашифровывать большие файлы:
openssl rand -base64 32 > key.bin
Зашифруйте большие файлы используя симметричный ключ (как это показано в предыдущем разделе):
openssl enc -aes-256-cbc -in БОЛЬШОЙ-ФАЙЛ -out БОЛЬШОЙ-ФАЙЛ.enc -pass file:./key.bin
Зашифруйте симметричный ключ, чтобы его можно было безопасно отправить другому лицу:
openssl rsautl -encrypt -inkey public.pem -pubin -in key.bin -out key.bin.enc
Удаляем незашифрованный симметричный ключ, чтобы никто его не узнал:
shred -u key.bin
Теперь отправляем зашифрованный симметричный ключ (key.bin.enc) и зашифрованный большой файл (БОЛЬШОЙ-ФАЙЛ.enc) другому лицу.
Другое лицо может при получении расшифровать симметричный ключ используя свой приватный ключ:
openssl rsautl -decrypt -inkey private.pem -in key.bin.enc -out key.bin
Теперь он сможет использовать симметричный ключ для расшифровки файла:
openssl enc -d -aes-256-cbc -in БОЛЬШОЙ-ФАЙЛ.enc -out БОЛЬШОЙ-ФАЙЛ.enc -pass file:./key.bin
2. С помощью команды smime
Решение для безопасного и высокозащищенного кодирования любого файла в OpenSSL и командной строке:
Для шифрования файлов вы должны иметь готовый сертификат X.509 в формате PEM.
Сгененировать незашифрованный приватный ключ вместе с сертификатом можно следующей командой:
openssl req -x509 -nodes -days 100000 -newkey rsa:8192 -keyout private_key.pem -out certificate.pem
Сгененировать зашифрованный приватный ключ вместе с сертификатом можно следующей командой:
openssl req -x509 -days 100000 -newkey rsa:8192 -keyout private_key.pem -out certificate.pem
С уже существующим зашифрованным или незашифрованным приватным ключом сертификат можно создать следующей командой:
openssl req -x509 -new -days 100000 -key private_key.pem -out certificate.pem
Чтобы зашифровать файл выполните:
openssl smime -encrypt -binary -aes-256-cbc -in plainfile.zip -out encrypted.zip.enc -outform DER yourSslCertificate.pem
В этой команде:
- smime — ssl команда для S/MIME утилиты
- -encrypt — выбранным действием с файлом является шифрование
- -binary — использовать безопасный файловый процесс. Обычно входное сообщение преобразуется в «канонический» формат, как того требует спецификация S/MIME, этот переключатель отключает его. Это необходимо для всех двоичных файлов (например, изображений, звуков, ZIP-архивов).
- -aes-256-cbc — выбран шифр AES в 256 бит для шифрования (сильный). Если не указано, используется 40-битный RC2 (очень слабый).
- -in plainfile.zip — файл для шифрованиия
- -out encrypted.zip.enc — файл для сохранения зашифрованных данных
- -outform DER — закодировать выходной файл как двоичный файл. Если не указан, файл будет закодирован в base64, а размер файла будет увеличен на 30%.
- yourSslCertificate.pem — имя файла вашего сертификата. Он должен быть в формате PEM.
Эта команда может очень эффективно сильно шифровать большие файлы независимо от их формата.
Известная проблема: что-то не так происходит, при попытках зашифровать огромный файл (> 600 МБ). Ошибка не выводится, но зашифрованный файл будет повреждён. Всегда проверяйте каждый файл! (или используйте PGP — больше поддержки шифрования файлов с открытым ключом).
Расшифровка файла:
openssl smime -decrypt -binary -in encrypted.zip.enc -inform DER -out decrypted.zip -inkey private.key -passin pass:ВАШ-ПАРОЛЬ
В этой команде:
- -inform DER — то же самое, что и в -outform выше
- -inkey private.key — имя файла вашего приватного ключа. Он должен быть в формате PEM и может быть зашифрован паролем.
- -passin pass:ВАШ-ПАРОЛЬ — ваш пароль для зашифрованного приватного ключа.
Итак, при симметричном шифровании нужно выбрать хороший алгоритм шифроания и не забыть указать большое количество итераций. А для асимметричного шифрования имеются ограничения и костыли. По этой причине вновь рекомендуется использовать gpg: «Как пользоваться gpg: шифрование, расшифровка файлов и сообщений, подпись файлов и проверка подписи, управление ключами».
Для глубокого понимания OpenSSL смотрите также полное руководство: «OpenSSL: принципы работы, создание сертификатов, аудит».
Связанные статьи:
- Как шифровать строки в OpenSSL (100%)
- KeePass в Linux: как русифицировать и использовать, полезные плагины (53.5%)
- Как расшифровать NS3 пароли из конфигурационного файла ZyXEL (NDMS V2) (53.5%)
- Как удалить метаданные файла на Linux (50%)
- Bokken: проект с открытым исходным кодом для обратного инжиниринга (50%)
- Как проверить историю IP адресов для SSH сессий (RANDOM - 50%)