Шифрование и дешифрование файлов с помощью OpenSSL
OpenSSL — это практичный инструмент, гарантирующий, что ваши конфиденциальные и секретные сообщения не смогут быть открыты посторонними.
Шифрование — это способ закодировать сообщение так, чтобы его содержимое было защищено от посторонних глаз. Существует два общих типа:
- Секретный ключ или симметричное шифрование
- Шифрование с открытым ключом или асимметричное шифрование
При шифровании с секретным ключом для шифрования и дешифрования используется один и тот же ключ, тогда как при шифровании с открытым ключом для шифрования и дешифрования используются разные ключи. У каждого метода есть плюсы и минусы. Шифрование с секретным ключом происходит быстрее, а шифрование с открытым ключом более безопасно, поскольку оно решает проблемы, связанные с безопасным обменом ключами. Их совместное использование позволяет оптимально использовать сильные стороны каждого типа.
Шифрование с открытым ключом
Шифрование с открытым ключом использует два набора ключей, называемых парой ключей. Один из них — открытый ключ, и его можно свободно передавать всем, с кем вы хотите тайно общаться. Другой, закрытый ключ, должен быть секретным и никогда не разглашаться.
Открытые ключи используются для шифрования. Если кто-то хочет передать вам конфиденциальную информацию, вы можете отправить ему свой открытый ключ, который он сможет использовать для шифрования своих сообщений или файлов перед отправкой их вам. Для расшифровки используются закрытые ключи. Единственный способ расшифровать зашифрованное сообщение отправителя — использовать личный ключ. Отсюда и дескриптор «пара ключей»; набор ключей идет рука об руку.
Как зашифровать файлы с помощью OpenSSL
OpenSSL — потрясающий инструмент, который выполняет множество задач, включая шифрование файлов. В этой демонстрации используется машина Fedora с установленным OpenSSL. Этот инструмент обычно устанавливается по умолчанию в большинстве дистрибутивов Linux; если нет, вы можете использовать менеджер пакетов для его установки:
$ cat /etc/fedora-release
Fedora release 33 (Thirty Three)
$
alice $ openssl version
OpenSSL 1.1.1i FIPS 8 Dec 2020
alice $
Чтобы изучить шифрование и дешифрование файлов, представьте себе двух пользователей, Алису и Боба, которые хотят общаться друг с другом путем обмена зашифрованными файлами с использованием OpenSSL.
Шаг 1. Сгенерируйте пары ключей
Прежде чем вы сможете зашифровать файлы, вам необходимо сгенерировать пару ключей. Вам также понадобится парольная фраза, которую вы должны использовать всякий раз, когда используете OpenSSL, поэтому обязательно запомните ее.
Алиса генерирует свой набор пар ключей с помощью:
alice $ openssl genrsa -aes128 -out alice_private.pem 1024
Эта команда использует команду genrsa OpenSSL для генерации 1024-битной пары открытого и закрытого ключей. Это возможно, поскольку алгоритм RSA асимметричен. Он также использует aes128, алгоритм симметричного ключа, для шифрования закрытого ключа, который Алиса генерирует с помощью genrsa.
После ввода команды OpenSSL запрашивает у Алисы парольную фразу, которую она должна вводить каждый раз, когда хочет использовать ключи:
alice $ openssl genrsa -aes128 -out alice_private.pem 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
..........+++++
..................................+++++
e is 65537 (0x010001)
Enter pass phrase for alice_private.pem:
Verifying - Enter pass phrase for alice_private.pem:
alice $
alice $
alice $ ls -l alice_private.pem
-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem
alice $
alice $ file alice_private.pem
alice_private.pem: PEM RSA private key
alice $
Боб следует той же процедуре, чтобы создать свою пару ключей:
bob $ openssl genrsa -aes128 -out bob_private.pem 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
..................+++++
............................+++++
e is 65537 (0x010001)
Enter pass phrase for bob_private.pem:
Verifying - Enter pass phrase for bob_private.pem:
bob $
bob $ ls -l bob_private.pem
-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem
bob $
bob $ file bob_private.pem
bob_private.pem: PEM RSA private key
bob $
Если вам интересно, как выглядит файл ключа, вы можете открыть файл .pem, созданный командой, но все, что вы увидите, — это набор текста на экране:
alice $ head alice_private.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E26FAC1F143A30632203F09C259200B9
pdKj8Gm5eeAOF0RHzBx8l1tjmA1HSSvy0RF42bOeb7sEVZtJ6pMnrJ26ouwTQnkL
JJjUVPPHoKZ7j4QpwzbPGrz/hVeMXVT/y33ZEEA+3nrobwisLKz+Q+C9TVJU3m7M
/veiBO9xHMGV01YBNeic7MqXBkhIrNZW6pPRfrbjsBMBGSsL8nwJbb3wvHhzPkeM
e+wtt9S5PWhcnGMj3T+2mtFfW6HWpd8Kdp60z7Nh5mhA9+5aDWREfJhJYzl1zfcv
Bmxjf2wZ3sFJNty+sQVajYfk6UXMyJIuWgAjnqjw6c3vxQi0KE3NUNZYO93GQgEF
pyAnN9uGUTBCDYeTwdw8TEzkyaL08FkzLfFbS2N9BDksA3rpI1cxpxRVFr9+jDBz
alice $
Чтобы просмотреть сведения о ключе, вы можете использовать следующую команду OpenSSL для ввода файла .pem и отображения его содержимого. Вам может быть интересно, где найти другой ключ, поскольку это один файл. Это хорошее наблюдение. Вот как получить открытый ключ:
alice $ openssl rsa -in alice_private.pem -noout -text
Enter pass phrase for alice_private.pem:
RSA Private-Key: (1024 bit, 2 primes)
modulus:
00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99:
47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc:
c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47:
81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f:
65:d3:36:1d:c1:7d:8b:7d:0f:79:de:80:fc:d2:c0:
e4:27:fc:e9:66:2d:e2:7e:fc:e6:73:d1:c9:28:6b:
6a:8a:e8:96:9d:65:a0:8a:46:e0:b8:1f:b0:48:d4:
db:d4:a3:7f:0d:53:36:9a:7d:2e:e7:d8:f2:16:d3:
ff:1b:12:af:53:22:c0:41:51
publicExponent: 65537 (0x10001)
<< snip >>
exponent2:
6e:aa:8c:6e:37:d0:57:37:13:c0:08:7e:75:43:96:
33:01:99:25:24:75:9c:0b:45:3c:a2:39:44:69:84:
a4:64:48:f4:5c:bc:40:40:bf:84:b8:f8:0f:1d:7b:
96:7e:16:00:eb:49:da:6b:20:65:fc:a9:20:d9:98:
76:ca:59:e1
coefficient:
68:9e:2e:fa:a3:a4:72:1d:2b:60:61:11:b1:8b:30:
6e:7e:2d:f9:79:79:f2:27:ab:a0:a0:b6:45:08:df:
12:f7:a4:3b:d9:df:c5:6e:c7:e8:81:29:07:cd:7e:
47:99:5d:33:8c:b7:fb:3b:a9:bb:52:c0:47:7a:1c:
e3:64:90:26
alice $
Шаг 2. Извлеките открытые ключи
Помните, что открытый ключ — это тот ключ, которым вы можете свободно поделиться с другими, тогда как вы должны хранить свой закрытый ключ в секрете. Итак, Алиса должна извлечь свой открытый ключ и сохранить его в файл с помощью следующей команды:
alice $ openssl rsa -in alice_private.pem -pubout > alice_public.pem
Enter pass phrase for alice_private.pem:
writing RSA key
alice $
alice $ ls -l *.pem
-rw-------. 1 alice alice 966 Mar 22 17:44 alice_private.pem
-rw-rw-r--. 1 alice alice 272 Mar 22 17:47 alice_public.pem
alice $
Вы можете просмотреть сведения об открытом ключе так же, как и раньше, но на этот раз вместо этого введите файл открытого ключа .pem:
alice $
alice $ openssl rsa -in alice_public.pem -pubin -text -noout
RSA Public-Key: (1024 bit)
Modulus:
00:bd:e8:61:72:f8:f6:c8:f2:cc:05:fa:07:aa:99:
47:a6:d8:06:cf:09:bf:d1:66:b7:f9:37:29:5d:dc:
c7:11:56:59:d7:83:b4:81:f6:cf:e2:5f:16:0d:47:
81:fe:62:9a:63:c5:20:df:ee:d3:95:73:dc:0a:3f:
$
Боб может выполнить тот же процесс, чтобы извлечь свой открытый ключ и сохранить его в файл:
bob $ openssl rsa -in bob_private.pem -pubout > bob_public.pem
Enter pass phrase for bob_private.pem:
writing RSA key
bob $
bob $ ls -l *.pem
-rw-------. 1 bob bob 986 Mar 22 13:48 bob_private.pem
-rw-r--r--. 1 bob bob 272 Mar 22 13:51 bob_public.pem
bob $
Шаг 3. Обменяйтесь открытыми ключами
Эти открытые ключи не принесут особой пользы Алисе и Бобу, пока они не обменяются ими друг с другом. Доступно несколько методов обмена открытыми ключами, включая копирование ключей на рабочие станции друг друга с помощью команды scp
.
Чтобы отправить открытый ключ Алисы на рабочую станцию Боба:
alice $ scp alice_public.pem bob@bob-machine-or-ip:/path/
Чтобы отправить открытый ключ Боба на рабочую станцию Алисы:
bob $ scp bob_public.pem alice@alice-machine-or-ip:/path/
Теперь у Алисы есть открытый ключ Боба, и наоборот:
alice $ ls -l bob_public.pem
-rw-r--r--. 1 alice alice 272 Mar 22 17:51 bob_public.pem
alice $
bob $ ls -l alice_public.pem
-rw-r--r--. 1 bob bob 272 Mar 22 13:54 alice_public.pem
bob $
Шаг 4. Обменивайтесь зашифрованными сообщениями с помощью открытого ключа.
Допустим, Алисе нужно тайно пообщаться с Бобом. Она записывает свое секретное сообщение в файл и сохраняет его в top_secret.txt
. Поскольку это обычный файл, любой может открыть его и просмотреть его содержимое. Здесь не так уж и много защиты:
alice $
alice $ echo "vim or emacs ?" > top_secret.txt
alice $
alice $ cat top_secret.txt
vim or emacs ?
alice $
Чтобы зашифровать это секретное сообщение, Алисе необходимо использовать команду openssls -encrypt
. Ей необходимо предоставить инструменту три входных данных:
- Имя файла, содержащего секретное сообщение
- Открытый ключ Боба (файл)
- Имя файла, в котором будет храниться зашифрованное сообщение.
alice $ openssl rsautl -encrypt -inkey bob_public.pem -pubin -in top_secret.txt -out top_secret.enc
alice $
alice $ ls -l top_secret.*
-rw-rw-r--. 1 alice alice 128 Mar 22 17:54 top_secret.enc
-rw-rw-r--. 1 alice alice 15 Mar 22 17:53 top_secret.txt
alice $
alice $
После шифрования исходный файл по-прежнему доступен для просмотра, тогда как вновь созданный зашифрованный файл выглядит на экране как тарабарщина. Вы можете быть уверены, что секретное сообщение зашифровано:
alice $ cat top_secret.txt
vim or emacs ?
alice $
alice $ cat top_secret.enc
�s��uM)M&>��N��}dmCy92#1X�q?��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��alice $
alice $
alice $
alice $ hexdump -C ./top_secret.enc
00000000 9e 73 12 8f e3 75 4d 29 4d 26 3e bf 80 4e a0 c5 |.s...uM)M&>..N..|
00000010 7d 64 6d 43 79 39 32 23 31 58 ce 71 f3 ba 95 a6 |}dmCy92#1X.q....|
00000020 c0 c0 76 17 fb f7 bf 4d ce fc 40 e6 f4 45 7f db |..v....M..@..E..|
00000030 7e ae c0 31 f8 6b 10 06 7e 26 50 55 b5 05 56 68 |~..1.k..~&PU..Vh|
00000040 48 4c eb 40 5e 50 fe 19 ea 28 a8 b8 7a 13 69 d7 |HL.@^P...(..z.i.|
00000050 4d b0 34 70 d8 65 d5 07 95 67 2b 52 ea 31 aa d4 |M.4p.e...g+R.1..|
00000060 80 b3 a8 ec a1 73 ed a7 f9 17 c3 13 d4 fa c1 71 |.....s.........q|
00000070 5f 38 b9 6c 07 72 81 a6 fe af 43 a6 49 2d c4 ee |_8.l.r....C.I-..|
00000080
alice $
alice $ file top_secret.enc
top_secret.enc: data
alice $
Исходный файл с секретным сообщением можно безопасно удалить, чтобы удалить все его следы:
alice $ rm -f top_secret.txt
Теперь Алисе нужно еще раз отправить этот зашифрованный файл Бобу по сети, используя команду scp
, чтобы скопировать файл на рабочую станцию Боба. Помните, что даже если файл перехвачен, его содержимое зашифровано, поэтому его содержимое невозможно раскрыть:
alice $ scp top_secret.enc bob@bob-machine-or-ip:/path/
Если Боб попытается открыть и просмотреть зашифрованное сообщение обычными методами, он не сможет его прочитать:
bob $ ls -l top_secret.enc
-rw-r--r--. 1 bob bob 128 Mar 22 13:59 top_secret.enc
bob $
bob $ cat top_secret.enc
�s��uM)M&>��N��}dmCy92#1X�q?��v���M��@��E�~��1�k~&PU�VhHL�@^P��(��zi�M�4p�e��g+R�1�Ԁ���s�������q_8�lr����C�I-��bob $
bob $
bob $ hexdump -C top_secret.enc
00000000 9e 73 12 8f e3 75 4d 29 4d 26 3e bf 80 4e a0 c5 |.s...uM)M&>..N..|
00000010 7d 64 6d 43 79 39 32 23 31 58 ce 71 f3 ba 95 a6 |}dmCy92#1X.q....|
00000020 c0 c0 76 17 fb f7 bf 4d ce fc 40 e6 f4 45 7f db |..v....M..@..E..|
00000030 7e ae c0 31 f8 6b 10 06 7e 26 50 55 b5 05 56 68 |~..1.k..~&PU..Vh|
00000040 48 4c eb 40 5e 50 fe 19 ea 28 a8 b8 7a 13 69 d7 |HL.@^P...(..z.i.|
00000050 4d b0 34 70 d8 65 d5 07 95 67 2b 52 ea 31 aa d4 |M.4p.e...g+R.1..|
00000060 80 b3 a8 ec a1 73 ed a7 f9 17 c3 13 d4 fa c1 71 |.....s.........q|
00000070 5f 38 b9 6c 07 72 81 a6 fe af 43 a6 49 2d c4 ee |_8.l.r....C.I-..|
00000080
bob $
Шаг 5. Расшифруйте файл с помощью закрытого ключа.
Бобу нужно внести свой вклад, расшифровав сообщение с помощью OpenSSL, но на этот раз с использованием аргумента командной строки -decrypt
. Ему необходимо предоставить утилите следующую информацию:
- Зашифрованный файл (который он получил от Алисы)
- Собственный закрытый ключ Боба (для расшифровки, поскольку он был зашифрован с использованием открытого ключа Боба)
- Имя файла для сохранения расшифрованного вывода посредством перенаправления.
bob $ openssl rsautl -decrypt -inkey bob_private.pem -in top_secret.enc > top_secret.txt
Enter pass phrase for bob_private.pem:
bob $
Теперь Боб может прочитать секретное сообщение, которое отправила ему Алиса:
bob $ ls -l top_secret.txt
-rw-r--r--. 1 bob bob 15 Mar 22 14:02 top_secret.txt
bob $
bob $ cat top_secret.txt
vim or emacs ?
bob $
Бобу нужно ответить Алисе, поэтому он записывает свой секретный ответ в файл:
bob $ echo "nano for life" > reply_secret.txt
bob $
bob $ cat reply_secret.txt
nano for life
bob $
Шаг 6: Повторите процесс с другим ключом.
Чтобы отправить свое сообщение, Боб следует тому же процессу, который использовала Алиса, но поскольку сообщение предназначено для Алисы, он использует открытый ключ Алисы для шифрования файла:
bob $ openssl rsautl -encrypt -inkey alice_public.pem -pubin -in reply_secret.txt -out reply_secret.enc
bob $
bob $ ls -l reply_secret.enc
-rw-r--r--. 1 bob bob 128 Mar 22 14:03 reply_secret.enc
bob $
bob $ cat reply_secret.enc
�F݇��.4"f�1��\��{o$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a
�*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:bob $
bob $
bob $ hexdump -C ./reply_secret.enc
00000000 92 46 dd 87 04 bc a7 2e 34 22 01 66 1a 13 31 db |.F......4".f..1.|
00000010 c4 5c b4 8e 7b 6f d4 b0 24 d2 4d 92 9b 49 7b 35 |.\..{o..$.M..I{5|
00000020 da 7c ee 5c bb 6c cd 82 f1 1b 92 65 f1 8d f2 59 |.|.\.l.....e...Y|
00000030 82 56 81 80 7b 89 07 7c 21 24 63 5e 61 0c ae 2a |.V..{..|!$c^a..*|
00000040 d4 aa 5c 76 51 8d cf a0 39 04 c1 d7 dc f0 ad 99 |..\vQ...9.......|
00000050 27 ed 8e de d9 ae 02 73 50 e0 dd 27 13 ae 8e 5a |'......sP..'...Z|
00000060 12 e4 9a 31 57 b3 03 6e dd e1 16 7f 6b c0 b3 8b |...1W..n....k...|
00000070 4a cf 30 b8 49 3b 50 38 e0 9f 84 f6 83 da 26 3a |J.0.I;P8......&:|
00000080
bob $
bob $ # remove clear text secret message file
bob $ rm -f reply_secret.txt
Боб отправляет зашифрованный файл обратно на рабочую станцию Алисы через scp
:
$ scp reply_secret.enc alice@alice-machine-or-ip:/path/
Алиса не сможет разобраться в зашифрованном тексте, если попытается прочитать его обычными инструментами:
alice $
alice $ ls -l reply_secret.enc
-rw-r--r--. 1 alice alice 128 Mar 22 18:01 reply_secret.enc
alice $
alice $ cat reply_secret.enc
�F݇��.4"f�1��\��{o$�M��I{5�|�\�l͂�e��Y�V��{�|!$c^a
�*Ԫ\vQ�Ϡ9����'��ٮsP��'��Z�1W�n��k���J�0�I;P8������&:alice $
alice $
alice $
alice $ hexdump -C ./reply_secret.enc
00000000 92 46 dd 87 04 bc a7 2e 34 22 01 66 1a 13 31 db |.F......4".f..1.|
00000010 c4 5c b4 8e 7b 6f d4 b0 24 d2 4d 92 9b 49 7b 35 |.\..{o..$.M..I{5|
00000020 da 7c ee 5c bb 6c cd 82 f1 1b 92 65 f1 8d f2 59 |.|.\.l.....e...Y|
00000030 82 56 81 80 7b 89 07 7c 21 24 63 5e 61 0c ae 2a |.V..{..|!$c^a..*|
00000040 d4 aa 5c 76 51 8d cf a0 39 04 c1 d7 dc f0 ad 99 |..\vQ...9.......|
00000050 27 ed 8e de d9 ae 02 73 50 e0 dd 27 13 ae 8e 5a |'......sP..'...Z|
00000060 12 e4 9a 31 57 b3 03 6e dd e1 16 7f 6b c0 b3 8b |...1W..n....k...|
00000070 4a cf 30 b8 49 3b 50 38 e0 9f 84 f6 83 da 26 3a |J.0.I;P8......&:|
00000080
alice $
Поэтому она расшифровывает сообщение с помощью OpenSSL, только на этот раз она предоставляет свой секретный ключ и сохраняет вывод в файл:
alice $ openssl rsautl -decrypt -inkey alice_private.pem -in reply_secret.enc > reply_secret.txt
Enter pass phrase for alice_private.pem:
alice $
alice $ ls -l reply_secret.txt
-rw-rw-r--. 1 alice alice 14 Mar 22 18:02 reply_secret.txt
alice $
alice $ cat reply_secret.txt
nano for life
alice $
Узнайте больше об OpenSSL
OpenSSL — это настоящий швейцарский армейский нож для случаев использования, связанных с криптографией. Помимо шифрования файлов, он может выполнять множество задач. Вы можете узнать обо всех способах его использования, посетив страницу документации OpenSSL, на которой есть ссылки на руководство, Поваренную книгу OpenSSL, часто задаваемые вопросы и многое другое. Чтобы узнать больше, поэкспериментируйте с различными включенными в него алгоритмами шифрования и посмотрите, как они работают.