Openssl расшифровать файл. Шифруем файлы с помощью OpenSSL

Полно ситуаций когда нужно зашифровать определённый файл или папку. Например, если данные передаются по открытым каналам либо сохраняются на внешнем носителе. Многие (в том числе и я) используют truecrypt, однако основное предназначение этой программы - работа с зашифрованными разделами, поэтому она не очень хороша в этом случае.

Для подобных задач вполне подходит OpenSSL - надёжное кросплатформенное решение. OpenSSL поддерживает различные алгоритмы шифрования, плюс он по умолчанию установлен во многих операционных системах, а установка на остальные не составит труда.

Под хабракатом - основы использования симметричного и асимметричного шифрования в OpenSSL, а таке пара скриптов упрощающих асимметричное шифрование с одноразовым ключом.

Простейший способ защиты данных с помощью OpenSSL - симметричное шифрование. Следующие команды шифруют и расшифровывают файл documents.zip, используя алгоритм AES с длиной ключа 256 бит:

Openssl enc -aes-256-cbc -salt -in documents.zip -out documents.enc
openssl enc -d -aes-256-cbc -in documents.enc -out documents.zip

Проблема этих команд может заключаться в том что они требуют ввода пароля. Есть ситуации когда это нежелательно. Например, автоматическое резервное копирование/шифрование данных по расписанию, либо если данные шифруются одним человеком а расшифровываются другим.

Как раз для таких случаев было придумано шифрование с открытым ключом . В общем случае вам понадобится создать открытый и закрытый ключи. Первая команда сгенерирует закрытый ключ private.pem, вторая создаст открытый ключ public.pem:

Openssl genrsa -out private.pem -aes256 2048
openssl rsa -in private.pem -pubout -out public.pem

В результате вы получаете пару RSA ключей длиной 2048 бит. К сожалению, в системе RSA размер шифруемых данных ограничен размером ключа, поэтому зашифровать более 2Кб данных не получится. Есть способ обойти это - информация сначала шифруется симметричным алгоритмом (подобно использованному выше) с использованием одноразового ключа. Затем этот одноразовый ключ шифруется публичным ключом. При расшифровке одноразовый ключ расшифровывается закрытым. Подробнее об этом уже было очень хорошо написано в .

Автоматизировать шифрование поможет следующий скрипт, на выходе которого вы получите одноразовый ключ и данные (encrypt.sh) в зашифрованном виде:

FILENAME="$1"
PUBLICKEY="$2"
SESSIONKEY="$3"
RESULT="$4"

# Generate the random symmetric-key
PASSIZE=30
if [ -c /dev/urandom ] ; then
KEY=`head -c 30 /dev/urandom | openssl enc -base64`
else
KEY=`openssl rand -base64 30`
fi
export KEY

# Encrypt the symmetric key using the public key
openssl rsautl -encrypt -inkey "$PUBLICKEY" -out "$SESSIONKEY" -pubin < $KEY
EOF

# Encrypt the file
openssl enc -aes-256-cbc -pass env:KEY -in "$FILENAME" -out "$RESULT"

Следующая команда использует открытый ключ public.pem чтобы зашифровать файл documents.zip. Она сгенерирует зашифрованный одноразовый ключ session.key и зашифрованные данные documents.enc:

./encrypt.sh documents.zip public.pem session.key documents.enc

Скрипт для дешифрования (decrypt.sh):

PRIVATEKEY="$1"
SESSIONKEY="$2"
ENCRYPTED="$3"
DECRYPTED="$4"

# Decrypt the symmetric key using the private key
KEY=` openssl rsautl -decrypt -inkey "$PRIVATEKEY" -in "$SESSIONKEY" `
export KEY

# Decrypt the file
openssl enc -aes-256-cbc -d -pass env:KEY -in "$ENCRYPTED" -out "$DECRYPTED"

Команда для дешифрования использует закрытый ключ private.pem и одноразовый ключ session.key чтобы расшифровать файл documents.enc. Она сгенерирует файл documents.zip:

