Как использовать OpenSSL для шифрования/дешифрования файлов?

Я хочу склеить и дешифровать один файл, используя один пароль.

Как я могу использовать OpenSSL для этого?

Ответ 1

Это главный ответ на ваш вопрос из 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

Но это вообще не использует инфраструктуру открытого ключа, поэтому немного похоже на удар в гвоздь с помощью отвертки: -)

Ответ 2

Краткий ответ:

Вероятно, вы хотите использовать 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 vs GPG для шифрования резервных копий за пределами сайта?

Чтобы использовать GPG для выполнения этого же действия, вы должны использовать следующие команды:

Зашифровать:

gpg --output encrypted.data --symmetric --cipher-algo AES256 un_encrypted.data

Чтобы расшифровать:

gpg --output un_encrypted.data --decrypt encrypted.data

Примечание. При шифровании или расшифровке вам будет предложено ввести пароль.

Ответ 3

Шифрование:

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).

Ответ 4

Зашифровать:

$ openssl bf < arquivo.txt > arquivo.txt.bf

Чтобы расшифровать:

$ openssl bf -d < arquivo.txt.bf > arquivo.txt

bf === Blowfish в режиме CBC

Ответ 5

Обновление с использованием открытого открытого ключа.

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/

Ответ 6

Обратите внимание, что 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 для надежного преобразования ключевой фразы в ключ.

Ответ 7

Существует программа с открытым исходным кодом, которую я нахожу в Интернете, она использует openssl для шифрования и дешифрования файлов. Он делает это с помощью одного пароля. Самое замечательное в этом open source script заключается в том, что он удаляет исходный незашифрованный файл путем измельчения файла. Но опасная вещь о том, как только исходный незашифрованный файл ушел, вы должны убедиться, что помните свой пароль, иначе они не будут другим способом расшифровать ваш файл.

Здесь ссылка на github

https://github.com/EgbieAnderson1/linux_file_encryptor/blob/master/file_encrypt.py

Ответ 8

НЕ ИСПОЛЬЗУЙТЕ ОТКЛЮЧЕНИЕ КЛЮЧЕВЫХ КЛЮЧЕВ.

В настоящее время принятый ответ использует его, и он больше не рекомендуется и не безопасен.

Злоумышленнику очень просто взломать ключ.

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