使用 OpenSSL 加密和解密文件
加密是對(duì)消息進(jìn)行編碼的一種方法,這樣可以保護(hù)消息的內(nèi)容免遭他人窺視。一般有兩種類(lèi)型:
- 密鑰加密或?qū)ΨQ(chēng)加密
- 公鑰加密或非對(duì)稱(chēng)加密
密鑰加密secret-key encryption使用相同的密鑰進(jìn)行加密和解密,而公鑰加密public-key encryption使用不同的密鑰進(jìn)行加密和解密。每種方法各有利弊。密鑰加密速度更快,而公鑰加密更安全,因?yàn)樗鉀Q了安全共享密鑰的問(wèn)題,將它們結(jié)合在一起可以最大限度地利用每種類(lèi)型的優(yōu)勢(shì)。
公鑰加密
公鑰加密使用兩組密鑰,稱(chēng)為密鑰對(duì)。一個(gè)是公鑰,可以與你想要秘密通信的任何人自由共享。另一個(gè)是私鑰,應(yīng)該是一個(gè)秘密,永遠(yuǎn)不會(huì)共享。
公鑰用于加密。如果某人想與你交流敏感信息,你可以將你的公鑰發(fā)送給他們,他們可以使用公鑰加密消息或文件,然后再將其發(fā)送給你。私鑰用于解密。解密發(fā)件人加密的消息的唯一方法是使用私鑰。因此,它們被稱(chēng)為“密鑰對(duì)”,它們是相互關(guān)聯(lián)的。
如何使用 OpenSSL 加密文件
OpenSSL 是一個(gè)了不起的工具,可以執(zhí)行各種任務(wù),例如加密文件。本文使用安裝了 OpenSSL 的 Fedora 計(jì)算機(jī)。如果你的機(jī)器上沒(méi)有,則可以使用軟件包管理器進(jìn)行安裝:
- alice $ cat /etc/fedora-release
- Fedora release 33 (Thirty Three)
- alice $
- alice $ openssl version
- OpenSSL 1.1.1i FIPS 8 Dec 2020
- alice $
要探索文件加密和解密,假如有兩個(gè)用戶(hù) Alice 和 Bob,他們想通過(guò)使用 OpenSSL 交換加密文件來(lái)相互通信。
步驟 1:生成密鑰對(duì)
在加密文件之前,你需要生成密鑰對(duì)。你還需要一個(gè)密碼短語(yǔ)passphrase,每當(dāng)你使用 OpenSSL 時(shí)都必須使用該密碼短語(yǔ),因此務(wù)必記住它。
Alice 使用以下命令生成她的一組密鑰對(duì):
- alice $ openssl genrsa -aes128 -out alice_private.pem 1024
此命令使用 OpenSSL 的 genrsa 命令生成一個(gè) 1024 位的公鑰/私鑰對(duì)。這是可以的,因?yàn)?RSA 算法是不對(duì)稱(chēng)的。它還使用了 aes128 對(duì)稱(chēng)密鑰算法來(lái)加密 Alice 生成的私鑰。
輸入命令后,OpenSSL 會(huì)提示 Alice 輸入密碼,每次使用密鑰時(shí),她都必須輸入該密碼:
- 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 使用相同的步驟來(lái)創(chuàng)建他的密鑰對(duì):
- 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 $
如果你對(duì)密鑰文件感到好奇,可以打開(kāi)命令生成的 .pem 文件,但是你會(huì)看到屏幕上的一堆文本:
- 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 $
要查看密鑰的詳細(xì)信息,可以使用以下 OpenSSL 命令打開(kāi) .pem 文件并顯示內(nèi)容。你可能想知道在哪里可以找到另一個(gè)配對(duì)的密鑰,因?yàn)檫@是單個(gè)文件。你觀察的很細(xì)致,獲取公鑰的方法如下:
- 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)
- << 截?cái)?nbsp;>>
- 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 必須提取她的公鑰,并將其保存到文件中:
- 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 $
你可以使用與之前相同的方式查看公鑰詳細(xì)信息,但是這次,輸入公鑰 .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 可以按照相同的過(guò)程來(lái)提取他的公鑰并將其保存到文件中:
- 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:交換公鑰
這些公鑰在 Alice 和 Bob 彼此交換之前沒(méi)有太大用處。有幾種共享公鑰的方法,例如使用 scp 命令將密鑰復(fù)制到彼此的工作站。
將 Alice 的公鑰發(fā)送到 Bob 的工作站:
- alice $ scp alice_public.pem bob@bob-machine-or-ip:/path/
將 Bob 的公鑰發(fā)送到 Alice 的工作站:
- bob $ scp bob_public.pem alice@alice-machine-or-ip:/path/
現(xiàn)在,Alice 有了 Bob 的公鑰,反之亦然:
- 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:使用公鑰交換加密的消息
假設(shè) Alice 需要與 Bob 秘密交流。她將秘密信息寫(xiě)入文件中,并將其保存到 top_secret.txt 中。由于這是一個(gè)普通文件,因此任何人都可以打開(kāi)它并查看其內(nèi)容,這里并沒(méi)有太多保護(hù):
- alice $
- alice $ echo "vim or emacs ?" > top_secret.txt
- alice $
- alice $ cat top_secret.txt
- vim or emacs ?
- alice $
要加密此秘密消息,Alice 需要使用 openssls -encrypt 命令。她需要為該工具提供三個(gè)輸入:
- 秘密消息文件的名稱(chēng)
- Bob 的公鑰(文件)
- 加密后新文件的名稱(chēng)
- 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 $
加密后,原始文件仍然是可見(jiàn)的,而新創(chuàng)建的加密文件在屏幕上看起來(lái)像亂碼。這樣,你可以確定秘密消息已被加密:
- 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 $
刪除秘密消息的原始文件是安全的,這樣確保任何痕跡都沒(méi)有:
- alice $ rm -f top_secret.txt
現(xiàn)在,Alice 需要再次使用 scp 命令將此加密文件通過(guò)網(wǎng)絡(luò)發(fā)送給 Bob 的工作站。注意,即使文件被截獲,其內(nèi)容也會(huì)是加密的,因此內(nèi)容不會(huì)被泄露:
- alice $ scp top_secret.enc bob@bob-machine-or-ip:/path/
如果 Bob 使用常規(guī)方法嘗試打開(kāi)并查看加密的消息,他將無(wú)法看懂該消息:
- 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:使用私鑰解密文件
Bob 需要使用 OpenSSL 來(lái)解密消息,但是這次使用的是 -decrypt 命令行參數(shù)。他需要向工具程序提供以下信息:
- 加密的文件(從 Alice 那里得到)
- Bob 的私鑰(用于解密,因?yàn)槲募怯?Bob 的公鑰加密的)
- 通過(guò)重定向保存解密輸出的文件名
- bob $ openssl rsautl -decrypt -inkey bob_private.pem -in top_secret.enc > top_secret.txt
- Enter pass phrase for bob_private.pem:
- bob $
現(xiàn)在,Bob 可以閱讀 Alice 發(fā)送給他的秘密消息:
- 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 需要回復(fù) Alice,因此他將秘密回復(fù)寫(xiě)在一個(gè)文件中:
- bob $ echo "nano for life" > reply_secret.txt
- bob $
- bob $ cat reply_secret.txt
- nano for life
- bob $
步驟 6:使用其他密鑰重復(fù)該過(guò)程
為了發(fā)送消息,Bob 采用和 Alice 相同的步驟,但是由于該消息是發(fā)送給 Alice 的,因此他需要使用 Alice 的公鑰來(lái)加密文件:
- 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
Bob 通過(guò) scp 將加密的文件發(fā)送至 Alice 的工作站:
- $ scp reply_secret.enc alice@alice-machine-or-ip:/path/
如果 Alice 嘗試使用常規(guī)工具去閱讀加密的文本,她將無(wú)法理解加密的文本:
- 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 解密消息,只不過(guò)這次她提供了自己的私鑰并將輸出保存到文件中:
- 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 在加密界是真正的瑞士軍刀。除了加密文件外,它還可以執(zhí)行許多任務(wù),你可以通過(guò)訪問(wèn) OpenSSL 文檔頁(yè)面來(lái)找到使用它的所有方式,包括手冊(cè)的鏈接、 《OpenSSL Cookbook》、常見(jiàn)問(wèn)題解答等。要了解更多信息,嘗試使用其自帶的各種加密算法,看看它是如何工作的。