./decrypt.sh private.pem session.key documents.enc documents.zip

Как видите, шифрование с открытым ключом может быть почти таким же простым как и симметричное. Но есть ещё более простой путь. На написание этого поста меня побудил блог SbF₅ . Его автор (несомненно более искушённый в bash чем я) написал скрипт , который архивирует папку, шифрует её открытым ключом и генерирует другой скрипт, содержащий в себе всё необходимое: одноразовый ключ, данные и собственно команды для расшифровывания. Кроме того, скрипт может сгенерировать для вас пару RSA ключей:

./encrypt-file.sh -keys public.pem private.pem
./encrypt-file.sh folder public.pem > decrypt-folder.sh
chmod +x decrypt-folder.sh
./decrypt-folder.sh private.pem > folder.tar

В этом примере мы сначала сгенерировали пару ключей. После этого папка folder была зашифрована в скрипт decrypt-folder.sh а затем расшифрована в архив folder.tar. Возможный минус этого способа - то что данные в decrypt-folder.sh хранятся в формате BASE64, а следовательно их размер увеличивается.

UPD Перенесено в блог Информационная безопасность.

Как вы поняли из этих статей, не каждая программа которая обещает шифровать файлы обеспечивает безопасность информации. Как говорит Брюс Шнайер — «Криптография бывает двух типов: криптография, которая помешает читать ваши файлы вашей младшей сестре, и криптография, которая помешает читать ваши файлы дядям из правительства». OpenSSL очень популярная библиотека, которою для криптографии используют многие — как платные, так и бесплатные программы. В OpenSSL реализовано большое количество алгоритмов и режимов шифрования, что позволяет сделать выбор вам самим, а не разработчику программы.
Помимо самой библиотеки в пакет OpenSSL входит набор консольных утилит. В данной статье речь пойдёт о шифровании файлов симметричными алгоритмами.
Для шифрования файла с помощью OpenSSL надо воспользоваться командой openssl enc . Для этого доступен широкий выбор алгоритмов шифрования которые поддерживает OpenSSL — Blowfish , Camellia , DES , RC2 , RC4 , RC5 , IDEA , AES и другие. Помимо разнообразных алгоритмов также доступны разные режимы шифрования — ECB , CBC , CFB , OFB . Некоторые режимы шифрования можно использовать с разной разрядностью.
Для того что-бы просмотреть список опций команды openssl enc достаточно набрать:

$ openssl enc --help
options are
-in input file
-out output file
-pass pass phrase source
-e encrypt
-d decrypt
-a/-base64 base64 encode/decode, depending on encryption flag
-k passphrase is the next argument
-kfile passphrase is the first line of the file argument
-md the next argument is the md to use to create a key
from a passphrase. One of md2, md5, sha or sha1
-S salt in hex is the next argument
-K/-iv key/iv in hex is the next argument
- print the iv/key (then exit if -P)
-bufsize buffer size
-nopad disable standard block padding
-engine e use engine e, possibly a hardware device.
Cipher Types
-aes-128-cbc -aes-128-cfb -aes-128-cfb1
-aes-128-cfb8 -aes-128-ecb -aes-128-ofb
-aes-192-cbc -aes-192-cfb -aes-192-cfb1
-aes-192-cfb8 -aes-192-ecb -aes-192-ofb
-aes-256-cbc -aes-256-cfb -aes-256-cfb1
-aes-256-cfb8 -aes-256-ecb -aes-256-ofb
-aes128 -aes192 -aes256
-bf -bf-cbc -bf-cfb
-bf-ecb -bf-ofb -blowfish
-camellia-128-cbc -camellia-128-cfb -camellia-128-cfb1
-camellia-128-cfb8 -camellia-128-ecb -camellia-128-ofb
-camellia-192-cbc -camellia-192-cfb -camellia-192-cfb1
-camellia-192-cfb8 -camellia-192-ecb -camellia-192-ofb
-camellia-256-cbc -camellia-256-cfb -camellia-256-cfb1
-camellia-256-cfb8 -camellia-256-ecb -camellia-256-ofb
-camellia128 -camellia192 -camellia256
-cast -cast-cbc -cast5-cbc
-cast5-cfb -cast5-ecb -cast5-ofb
-des -des-cbc -des-cfb
-des-cfb1 -des-cfb8 -des-ecb
-des-ede -des-ede-cbc -des-ede-cfb
-des-ede-ofb -des-ede3 -des-ede3-cbc
-des-ede3-cfb -des-ede3-cfb1 -des-ede3-cfb8
-des-ede3-ofb -des-ofb -des3
-desx -desx-cbc -idea
-idea-cbc -idea-cfb -idea-ecb
-idea-ofb -rc2 -rc2-40-cbc
-rc2-64-cbc -rc2-cbc -rc2-cfb
-rc2-ecb -rc2-ofb -rc4
-rc4-40 -rc5 -rc5-cbc
-rc5-cfb -rc5-ecb -rc5-ofb
-seed -seed-cbc -seed-cfb
-seed-ecb -seed-ofb

