加密是对消息进行编码的一种方法,这样可以保护消息的内容免遭他人窥视。一般有两种类型:
- 密钥加密或对称加密
- 公钥加密或非对称加密
密钥加密secret-key encryption使用相同的密钥进行加密和解密,而公钥加密public-key encryption使用不同的密钥进行加密和解密。每种方法各有利弊。密钥加密速度更快,而公钥加密更安全,因为它解决了安全共享密钥的问题,将它们结合在一起可以最大限度地利用每种类型的优势。
公钥加密
公钥加密使用两组密钥,称为密钥对。一个是公钥,可以与你想要秘密通信的任何人自由共享。另一个是私钥,应该是一个秘密,永远不会共享。
公钥用于加密。如果某人想与你交流敏感信息,你可以将你的公钥发送给他们,他们可以使用公钥加密消息或文件,然后再将其发送给你。私钥用于解密。解密发件人加密的消息的唯一方法是使用私钥。因此,它们被称为“密钥对”,它们是相互关联的。
如何使用 OpenSSL 加密文件
OpenSSL 是一个了不起的工具,可以执行各种任务,例如加密文件。本文使用安装了 OpenSSL 的 Fedora 计算机。如果你的机器上没有,则可以使用软件包管理器进行安装:
alice$cat/etc/fedora-release Fedorarelease33(ThirtyThree) alice$ alice$opensslversion OpenSSL1.1.1iFIPS8Dec2020 alice$
要探索文件加密和解密,假如有两个用户 Alice 和 Bob,他们想通过使用 OpenSSL 交换加密文件来相互通信。
步骤 1:生成密钥对
在加密文件之前,你需要生成密钥对。你还需要一个密码短语passphrase,每当你使用 OpenSSL 时都必须使用该密码短语,因此务必记住它。
Alice 使用以下命令生成她的一组密钥对:
alice$opensslgenrsa-aes128-outalice_private.pem1024
此命令使用 OpenSSL 的 genrsa 命令生成一个 1024 位的公钥/私钥对。这是可以的,因为 RSA 算法是不对称的。它还使用了 aes128 对称密钥算法来加密 Alice 生成的私钥。
输入命令后,OpenSSL 会提示 Alice 输入密码,每次使用密钥时,她都必须输入该密码:
alice$opensslgenrsa-aes128-outalice_private.pem1024 GeneratingRSAprivatekey,1024bitlongmodulus(2primes) ..........+++++ ..................................+++++ eis65537(0x010001) Enterpassphraseforalice_private.pem: Verifying-Enterpassphraseforalice_private.pem: alice$ alice$ alice$ls-lalice_private.pem -rw-------.1alicealice966Mar2217:44alice_private.pem alice$ alice$filealice_private.pem alice_private.pem:PEMRSAprivatekey alice$
Bob 使用相同的步骤来创建他的密钥对:
bob$opensslgenrsa-aes128-outbob_private.pem1024 GeneratingRSAprivatekey,1024bitlongmodulus(2primes) ..................+++++ ............................+++++ eis65537(0x010001) Enterpassphraseforbob_private.pem: Verifying-Enterpassphraseforbob_private.pem: bob$ bob$ls-lbob_private.pem -rw-------.1bobbob986Mar2213:48bob_private.pem bob$ bob$filebob_private.pem bob_private.pem:PEMRSAprivatekey bob$
如果你对密钥文件感到好奇,可以打开命令生成的 .pem 文件,但是你会看到屏幕上的一堆文本:
alice$headalice_private.pem -----BEGINRSAPRIVATEKEY----- 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$opensslrsa-inalice_private.pem-noout-text Enterpassphraseforalice_private.pem: RSAPrivate-Key:(1024bit,2primes) 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) <<截断>> 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$opensslrsa-inalice_private.pem-pubout>alice_public.pem Enterpassphraseforalice_private.pem: writingRSAkey alice$ alice$ls-l*.pem -rw-------.1alicealice966Mar2217:44alice_private.pem -rw-rw-r--.1alicealice272Mar2217:47alice_public.pem alice$
你可以使用与之前相同的方式查看公钥详细信息,但是这次,输入公钥 .pem 文件:
alice$ alice$opensslrsa-inalice_public.pem-pubin-text-noout RSAPublic-Key:(1024bit) 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 可以按照相同的过程来提取他的公钥并将其保存到文件中:
bob$opensslrsa-inbob_private.pem-pubout>bob_public.pem Enterpassphraseforbob_private.pem: writingRSAkey bob$ bob$ls-l*.pem -rw-------.1bobbob986Mar2213:48bob_private.pem -rw-r--r--.1bobbob272Mar2213:51bob_public.pem bob$
步骤 3:交换公钥
这些公钥在 Alice 和 Bob 彼此交换之前没有太大用处。有几种共享公钥的方法,例如使用 scp 命令将密钥复制到彼此的工作站。
将 Alice 的公钥发送到 Bob 的工作站:
alice$scpalice_public.pembob@bob-machine-or-ip:/path/
将 Bob 的公钥发送到 Alice 的工作站:
bob$scpbob_public.pemalice@alice-machine-or-ip:/path/
现在,Alice 有了 Bob 的公钥,反之亦然:
alice$ls-lbob_public.pem -rw-r--r--.1alicealice272Mar2217:51bob_public.pem alice$
bob$ls-lalice_public.pem -rw-r--r--.1bobbob272Mar2213:54alice_public.pem bob$
步骤 4:使用公钥交换加密的消息
假设 Alice 需要与 Bob 秘密交流。她将秘密信息写入文件中,并将其保存到 top_secret.txt 中。由于这是一个普通文件,因此任何人都可以打开它并查看其内容,这里并没有太多保护:
alice$ alice$echo"vimoremacs?">top_secret.txt alice$ alice$cattop_secret.txt vimoremacs? alice$
要加密此秘密消息,Alice 需要使用 openssls -encrypt 命令。她需要为该工具提供三个输入:
- 秘密消息文件的名称
- Bob 的公钥(文件)
- 加密后新文件的名称
alice$opensslrsautl-encrypt-inkeybob_public.pem-pubin-intop_secret.txt-outtop_secret.enc alice$ alice$ls-ltop_secret.* -rw-rw-r--.1alicealice128Mar2217:54top_secret.enc -rw-rw-r--.1alicealice15Mar2217:53top_secret.txt alice$ alice$
加密后,原始文件仍然是可见的,而新创建的加密文件在屏幕上看起来像乱码。这样,你可以确定秘密消息已被加密:
alice$cattop_secret.txt vimoremacs? alice$ alice$cattop_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 000000009e73128fe3754d294d263ebf804ea0c5|.s...uM)M&>..N..| 000000107d646d43793932233158ce71f3ba95a6|}dmCy92#1X.q....| 00000020c0c07617fbf7bf4dcefc40e6f4457fdb|..v....M..@..E..| 000000307eaec031f86b10067e265055b5055668|~..1.k..~&PU..Vh| 00000040484ceb405e50fe19ea28a8b87a1369d7|HL.@^P...(..z.i.| 000000504db03470d865d50795672b52ea31aad4|M.4p.e...g+R.1..| 0000006080b3a8eca173eda7f917c313d4fac171|.....s.........q| 000000705f38b96c077281a6feaf43a6492dc4ee|_8.l.r....C.I-..| 00000080 alice$ alice$filetop_secret.enc top_secret.enc:data alice$
删除秘密消息的原始文件是安全的,这样确保任何痕迹都没有:
alice$rm-ftop_secret.txt
现在,Alice 需要再次使用 scp 命令将此加密文件通过网络发送给 Bob 的工作站。注意,即使文件被截获,其内容也会是加密的,因此内容不会被泄露:
alice$scptop_secret.encbob@bob-machine-or-ip:/path/
如果 Bob 使用常规方法尝试打开并查看加密的消息,他将无法看懂该消息:
bob$ls-ltop_secret.enc -rw-r--r--.1bobbob128Mar2213:59top_secret.enc bob$ bob$cattop_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-Ctop_secret.enc 000000009e73128fe3754d294d263ebf804ea0c5|.s...uM)M&>..N..| 000000107d646d43793932233158ce71f3ba95a6|}dmCy92#1X.q....| 00000020c0c07617fbf7bf4dcefc40e6f4457fdb|..v....M..@..E..| 000000307eaec031f86b10067e265055b5055668|~..1.k..~&PU..Vh| 00000040484ceb405e50fe19ea28a8b87a1369d7|HL.@^P...(..z.i.| 000000504db03470d865d50795672b52ea31aad4|M.4p.e...g+R.1..| 0000006080b3a8eca173eda7f917c313d4fac171|.....s.........q| 000000705f38b96c077281a6feaf43a6492dc4ee|_8.l.r....C.I-..| 00000080 bob$
步骤 5:使用私钥解密文件
Bob 需要使用 OpenSSL 来解密消息,但是这次使用的是 -decrypt 命令行参数。他需要向工具程序提供以下信息:
- 加密的文件(从 Alice 那里得到)
- Bob 的私钥(用于解密,因为文件是用 Bob 的公钥加密的)
- 通过重定向保存解密输出的文件名
bob$opensslrsautl-decrypt-inkeybob_private.pem-intop_secret.enc>top_secret.txt Enterpassphraseforbob_private.pem: bob$
现在,Bob 可以阅读 Alice 发送给他的秘密消息:
bob$ls-ltop_secret.txt -rw-r--r--.1bobbob15Mar2214:02top_secret.txt bob$ bob$cattop_secret.txt vimoremacs? bob$
Bob 需要回复 Alice,因此他将秘密回复写在一个文件中:
bob$echo"nanoforlife">reply_secret.txt bob$ bob$catreply_secret.txt nanoforlife bob$
步骤 6:使用其他密钥重复该过程
为了发送消息,Bob 采用和 Alice 相同的步骤,但是由于该消息是发送给 Alice 的,因此他需要使用 Alice 的公钥来加密文件:
bob$opensslrsautl-encrypt-inkeyalice_public.pem-pubin-inreply_secret.txt-outreply_secret.enc bob$ bob$ls-lreply_secret.enc -rw-r--r--.1bobbob128Mar2214:03reply_secret.enc bob$ bob$catreply_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 000000009246dd8704bca72e342201661a1331db|.F......4".f..1.| 00000010c45cb48e7b6fd4b024d24d929b497b35|.\..{o..$.M..I{5| 00000020da7cee5cbb6ccd82f11b9265f18df259|.|.\.l.....e...Y| 00000030825681807b89077c2124635e610cae2a|.V..{..|!$c^a..*| 00000040d4aa5c76518dcfa03904c1d7dcf0ad99|..\vQ...9.......| 0000005027ed8eded9ae027350e0dd2713ae8e5a|'......sP..'...Z| 0000006012e49a3157b3036edde1167f6bc0b38b|...1W..n....k...| 000000704acf30b8493b5038e09f84f683da263a|J.0.I;P8......&:| 00000080 bob$ bob$#removecleartextsecretmessagefile bob$rm-freply_secret.txt
Bob 通过 scp 将加密的文件发送至 Alice 的工作站:
$scpreply_secret.encalice@alice-machine-or-ip:/path/
如果 Alice 尝试使用常规工具去阅读加密的文本,她将无法理解加密的文本:
alice$ alice$ls-lreply_secret.enc -rw-r--r--.1alicealice128Mar2218:01reply_secret.enc alice$ alice$catreply_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 000000009246dd8704bca72e342201661a1331db|.F......4".f..1.| 00000010c45cb48e7b6fd4b024d24d929b497b35|.\..{o..$.M..I{5| 00000020da7cee5cbb6ccd82f11b9265f18df259|.|.\.l.....e...Y| 00000030825681807b89077c2124635e610cae2a|.V..{..|!$c^a..*| 00000040d4aa5c76518dcfa03904c1d7dcf0ad99|..\vQ...9.......| 0000005027ed8eded9ae027350e0dd2713ae8e5a|'......sP..'...Z| 0000006012e49a3157b3036edde1167f6bc0b38b|...1W..n....k...| 000000704acf30b8493b5038e09f84f683da263a|J.0.I;P8......&:| 00000080 alice$
所以,她使用 OpenSSL 解密消息,只不过这次她提供了自己的私钥并将输出保存到文件中:
alice$opensslrsautl-decrypt-inkeyalice_private.pem-inreply_secret.enc>reply_secret.txt Enterpassphraseforalice_private.pem: alice$ alice$ls-lreply_secret.txt -rw-rw-r--.1alicealice14Mar2218:02reply_secret.txt alice$ alice$catreply_secret.txt nanoforlife alice$
了解 OpenSSL 的更多信息
OpenSSL 在加密界是真正的瑞士军刀。除了加密文件外,它还可以执行许多任务,你可以通过访问 OpenSSL文档页面来找到使用它的所有方式,包括手册的链接、 《OpenSSL Cookbook》、常见问题解答等。要了解更多信息,尝试使用其自带的各种加密算法,看看它是如何工作的。
转载请注明:IT运维空间 » 安全防护 » 使用 OpenSSL 加密和解密文件
发表评论