加密是一种对消息进行编码以保护其内容免遭窥探的方法。一般有两种:secret-keyencryptionorsymmetricencryptionpublic-keyencryptionorasymmetricencryptionkeyencryptionsecret-keyencryption使用相同的密钥进行加密和解密,public-key加密使用不同的密钥进行加密和解密。每种方法都有优点和缺点。密钥加密更快,而公钥加密更安全,因为它解决了安全共享密钥的问题,将它们结合起来以最大限度地发挥每种类型的优势。公钥密码术公钥密码术使用两组密钥,称为密钥对。一种是公钥,可以与任何你想秘密通信的人自由共享。另一个是私钥,它应该是秘密的,永远不会共享。公钥用于加密。如果有人想与您交流敏感信息,您可以将您的公钥发送给他们,他们可以使用该密钥在将消息或文件发送给您之前对其进行加密。私钥用于解密。解密由发件人加密的消息的唯一方法是使用私钥。因此,它们被称为“密钥对”并且彼此相关。如何使用OpenSSL加密文件OpenSSL是一个了不起的工具,可以执行各种任务,例如加密文件。本文使用安装了OpenSSL的Fedora计算机。如果你的机器上没有,你可以使用包管理器安装:alice$cat/etc/fedora-releaseFedorarelease33(ThirtyThree)alice$alice$opensslversionOpenSSL1.1.1iFIPS8Dec2020alice$探索文件加密和解密,假设有有两个用户Alice和Bob,他们想通过使用OpenSSL交换加密文件来相互通信。第一步:生成密钥对在加密文件之前,需要生成密钥对。您还需要一个密码短语,无论何时使用OpenSSL都必须使用它,因此请记住它。Alice使用以下命令生成她的一组密钥对:alice$opensslgenrsa-aes128-outalice_private.pem1024此命令使用OpenSSL的genrsa命令生成一个1024位公钥/私钥对。这是可能的,因为RSA算法是不对称的。它还使用aes128对称密钥算法对Alice生成的私钥进行加密。输入命令后,OpenSSL将提示Alice输入密码,每次使用密钥时她都必须输入密码:alice$opensslgenrsa-aes128-outalice_private.pem1024GeneratingRSAprivatekey,1024bitlongmodulus(2primes).........+++++..................................................++++eis65537(0x010001)Enterpassphraseforalice_private.pem:Verifying-Enterpassphraseforalice_private.pem:alice$alice$alice$ls-lalice_private.pem-rw------.1alicealice966Mar2217:44alice_private.pemalice$alice$filealice_private.pemalice_private.pem:PEMRSAprivatekeyalice$Bob使用相同的步骤创建他的密钥对:bob$opensslgenrsa-aes128-outbob_private.pem1024GeneratingRSAprivatekey,1024bitlongmodulus(2primes).......................++++............++++eis65537(0x010001)Enterpassphraseforbob_private.pem:Verifying-Enterpassphraseforbob_private.pem:bob$bob$ls-lbob_private.pem-rw-------.1bobbob986Mar2213:48bob_private.pembob$bob$filebob_private.pembob_private.pem:PEMRSAprivatekeybob$如果你好奇关于密钥文件,可以打开命令生成的.pem文件,但是会看到屏幕上一堆文字:alice$headalice_private.pem-----BEGINRSAPRIVATEKEY-----Proc-Type:4,ENCRYPTEDDEK-Info:AES-128-CBC,E26FAC1F143A30632203F09C259200B9pdKj8Gm5eeAOF0RHzBx8l1tjmA1HSSvy0RF42bOeb7sEVZtJ6pMnrJ26ouwTQnkLJJjUVPPHoKZ7j4QpwzbPGrz/hVeMXVT/y33ZEEA+3nrobwisLKz+Q+C9TVJU3m7M/veiBO9xHMGV01YBNeic7MqXBkhIrNZW6pPRfrbjsBMBGSsL8nwJbb3wvHhzPkeMe+wtt9S5PWhcnGMj3T+2mtFfW6HWpd8Kdp60z7Nh5mhA9+5aDWREfJhJYzl1zfcvBmxjf2wZ3sFJNty+sQVajYfk6UXMyJIuWgAjnqjw6c3vxQi0KE3NUNZYO93GQgEFpyAnN9uGUTBCDYeTwdw8TEzkyaL08FkzLfFbS2N9BDksA3rpI1cxpxRVFr9+jDBzalice$要查看密钥有关详细信息,可以使用以下OpenSSL命令打开.pem文件并显示内容。您可能想知道在哪里可以找到另一个配对密钥,因为这是一个文件。你观察得很仔细。获取公钥的方法如下:alice$opensslrsa-inalice_private.pem-noout-textEnterpassphraseforalice_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:51publicExponent:65537(0x10001)<<截断>>指数2: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系数: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:26alice$第二步:提取公钥注意公钥是可以自由分享给他人的密钥,私钥必须保密所以Alice必须提取她的publickey,并将其保存到文件中:alice$opensslrsa-inalice_private.pem-pubout>alice_public.pemEnterpassphraseforalice_private.pem:writingRSAkeyalice$alice$ls-l*.pem-rw------.1alicealice966Mar2217:44alice_private。pem-rw-rw-r--.1alicealice272Mar2217:47alice_public.pemalice$可以像之前一样查看公钥详情,但是这次输入公钥.pem文件:alice$alice$opensslrsa-inalice_public.pem-pubin-text-nooutRSAPublic-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.pemEnterpassphraseforbob_private.pem:writingRSAkeybob$bob$ls-l*.pem-rw--------.1bobbob986Mar2213:48bob_private.pem-rw-r--r--.1bobbob272Mar2213:51bob_public.pembob$第3步:公开交换keys这些公钥在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.pemalice$bob$ls-lalice_public.pem-rw-r--r--。1bobbob272Mar2213:54alice_public.pembob$第4步:使用公钥交换加密消息假设Alice需要与Bob秘密通信。她将秘密写入文件并将其保存到top_secret.txt。由于这是一个普通文件,任何人都可以打开它并查看其内容,这里没有太多保护:alice$alice$echo"vimoremacs?">top_secret.txtalice$alice$cattop_secret.txtvimoremacs?alice$要加密这个秘密消息,Alice需要使用openssls-encrypt命令。她需要工具的三个输入:秘密消息文件的名称Bob的公钥(文件)的名称加密的新文件的名称alice$opensslrsautl-encrypt-inkeybob_public.pem-pubin-intop_secret.txt-outtop_secret.encalice$alice$ls-ltop_secret.*-rw-rw-r--.1alicealice128Mar2217:54top_secret.enc-rw-rw-r--.1alicealice15Mar2217:53top_secret.txtalice$alice$encrypted,原始文件仍然可见,而新创建的加密文件在屏幕上看起来像乱码。这样,您就可以确定秘密消息已加密:alice$cattop_secret.txtvimoremacs?alice$alice$cattop_secret.enc?s??uM)M&>??N??}dmCy92#1X??q#1025382;。??v????M??@??E??~??1??k~&PU?VhHL?@^P??(??zi??M??4p?e?g+R??1????????????q_8??lr????C??I-??alice$alice$alice$alice$hexdump-C./top_secret.enc000000009e73128fe3754d294d263ebf804ea0c5|.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-..|00000080alice$alice$filetop_secret.enctop_secret.enc:dataalice$删除密文原文件是安全的,这样就没有痕迹了: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.encbob$bob$cattop_secret.enc?uM)M&>??N??}dmCy92#1X??q#1025382;??v????M??@??E??~??1??k~&PU?VhHL?@^P??(??zi?M?4p?e...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-..|00000080bob$第五步:使用私钥解密文件Bob需要使用OpenSSL来解密消息,但是这次使用-decrypt命令行参数他需要向工具程序提供以下信息:加密文件(从Alice那里得到)Bob的私钥(用于解密,因为文件是用Bob的公钥加密的)通过重定向保存解密输出的文件名bob$opensslrsautl-decrypt-inkeybob_private.pem-intop_secret.enc>top_secret.txtEnterpassphraseforbob_private.pem:bob$现在,Bob可以读取Alice发送给他的秘密消息:bob$ls-ltop_secret.txt-rw-r--.1bobbob15Mar2214:02top_secret.txtbob$bob$cattop_secret.txtvimoremacs?bob$Bob需要回复Alice,所以他将秘密回复写在文件中:bob$echo"nanoforlife">reply_secret.txtbob$bob$catreply_secret.txtnanoforlifebob$步骤6:使用重复该过程for其他密钥Bob发送消息的步骤与Alice相同,但由于消息是给Alice的,因此他需要使用Alice的公钥加密文件:bob$opensslrsautl-encrypt-inkeyalice_public.pem-pubin-inreply_secret.txt-outreply_secret.encbob$bob$ls-lreply_secret.enc-rw-r--r---.1bobbob128Mar2214:03reply_secret.encbob$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.enc000000009246dd8704bca72e342201661a1331db|.F......4".f..1.|00000010c45cb48e7b6fd4b024d24d929b497b35|.$..M{.I{5|00000020da7cee5cbb6ccd82f11b9265f18df259|.|.\.l.....e...Y|00000030825681807b89077c2124635e610cae2a|.V..{..|!$c^a..*|00000040d4aa5c76518dcfa03904c1d7dcf0ad99|..\vQ...9.......|0000005027ed8eded9ae027350e0dd2713ae8e5a|'...sP..'...Z|0000006012e49a3157b3036edde1167f6bc0b38b|...1W..n....k...|000000704acf30b8493b3f...844.0.P;I.&:|00000080bob$bob$#removecleartextsecretmessagefilebob$rm-freply_secret.txtBob通过scp将加密文件发送到Alice的工作站:$scpreply_secret.encalice@alice-machine-or-ip:/path/如果Alice尝试使用正常方式读取它工具密文,她将无法理解密文:alice$alice$ls-lreply_secret.enc-rw-r--r--.1alicealice128Mar2218:01reply_secret.encalice$alice$catreply_secret.enc?F切??。4"f?1?\??{o°$?M?I{5?|?\?l??e?Y?V?{?|!$c^a?*o\vQ??9????'???sP??'??Z??1W??nk????J??0??I;P8??????&:alice$alice$alice$alice$hexdump-C./reply_secret.enc000000009246dd8704bca72e342201661a1331db|.F......4".f..1.|00000010c45cb48e7b6fd4b024d24d929b497b35|.\..{o..$.M..I{5|00000020da7cee5cbb6ccd82f11b9265f18df259|.|.\.l.....e...Y|00000030825681807b89077c2124635e610cae2a|.V..{..|!$c^a..*|00000040d4aa5c76518dcfa03904c1d7dcf0ad99|..\vQ...9......|0000005027ED8ED9AE027350EDD2713AE8E5A|'...sp..使用OpenSSL发送消息,只是这次她提供了自己的私钥并将输出保存到文件中:alice$opensslrsautl-decrypt-inkeyalice_private.pem-inreply_secret.enc>reply_secret.txtEnterpassphraseforalice_private.pem:alice$alice$ls-lreply_secret.txt-rw-rw-r--.1alicealice14Mar2218:02reply_secret.txtalice$alice$catreply_secret.txtnanoforlifealice$了解有关OpenSSL的更多信息通过访问OpenSSL文档页面了解使用方法,包括手册链接、《OpenSSL Cookbook》、常见问题解答等。要了解更多信息,请试用它附带的各种加密算法,看看它是如何工作的。