После блока Cipher Types перечисляются доступные алгоритмы вместе с режимами. Шифрования по алгоритму DES представлено несколькими вариантами. Помимо стандартного DES есть ещё тройной 3DES (который тоже в нескольких вариантах) и DESX . Теперь давайте попробуем зашифровать что-то.

$ openssl enc -e -in infile.txt -out outfile.bf_cbc -bf-cbc

Эта команда зашифрует файл infile.txt по алгоритму blowfish в режиме CBC и запишет результат в файл outfile.bf_cbc . Перед тем как зашифровать будет запрошен ключ для шифрования. Для расшифровки этого файла надо воспользоваться такой командой:

$ openssl enc -d -in outfile.bf_cbc -out dec_file.txt -bf-cbc

На запрос ввода ключа надо ввести тот ключ, который был введён при шифровании.
Если вы хотите сжать данные, то делать это надо, по понятным причинам, перед шифрованием.
Теперь давайте разберёмся с опциями командной строки. Опция -e указывает на то, что файл необходимо шифровать (эта опция включена по умолчанию), а опция -d расшифровывать. Ключ для шифрования можно ввести при вызове openssl enc с помощью опции -k, или в файле с помощью опции -kfile.
С помощью опции -nosalt можно отключить использование salt при шифровании (не рекомендуется так как понижает защищённость шифра).
С помощью этой утилиты также можно выполнять преобразование в base64 и обратно, но это преобразование не есть шифрованием. Детальнее читайте на сайте проекта — http://www.openssl.org/docs/apps/enc.html . Если есть какие-то вопросы спрашивайте.

P.S. После того как зашифровали информацию, необходимо правильно удалить первоначальный файл что-бы не осталось никакой остаточной информации . Для этого можете воспользоваться какой-нибудь программой которая реализует метод Гутмана . Также если вы вводите пароль в командной строке убедитесь что он не сохранился в истории, а если он читается из файла тогда что он был полностью удалён.

Шифрование отдельного файла

# openssl aes-128-cbc -salt -in file -out file.aes # зашифровать файл # openssl aes-128-cbc -d -salt -in file.aes -out file # расшифровать файл Естественно файл может быть и архивом.

Архивирование и шифрование директории

# tar -cf - directory | openssl aes-128-cbc -salt -out directory.tar.aes # openssl aes-128-cbc -d -salt -in directory.tar.aes | tar -x -f -

То-же самое, только тип архива tar.gz

# tar -zcf - directory | openssl aes-128-cbc -salt -out directory.tar.gz.aes # заархивировать и зашифровать директории # openssl aes-128-cbc -d -salt -in directory.tar.gz.aes | tar -xz -f - # расшифровать директории и распаковать архив
  • Используйте -k mysecretpassword после aes-128-cbc , что-бы не спрашивался пароль, но имейте в виду, это очень не безопасно.
  • Используйте aes-256-cbc вместо aes-128-cbc для получения более устойчивого шифра, увеличивается потребление процессора.

