Как зашифровать файлы в OpenSSL
OpenSSL поддерживает симметричное и ассиметричное шифрование данных (файлов и строк). Для симметричного шифрования и расшифровки достаточно указать пароль, для ассиметричное шифрования предварительно нужно сгенерировать приватный ключ и публичный ключ.
Для шифрования файлов вместо OpenSSL рекомендуется использовать инструмент gpg. С этим инструментом вы можете познакомиться в статье «Как пользоваться gpg: шифрование, расшифровка файлов и сообщений, подпись файлов и проверка подписи, управление ключами».
Симметричное шифрование файлов в OpenSSL
Данный вид шифрования выполняется командой enc. Кстати она также задействуется при создании ключей, если выбрано их шифрование — это шифрование выполняется с помощью enc.
Для шифрования используется команда следующего вида:
Для расшифровки похожая команда, но с опцией -d, также ЗАШИФРОВАНЫЕ-ДАННЫЕ теперь являются входными, а на выходе РАСШИФРОВАННЫЕ-ДАННЫЕ:
В качестве ШИФРА рекомендуют aes-256-cbc, а полный список шифров вы можете посмотреть командой:
Ещё настоятельно рекомендуется использовать опцию -iter ЧИСЛО. Она использует указанное ЧИСЛО итераций для пароля при получении ключа шифрования. Высокие значения увеличивают время, необходимое для взлома пароля брут-форсом зашифрованного файла. Эта опция включает использование алгоритма PBKDF2 для получения ключа. Указывать можно большие значения — десятки и сотни тысяч.
Пример шифрования файла art.txt шифром aes-256-cbc, зашифрованные данные будут помещены в файл с именем art.txt.enc, при получении ключа шифрования используется десять миллионов итераций (на моём железе выполнение команды заняло несколько секунд):
Введите, а затем подтвердите пароль для шифрования:
В результате будет создан зашифрованный файл art.txt.enc.
Для расшифровки файла art.txt.enc и сохранения данных в файл art-new.txt:
Если файл успешно расшифрован, то не будет выведена никакая дополнительная информация.
В случае неудачной расшифровки будет показано примерно следующее:
Возможные причины ошибки:
- неверный пароль
- неверный алгоритм для расшифровки
- неправильно указано количество итераций с опцией -iter
- неверно указан файл для расшифровки
Обратите внимание, что для расшифровки также нужно указать опцию -iter с тем же самым значением, которое было указано при шифровании. Конечно, можно не использовать опцию -iter при шифровании (а, следовательно, и при расшифровке), но в этом случае шифрование считается ненадёжным! Не рекомендуется пропускать опцию. Если у вас слабое железо ИЛИ если файл будет расшифровываться на слабом железе, то вам необязательно использовать такие большие значения -iter — укажите хотя бы десятки или сотни тысяч (например, полмиллиона).
Предыдущие команды для шифрования и расшифровки могут запускаться чуть иначе:
То есть пропускается слово enc, и перед шифром убирается дефис. Обе команды равнозначны.
Зашифрованный файл представляет собой бинарные данные, которые не получится передать, например, в текстовом сообщении (в чате). Используя опцию -a (или её псевдоним -base64), можно закодировать зашифрованные данные в кодировку Base64:
Содержимое полученного файла art.txt.b64 можно открыть любым текстовым редактором и переслать в мессенджере или в чате.
Для расшифровки также нужно указать опцию -a:
Чтобы просто закодировать бинарный файл в кодировку base64:
Чтобы раскодировать этот файл:
Чтобы зашифровать файл используя указанный ПАРОЛЬ в команде (не интерактивный режим):
Зашифровать файл, затем закодировать его с помощью base64 (например, его можно отправить по почте), используя AES-256 в режиме CTR и с получением производной ключа PBKDF2:
Декодировать файл из Base64 , затем расшифровывать его, используя пароль, указанный в файле:
Асимметричное шифрование файлов в OpenSSL
Необходимо сгенерировать приватный ключ и извлечь из него публичный ключ. Публичным ключом данные будут шифроваться, а приватным ключом — расшифровываться. Следующая команда генерирует приватный ключ, который будет сохранён в файл private.key:
Для извлечения публичного ключа в файл (public.key) из приватного ключа (private.key):
Для шифрования файла:
Описанным методом невозможно зашифровать большие файлы!
Рассмотрим парочку способов обхода проблемы с невозможностью зашифровать большие файлы.
1. Ассиметричное шифрование для симметричного ключа
Сгенерируйте симметричный ключ, которым вы сможете зашифровывать большие файлы:
Зашифруйте большие файлы используя симметричный ключ (как это показано в предыдущем разделе):
Зашифруйте симметричный ключ, чтобы его можно было безопасно отправить другому лицу:
Удаляем незашифрованный симметричный ключ, чтобы никто его не узнал:
Теперь отправляем зашифрованный симметричный ключ (key.bin.enc) и зашифрованный большой файл (БОЛЬШОЙ-ФАЙЛ.enc) другому лицу.
Другое лицо может при получении расшифровать симметричный ключ используя свой приватный ключ:
Теперь он сможет использовать симметричный ключ для расшифровки файла:
2. С помощью команды smime
Решение для безопасного и высокозащищенного кодирования любого файла в OpenSSL и командной строке:
Для шифрования файлов вы должны иметь готовый сертификат X.509 в формате 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 — больше поддержки шифрования файлов с открытым ключом).
- -inform DER — то же самое, что и в -outform выше
- -inkey private.key — имя файла вашего приватного ключа. Он должен быть в формате PEM и может быть зашифрован паролем.
- -passin pass:ВАШ-ПАРОЛЬ — ваш пароль для зашифрованного приватного ключа.
Итак, при симметричном шифровании нужно выбрать хороший алгоритм шифроания и не забыть указать большое количество итераций. А для асимметричного шифрования имеются ограничения и костыли. По этой причине вновь рекомендуется использовать gpg: «Как пользоваться gpg: шифрование, расшифровка файлов и сообщений, подпись файлов и проверка подписи, управление ключами».
Для глубокого понимания OpenSSL смотрите также полное руководство: «OpenSSL: принципы работы, создание сертификатов, аудит».
TLS Cipher Suites in Windows 7
Cipher suites can only be negotiated for TLS versions which support them. The highest supported TLS version is always preferred in the TLS handshake. For example, SSL_CK_RC4_128_WITH_MD5 can only be used when both the client and server do not support TLS 1.2, 1.1 & 1.0 or SSL 3.0 since it is only supported with SSL 2.0.
Availability of cipher suites should be controlled in one of two ways:
- Default priority order is overridden when a priority list is configured. Cipher suites not in the priority list will not be used.
- Allowed when application passes SCH_USE_STRONG_CRYPTO: The Microsoft Schannel provider will filter out known weak cipher suites when the application uses the SCH_USE_STRONG_CRYPTO flag. In WindowsВ 7, RC4 cipher suites are filtered out.
HTTP/2 web services fail with non-HTTP/2-compatible cipher suites. To ensure your web services function with HTTP/2 clients and browsers, see How to deploy custom cipher suite ordering.
FIPS-compliance has become more complex with the addition of elliptic curves making the FIPS mode enabled column in previous versions of this table misleading. For example, a cipher suite such as TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 is only FIPS-compliant when using NIST elliptic curves. To find out which combinations of elliptic curves and cipher suites will be enabled in FIPS mode, see section 3.3.1 of Guidelines for the Selection, Configuration, and Use of TLS Implementations.
WindowsВ 7, WindowsВ 8, and Windows ServerВ 2012 are updated by the Windows Update by the 3042058 update which changes the priority order. See Microsoft Security Advisory 3042058 for more information. The following cipher suites are enabled and in this priority order by default by the Microsoft Schannel Provider:
Cipher suite string | Allowed by SCH_USE_STRONG_CRYPTO | TLS/SSL Protocol versions |
---|---|---|
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256 | Yes | TLS 1.2 |
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384 | Yes | TLS 1.2 |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256 | Yes | TLS 1.2 |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384 | Yes | TLS 1.2 |
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 | Yes | TLS 1.2 |
TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 | Yes | TLS 1.2 |
TLS_DHE_RSA_WITH_AES_256_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_DHE_RSA_WITH_AES_128_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_RSA_WITH_AES_256_GCM_SHA384 | Yes | TLS 1.2 |
TLS_RSA_WITH_AES_128_GCM_SHA256 | Yes | TLS 1.2 |
TLS_RSA_WITH_AES_256_CBC_SHA256 | Yes | TLS 1.2 |
TLS_RSA_WITH_AES_128_CBC_SHA256 | Yes | TLS 1.2 |
TLS_RSA_WITH_AES_256_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_RSA_WITH_AES_128_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 | Yes | TLS 1.2 |
TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 | Yes | TLS 1.2 |
TLS_DHE_DSS_WITH_AES_256_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_DHE_DSS_WITH_AES_128_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_RSA_WITH_3DES_EDE_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
TLS_RSA_WITH_RC4_128_SHA | No | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
TLS_RSA_WITH_RC4_128_MD5 | No | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
TLS_RSA_WITH_NULL_SHA256 Only used when application explicitly requests. | Yes | TLS 1.2 |
TLS_RSA_WITH_NULL_SHA Only used when application explicitly requests. | Yes | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
SSL_CK_RC4_128_WITH_MD5 Only used when application explicitly requests. | No | SSL 2.0 |
SSL_CK_DES_192_EDE3_CBC_WITH_MD5 Only used when application explicitly requests. | Yes | SSL 2.0 |
The following cipher suites are supported by the Microsoft Schannel Provider, but not enabled by default:
Cipher suite string | Allowed by SCH_USE_STRONG_CRYPTO | TLS/SSL Protocol versions |
---|---|---|
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521 | Yes | TLS 1.2 |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521 | Yes | TLS 1.2 |
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521 | Yes | TLS 1.2 |
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521 | Yes | TLS 1.2, TLS 1.1, TLS 1.0 |
TLS_RSA_WITH_DES_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
TLS_RSA_EXPORT1024_WITH_RC4_56_SHA | No | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
TLS_RSA_EXPORT_WITH_RC4_40_MD5 | No | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
TLS_RSA_WITH_NULL_MD5 | Yes | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
TLS_DHE_DSS_WITH_DES_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA | Yes | TLS 1.2, TLS 1.1, TLS 1.0, SSL 3.0 |
SSL_CK_DES_64_CBC_WITH_MD5 | Yes | SSL 2.0 |
SSL_CK_RC4_128_EXPORT40_WITH_MD5 | No | SSL 2.0 |
To add cipher suites, use the group policy setting SSL Cipher Suite Order under Computer Configuration > Administrative Templates > Network > SSL Configuration Settings to configure a priority list for all cipher suites you want enabled.