Как использовать OpenSSL для шифрования / дешифрования файлов?
Я хочу зашифровать и расшифровать один файл, используя один пароль.
Как я могу использовать OpenSSL для этого?
7 ответов
Это лучший ответ на ваш вопрос от Google: http://tombuntu.com/index.php/2007/12/12/simple-file-encryption-with-openssl/
Шифрование:
openssl aes-256-cbc -a -salt -in secrets.txt -out secrets.txt.enc
Расшифровать:
openssl aes-256-cbc -d -a -in secrets.txt.enc -out secrets.txt.new
Но это вовсе не использует инфраструктуру открытых ключей, так что немного похоже на забивание гвоздя отверткой:-)
Короткий ответ:
Вы, вероятно, хотите использовать gpg
вместо openssl
так что смотрите "Дополнительные примечания" в конце этого ответа. Но чтобы ответить на вопрос, используя openssl
:
Зашифровать:
openssl enc -aes-256-cbc -in un_encrypted.data -out encrypted.data
Расшифровать:
openssl enc -d -aes-256-cbc -in encrypted.data -out un_encrypted.data
Примечание. Вам будет предложено ввести пароль при шифровании или дешифровании.
Длинный ответ:
Ваш лучший источник информации для openssl enc
вероятно будет: https://www.openssl.org/docs/apps/enc.html
Командная строка: openssl enc
принимает следующую форму:
openssl enc -ciphername [-in filename] [-out filename] [-pass arg]
[-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename]
[-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P]
[-bufsize number] [-nopad] [-debug] [-none] [-engine id]
Объяснение наиболее полезных параметров по вашему вопросу:
-e
Encrypt the input data: this is the default.
-d
Decrypt the input data.
-k <password>
Only use this if you want to pass the password as an argument.
Usually you can leave this out and you will be prompted for a
password. The password is used to derive the actual key which
is used to encrypt your data. Using this parameter is typically
not considered secure because your password appears in
plain-text on the command line and will likely be recorded in
bash history.
-kfile <filename>
Read the password from the first line of <filename> instead of
from the command line as above.
-a
base64 process the data. This means that if encryption is taking
place the data is base64 encoded after encryption. If decryption
is set then the input data is base64 decoded before being
decrypted.
You likely DON'T need to use this. This will likely increase the
file size for non-text data. Only use this if you need to send
data in the form of text format via email etc.
-salt
To use a salt (randomly generated) when encrypting. You always
want to use a salt while encrypting. This parameter is actually
redundant because a salt is used whether you use this or not
which is why it was not used in the "Short Answer" above!
-K key
The actual key to use: this must be represented as a string
comprised only of hex digits. If only the key is specified, the
IV must additionally be specified using the -iv option. When
both a key and a password are specified, the key given with the
-K option will be used and the IV generated from the password
will be taken. It probably does not make much sense to specify
both key and password.
-iv IV
The actual IV to use: this must be represented as a string
comprised only of hex digits. When only the key is specified
using the -K option, the IV must explicitly be defined. When a
password is being specified using one of the other options, the
IV is generated from this password.
Дополнительные примечания:
Хотя вы специально задали вопрос об OpenSSL, возможно, вы захотите использовать вместо этого GPG для целей шифрования на основе этой статьи. OpenSSL против GPG для шифрования резервных копий вне сайта?
Чтобы использовать GPG для того же, вы должны использовать следующие команды:
Зашифровать:
gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data
Расшифровать:
gpg --output un_encrypted.data --decrypt encrypted.data
Примечание. Вам будет предложено ввести пароль при шифровании или дешифровании.
Шифрование:
openssl enc -in infile.txt -out encrypted.dat -e -aes256 -k symmetrickey
Расшифровать:
openssl enc -in encrypted.dat -out outfile.txt -d -aes256 -k symmetrickey
Для получения дополнительной информации см. openssl(1)
Docs.
НЕ ИСПОЛЬЗУЙТЕ ОТКЛЮЧЕНИЕ КЛЮЧЕВЫХ КЛЮЧЕЙ ПО УМОЛЧАНИЮ OPENSSL.
В настоящее время принятый ответ использует его, и он больше не рекомендуется и не безопасен.
Злоумышленнику очень просто взломать ключ.
https://www.ietf.org/rfc/rfc2898.txt
PBKDF1 применяет хеш-функцию, которая должна быть MD2 [6], MD5 [19] или SHA-1 [18], для получения ключей. Длина полученного ключа ограничена длиной вывода хеш-функции, которая составляет 16 октетов для MD2 и MD5 и 20 октетов для SHA-1. PBKDF1 совместим с процессом получения ключей в PKCS #5 v1.5. PBKDF1 рекомендуется только для совместимости с существующими приложениями, поскольку производимые им ключи могут быть недостаточно большими для некоторых приложений.
PBKDF2 применяет псевдослучайную функцию (см. Пример приложения B.1) для получения ключей. Длина полученного ключа практически не ограничена. (Однако максимально эффективное пространство поиска для производного ключа может быть ограничено структурой базовой псевдослучайной функции. Дополнительное обсуждение см. В приложении B.1.) PBKDF2 рекомендуется для новых приложений.
Сделай это:
openssl enc -aes-256-cbc -pbkdf2 -iter 20000 -in hello -out hello.enc -k meow
openssl enc -d -aes-256-cbc -pbkdf2 -iter 20000 -in hello.enc -out hello.out
Примечание. Итерации при дешифровании должны быть такими же, как итерации при шифровании.
Количество итераций должно быть не менее 10000. Вот хороший ответ о количестве итераций: https://security.stackexchange.com/a/3993
Также... у нас достаточно людей, которые рекомендуют GPG. Прочитайте этот чертов вопрос.
Как упоминалось в других ответах, предыдущие версии openssl использовали функцию получения слабого ключа для получения ключа шифрования AES из пароля. Однако openssl v1.1.1 поддерживает более надежную функцию получения ключа, когда ключ получается из пароля с использованиемpbkdf2
со случайно сгенерированной солью и несколькими итерациями хеширования sha256 (по умолчанию 10000).
Чтобы зашифровать файл:
openssl aes-256-cbc -e -salt -pbkdf2 -iter 10000 -in plaintextfilename -out encryptedfilename
Чтобы расшифровать файл:
openssl aes-256-cbc -d -salt -pbkdf2 -iter 10000 -in encryptedfilename -out plaintextfilename
Зашифровать:
$ openssl bf < arquivo.txt > arquivo.txt.bf
Расшифровать:
$ openssl bf -d < arquivo.txt.bf > arquivo.txt
bf === Blowfish в режиме CBC
Обновление с использованием случайно сгенерированного открытого ключа.
Encypt:
openssl enc -aes-256-cbc -a -salt -in {raw data} -out {encrypted data} -pass file:{random key}
Расшифровать:
openssl enc -d -aes-256-cbc -in {ciphered data} -out {raw data}
У меня есть полный учебник по этому адресу в http://bigthinkingapplied.com/key-based-encryption-using-openssl/
Обратите внимание, что CLI OpenSSL использует слабый нестандартный алгоритм для преобразования ключевой фразы в ключ, и установка GPG приводит к добавлению различных файлов в ваш домашний каталог и запуску фонового процесса gpg-agent. Если вы хотите максимальной переносимости и контроля с помощью существующих инструментов, вы можете использовать PHP или Python для доступа к API более низкого уровня и напрямую передавать полный ключ AES и IV.
Пример вызова PHP через Bash:
IV='c2FtcGxlLWFlcy1pdjEyMw=='
KEY='Twsn8eh2w2HbVCF5zKArlY+Mv5ZwVyaGlk5QkeoSlmc='
INPUT=123456789023456
ENCRYPTED=$(php -r "print(openssl_encrypt('$INPUT','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$ENCRYPTED='$ENCRYPTED
DECRYPTED=$(php -r "print(openssl_decrypt('$ENCRYPTED','aes-256-ctr',base64_decode('$KEY'),OPENSSL_ZERO_PADDING,base64_decode('$IV')));")
echo '$DECRYPTED='$DECRYPTED
Это выводит:
$ENCRYPTED=nzRi252dayEsGXZOTPXW
$DECRYPTED=123456789023456
Вы также можете использовать PHP openssl_pbkdf2
функция для безопасного преобразования ключевой фразы в ключ.
В Интернете есть программа с открытым исходным кодом, которая использует openssl для шифрования и дешифрования файлов. Это делается с помощью одного пароля. Самое замечательное в этом скрипте с открытым исходным кодом заключается в том, что он удаляет исходный незашифрованный файл, уничтожая его. Но опасная вещь заключается в том, что после того, как исходный незашифрованный файл ушел, вы должны убедиться, что вы запомнили свой пароль, иначе они больше не смогут расшифровать ваш файл.
Вот ссылка это на github
https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py
Дополнительные комментарии к mti2935 хороший ответ.
Кажется, что чем выше итерация, тем лучше защита от грубой силы, и вам следует использовать высокую итерацию, поскольку вы можете позволить себе разумную производительность / ресурсы.
На моем старом Intel i3-7100 шифрование довольно большого файла 1,5 ГБ:
time openssl enc -aes256 -e -pbkdf2 -iter 10000 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
Seconds: 2,564s
time openssl enc -aes256 -e -pbkdf2 -iter 262144 -pass pass:"mypassword" -in "InputFile" -out "OutputFile"
Seconds: 2,775s
На самом деле никакой разницы, хотя использование памяти не проверял (?)
Я думаю, что с сегодняшними графическими процессорами и даже более быстрыми в будущем миллиард итераций грубой силы кажутся возможными каждую секунду.
12 лет назад aNVIDIA GeForce 8800 Ultra
может повторять более 200000 миллионов итераций в секунду (хотя хеширование MD5)
источник: https://courses.csail.mit.edu/6.857/2018/project/Ainane-Barrett-Johnson-Vivar-OpenSSL.pdf