GPG шифрование

Альтернатива PGP , распространяемая по лицензии GPL (GNU General Public License ). GnuPG очень известный способ шифрования и подписи электронных писем или других данных, кроме того gpg предоставляет расширенную систему управления ключами. В данных примерах рассматривается только шифрование файлов. Самым простым является симметричный шифр. В этом случае файл шифруется с помощью пароля, соответственно расшифровать его может тот, кто знает этот пароль, никаких ключей не требуется. GPG добавляет расширение "*.gpg" к имени зашифрованного файла. # gpg -c file # Зашифровать файл по паролю # gpg file.gpg # Расшифровать файл (-o другой файл)

Шифрование с использованием пары ключей

Для более полной информации смотрите GPG Quick Start , GPG/PGP Basics и gnupg documentation . Приватный ключ и публичный ключ, основа ассиметричной криптографии. О чем нужно помнить:
  • Ваш публичный ключ используется другими для шифрования файлов, которые, как получатель, можете расшифровать только вы (даже не тот, кто его шифровал).
  • Ваш приватный ключ зашифрован по паролю и используется для расшифровки файлов, зашифрованных Вашим публичным ключем. Приваиный ключ должен храниться в безопасном месте. Помните, если приватный ключ или пароль от него будут потеряны, вместе с ними пропадут и зашифрованные файлы.
  • Ключевой файл, может содержать несколько ключей.
Сперва нужно сгенерировать пару ключей. Значения по-умолчанию вполне подойдут, однако вам нужно будет ввести имя, адрес электронной почты и комментарий (не обязательно). Комментарий полезен при создании более одного ключа для данного имени/e-mail. Так-же вам нужно будет задать ключевую фразу (именно фразу а не слово). # gpg --gen-key # Это может занять некоторое время Ключи сохраняются в ~/.gnupg/ в и в C:/Documents and Settings/%USERNAME%/Application Data/gnupg/ . в Windows. ~/.gnupg/pubring.gpg # Содержит ваш публичный ключ а так-же импортируемые ключи ~/.gnupg/secring.gpg # Может содержать больше одного ключа Некоторые часто используемые опции:
  • -e Зашифровать данные
  • -d Расшифровать данные
  • -r ИМЯ зашифровать для получателя ИМЯ (или "полное имя" или "email@domain")
  • -a Создать "ascii armored" вывод ключа
  • -o Вывести в файл

Шифрование только для персонального использования

Не требует экспорта/импорта какого либо ключа, они у вас уже есть. # gpg -e -r "Your Name" file # Зашифровать с помощью публичного ключа # gpg -o file -d file.gpg # Расшифровать. Используется опция -o , иначе пойдкт в stdout

Шифрование - расшифровка с использованием ключей

Для начала вам нужно экспортировать ваш публичный ключ, что-бы им могли пользоваться для расшифровки данных. Так-же вы должны импортировать публичный ключ от Alice, что-бы шифровать файлы для нее. Ключи можно передать в обычном ascii файле. Например Alice экспортирует ключ, вы его импортируете себе, теперь вы можете шифровать для нее файлы и расшифровать их сможет только она. # gpg -a -o alicekey.asc --export "Alice" # Alice экспортирует ключ в ascii файл. # gpg --send-keys --keyserver subkeys.pgp.net KEYID # Alice кладет ключ на сервер. # gpg --import alicekey.asc # Вы импортируете ключ себе. # gpg --search-keys --keyserver subkeys.pgp.net "Alice" # Или забираете его на сервере. # gpg -e -r "Alice" file # Зашифровать файл для Alice. # gpg -d file.gpg -o file # Расшифровать файл, зашифрованный Alice для вас.

Управление ключами

# gpg --list-keys # Список публичных ключей с KEYIDS KEYID следует за "/" например для: pub 1024D/D12B77CE - KEYID это D12B77CE # gpg --gen-revoke "Your Name" # Сгенерировать CRL (certificate revocation list) # gpg --list-secret-keys # Список приватных ключей # gpg --delete-keys NAME # Удалмть публичный ключ с локальной "связки ключей" # gpg --delete-secret-key NAME # Удалить приватный ключ с локальной "связки ключей" # gpg --fingerprint KEYID # Показать отпечаток ключа # gpg --edit-key KEYID # Редактировать ключ (например подпись или добавить/удалить email)

