Каждый современный человек владеет ноутбуком, но как самому убрать возникающие...
![Пропал звук на ноутбуке — что делать?](https://i0.wp.com/sovets.net/photos/uploads/120/8110495-2razrabotanyi-spetsialnyie-programmyi-kotoryie-testiruyut-audio-drayveryi-soundcheck.jpg)
Полно ситуаций когда нужно зашифровать определённый файл или папку. Например, если данные передаются по открытым каналам либо сохраняются на внешнем носителе. Многие (в том числе и я) используют 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 <
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 Перенесено в блог Информационная безопасность.
Полно ситуаций когда нужно зашифровать определённый файл или папку. Например, если данные передаются по открытым каналам либо сохраняются на внешнем носителе. Многие (в том числе и я) используют 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 <
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.
256bit AES — это криптографический алгоритм, который использует правительство Соединенных Штатов для шифрования информации на самом секретном уровне.
Опция-salt (соль) должна использоваться ВСЕГДА , если секретный ключ формируется на основе пароля.
Без использования опции -salt , существует возможность проведения высокоэффективной атаки по словарю, что приведет к раскрытию зашифрованных данных. Причина этого заключается в том, что без добавления ‘соли’, один и тот же пароль всегда генерирует один и тот же секретный ключ.
Когда используется соль, первые 8 байтов резервируются под нее. Она генерируется случайным образом при шифровании файла и считывается с зашифрованного файла во время дешифрации.
Кодирование в формат 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
Как вы поняли из этих статей, не каждая программа которая обещает шифровать файлы обеспечивает безопасность информации. Как говорит Брюс Шнайер — «Криптография бывает двух типов: криптография, которая помешает читать ваши файлы вашей младшей сестре, и криптография, которая помешает читать ваши файлы дядям из правительства». 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. После того как зашифровали информацию, необходимо правильно удалить первоначальный файл что-бы не осталось никакой остаточной информации . Для этого можете воспользоваться какой-нибудь программой которая реализует метод Гутмана . Также если вы вводите пароль в командной строке убедитесь что он не сохранился в истории, а если он читается из файла тогда что он был полностью удалён.