Полно ситуаций когда нужно зашифровать определённый файл или папку. Например, если данные передаются по открытым каналам либо сохраняются на внешнем носителе. Многие (в том числе и я) используют truecrypt, однако основное предназначение этой программы - работа с зашифрованными разделами, поэтому она не очень хороша в этом случае.

Для подобных задач вполне подходит OpenSSL - надёжное кросплатформенное решение. OpenSSL поддерживает различные алгоритмы шифрования, плюс он по умолчанию установлен во многих операционных системах, а установка на остальные не составит труда.

Под хабракатом - основы использования симметричного и асимметричного шифрования в OpenSSL, а таке пара скриптов упрощающих асимметричное шифрование с одноразовым ключом.

Простейший способ защиты данных с помощью OpenSSL - симметричное шифрование. Следующие команды шифруют и расшифровывают файл documents.zip, используя алгоритм AES с длиной ключа 256 бит:

Openssl enc -aes-256-cbc -salt -in documents.zip -out documents.enc
openssl enc -d -aes-256-cbc -in documents.enc -out documents.zip

Проблема этих команд может заключаться в том что они требуют ввода пароля. Есть ситуации когда это нежелательно. Например, автоматическое резервное копирование/шифрование данных по расписанию, либо если данные шифруются одним человеком а расшифровываются другим.

Как раз для таких случаев было придумано шифрование с открытым ключом . В общем случае вам понадобится создать открытый и закрытый ключи. Первая команда сгенерирует закрытый ключ private.pem, вторая создаст открытый ключ public.pem:

Openssl genrsa -out private.pem -aes256 2048
openssl rsa -in private.pem -pubout -out public.pem

В результате вы получаете пару RSA ключей длиной 2048 бит. К сожалению, в системе RSA размер шифруемых данных ограничен размером ключа, поэтому зашифровать более 2Кб данных не получится. Есть способ обойти это - информация сначала шифруется симметричным алгоритмом (подобно использованному выше) с использованием одноразового ключа. Затем этот одноразовый ключ шифруется публичным ключом. При расшифровке одноразовый ключ расшифровывается закрытым. Подробнее об этом уже было очень хорошо написано в статье на Хабре .

Автоматизировать шифрование поможет следующий скрипт, на выходе которого вы получите одноразовый ключ и данные (encrypt.sh) в зашифрованном виде:

FILENAME="$1"
PUBLICKEY="$2"
SESSIONKEY="$3"
RESULT="$4"

# Generate the random symmetric-key
PASSIZE=30
if [ -c /dev/urandom ] ; then
KEY=`head -c 30 /dev/urandom | openssl enc -base64`
else
KEY=`openssl rand -base64 30`
fi
export KEY

# Encrypt the symmetric key using the public key
openssl rsautl -encrypt -inkey "$PUBLICKEY" -out "$SESSIONKEY" -pubin < $KEY
EOF

# Encrypt the file
openssl enc -aes-256-cbc -pass env:KEY -in "$FILENAME" -out "$RESULT"

Следующая команда использует открытый ключ public.pem чтобы зашифровать файл documents.zip. Она сгенерирует зашифрованный одноразовый ключ session.key и зашифрованные данные documents.enc:

./encrypt.sh documents.zip public.pem session.key documents.enc

Скрипт для дешифрования (decrypt.sh):

PRIVATEKEY="$1"
SESSIONKEY="$2"
ENCRYPTED="$3"
DECRYPTED="$4"

# Decrypt the symmetric key using the private key
KEY=` openssl rsautl -decrypt -inkey "$PRIVATEKEY" -in "$SESSIONKEY" `
export KEY

# Decrypt the file
openssl enc -aes-256-cbc -d -pass env:KEY -in "$ENCRYPTED" -out "$DECRYPTED"

Команда для дешифрования использует закрытый ключ private.pem и одноразовый ключ session.key чтобы расшифровать файл documents.enc. Она сгенерирует файл documents.zip:

./decrypt.sh private.pem session.key documents.enc documents.zip

Как видите, шифрование с открытым ключом может быть почти таким же простым как и симметричное. Но есть ещё более простой путь. На написание этого поста меня побудил блог SbF₅ . Его автор (несомненно более искушённый в bash чем я) написал скрипт , который архивирует папку, шифрует её открытым ключом и генерирует другой скрипт, содержащий в себе всё необходимое: одноразовый ключ, данные и собственно команды для расшифровывания. Кроме того, скрипт может сгенерировать для вас пару RSA ключей:

./encrypt-file.sh -keys public.pem private.pem
./encrypt-file.sh folder public.pem > decrypt-folder.sh
chmod +x decrypt-folder.sh
./decrypt-folder.sh private.pem > folder.tar

В этом примере мы сначала сгенерировали пару ключей. После этого папка folder была зашифрована в скрипт decrypt-folder.sh а затем расшифрована в архив folder.tar. Возможный минус этого способа - то что данные в decrypt-folder.sh хранятся в формате BASE64, а следовательно их размер увеличивается.

UPD Перенесено в блог Информационная безопасность.

OpenSSL — это мощный набор инструментов, который может быть использован для шифрования файлов и сообщений .

Если Вы хотите использовать один и тот же пароль как для шифрования открытого текста , так и для его последующего расшифровывания , тогда Вам необходимо использовать алгоритм симметричного шифрования .

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

Как: Зашифровать файл

$ openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc

256bit AES — это криптографический алгоритм, который использует правительство Соединенных Штатов для шифрования информации на самом секретном уровне.

Опция-salt (соль) должна использоваться ВСЕГДА , если секретный ключ формируется на основе пароля.

Без использования опции -salt , существует возможность проведения высокоэффективной атаки по словарю, что приведет к раскрытию зашифрованных данных. Причина этого заключается в том, что без добавления ‘соли’, один и тот же пароль всегда генерирует один и тот же секретный ключ.

Когда используется соль, первые 8 байтов резервируются под нее. Она генерируется случайным образом при шифровании файла и считывается с зашифрованного файла во время дешифрации.

Как: Расшифровать файл

$ openssl enc -aes-256-cbc -d -in file.txt.enc -out file.txt

Base64 Кодирование и Декодирование

Кодирование в формат Base64, является стандартным методом для преобразования 8-битной двоичного информации, в ограниченное подмножество символов ASCII, для безопасной транспортировки через системы электронной почты и другие систем, которые не поддерживают 8-битный формат.

По умолчанию, зашифрованный файл создается в бинарном формате. Если вы собираетесь отправить его по электронной почте, IRC и т.д., Вы должны сохранить его в кодировке Base64. Чтобы зашифровать файл в кодировке Base64, необходимо добавить опцию -a :

$ openssl enc -aes-256-cbc -salt -a -in file.txt -out file.txt.enc

Опции Описание
-a Говорит OpenSSL что зашифрованные данные в кодировке Base64.

Так же, опция -a , должна быть указана при дешифрации:

$ openssl enc -aes-256-cbc -d -a -in file.txt.enc -out file.txt

Шифрование / Расшифровывание без запроса пароля

Так как пароль становится видимым, этот метод должен использоваться только там, где безопасность не является важной .

По умолчанию, пользователю предлагается вводить пароль в интерактивном режиме.

При написании BASH скрипта, Вы, возможно, захотите организовать ввод пароля не интерактивно, используя опцию -k .

Как раз для таких случаев было придумано шифрование с открытым ключом.

Шифрование файла, используя предоставленный пароль:

$ openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc -k PASS

Дешифрация файла, используя предоставленный пароль:

$ openssl enc -aes-256-cbc -d -in file.txt.enc -out file.txt -k PASS