从零开始OpenSSL之 (壹) - 使用genrsa、rsa、rsautl生成公私钥
公钥和私钥
在生活中,我们常常会经历加密->解密
的过程。当你在扫码支付、登录用户、进行游戏的时候,大部分数据包传输的都是加密后的数据包。
俗话讲加密
尽我所能,我会将公钥和私钥的概念最简单地讲述出来。
假设A是客户端,B是服务端:
- A使用某些手段生成了一段
完整的私钥
- A使用
完整的私钥
经过某种算法生成了另一段公钥
- A将
公钥
和完整的私钥
给了B
当B想要将东西传给A时:
- B把
公钥
和要传送的文件
乱七八糟地用某种算法掺杂在一起发送给A - 当B发送给A时,如果有黑客拦截了这个
文件
,他只能获得一堆乱码 - 当A收到一堆乱码后,使用
完整的私钥
经过某些算法提取出原文件
由于A和B同时拥有公钥
和私钥
,所以双方都可以使用公钥加密并且使用私钥解密。
OpenSSL
我们可以将OpenSSL理解为一个工具箱,它能实现大部分的密钥加、解密以及更多高级功能。
请注意
在下文中的命令有&&
连接符,为的是让多条命令按顺序执行。
生成私钥
现在,让我们使用OpenSSL生成一段私钥。
在你的Linux或MacOS (Windows需自行安装)中执行下面命令:
1mkdir keys && cd keys
为了方便整理思路,我们只在keys
文件夹下进行操作。
1openssl genrsa -out private.key 1024 && ls && cat private.key
我们使用openssl随机生成一串私钥并导出到private.key
,然后列出当前文件夹下的内容可以看到private.key
,最后抓取private.key
中的内容:
1Generating RSA private key, 1024 bit long modulus
2...................................................................++++++
3...........................++++++
4e is 65537 (0x10001)
5private.key
6-----BEGIN RSA PRIVATE KEY-----
7MIICXAIBAAKBgQC1FTjWrrsokP6DwFL055b0LRdPq1UqcokS7V+jN2EBy79msaG7
8CDOe7d8sgX8f8DYAXNQ58LGulfvFoCJp1Luoah7eYHcgBa5JiHD3wakkMsnveT8f
9tfKziTLg7Yzes9mprA3afVvvH4UfLkAIkC437bCbaAe3E0YF1FmI0RdfrwIDAQAB
10AoGAC6E2Sktkh8FwJyQF7+ajwkDXG23EhXpfpVCLcN8Qot3kCANmgK2RKybZy3Dx
11qipyPWm405PKxYyqY9HaA/P+rUGeYmJHgx4tA/Q30uel6a2T1wFvYbo2b+FzBsLp
12aXi/KVaxLNTx2h3g8gf8DjTt5deBJeW0ZtMp1O9NyFo2hLECQQDfvL6WoCBMYZBG
135M9PJ0IE9CriT91beCfUFn+s53umPsmYBjDde6hZ6f9jkXJ4uNt0crT2YP35Prfl
14lLo00+wJAkEAzzHkYsC2wZ/MdiwNOyueNgO2xCmjczkoBuwTCgRtr/Yaal2xpU74
15BhLT1Eld5JrXbmqE5POhd+XYqNcyPLhL9wJAEpJYP6iLBcwTbc8QZkGb+U1LQf3f
16IfiXVcOIVZHhcatEkJny9G+PSedii6FHHz44+TGMU+c5LbdHDIeL7VaqAQJBAJj+
17hV9qYEj/f5HvG2IK5kuKWIXnHTuzA9yAq9pkxL3/IyhRwSCI/Fo3wtVpy3xH3jY5
18T6JkSGHphh++r+joSacCQAorZDk0lmEiZDkXcC44OmoO283FIGR5qUYMcoCX/AH5
195gCy3NOASL0YBfWw9oi93poIKzwKx/xgHa3VSLioYp4=
20-----END RSA PRIVATE KEY-----
我们可以看到OpenSSL已经成功生成了一串私钥。
生成公钥
公钥是用来和原文件进行混淆传输的,它可以被理解为是私钥的不完整版
。
输入以下命令:
1openssl rsa -in private.key -pubout -out public.key && ls && cat public.key
1-in 使用密钥
2-pubout 输出公钥
3-out 输出名称
openssl rsa的参数如下:
1adler@localhost ~/keys: openssl rsa --help
2Invalid cipher '-help'
3usage: rsa [-ciphername] [-check] [-in file] [-inform fmt]
4 [-modulus] [-noout] [-out file] [-outform fmt] [-passin src]
5 [-passout src] [-pubin] [-pubout] [-sgckey] [-text]
6
7 -check Check consistency of RSA private key
8 -in file Input file (default stdin)
9 -inform format Input format (DER, NET or PEM (default))
10 -modulus Print the RSA key modulus
11 -noout Do not print encoded version of the key
12 -out file Output file (default stdout)
13 -outform format Output format (DER, NET or PEM (default PEM))
14 -passin src Input file passphrase source
15 -passout src Output file passphrase source
16 -pubin Expect a public key (default private key)
17 -pubout Output a public key (default private key)
18 -sgckey Use modified NET algorithm for IIS and SGC keys
19 -text Print in plain text in addition to encoded
本文我们使用了openssl genrsa、rsa、rsautl三种,分别用于生成密钥、加密文件和解密文件,你可以输入
openssl genrsa/rsa/rsautl --help
获取帮助。
你会得到如下结果:
1writing RSA key
2private.key public.key
3-----BEGIN PUBLIC KEY-----
4MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1FTjWrrsokP6DwFL055b0LRdP
5q1UqcokS7V+jN2EBy79msaG7CDOe7d8sgX8f8DYAXNQ58LGulfvFoCJp1Luoah7e
6YHcgBa5JiHD3wakkMsnveT8ftfKziTLg7Yzes9mprA3afVvvH4UfLkAIkC437bCb
7aAe3E0YF1FmI0RdfrwIDAQAB
8-----END PUBLIC KEY-----
你会看到公钥实际上比私钥要少得多。
假装有第二台电脑
实际上我们将文件加密后,是传输到另一台电脑然后使用私钥进行解密的,但本次实验我们略过加密文件的传输,直接进行加密和解密。
将文件加密
让我们新建一个文件,并加入内容:
1echo 'Hello world!' > text.txt && cat text.txt
如果返回Hello world!
证明你的文件创建完毕。
现在,让我们使用公钥对这个文件进行加密:
1openssl rsautl -encrypt -in text.txt -inkey public.key -pubin -out encryptedFile.txt && cat encryptedFile.txt
你可以使用:
openssl rsautl --help
查看全部参数。
1-encrypt 加密文件
2-in 输入文件
3-inkey 输入密钥
4-pubin 表示使用-inkey输入的是公钥
5-out 输出到指定文件
输入命令后,系统会返回已经加密的文本。
现在,假设这段文本已经传输到了另一台服务器上,并且该服务器拥有之前生成的密钥。
解密
当我们使用公钥加密文件并传输后,就需要使用之前获得到的私钥来解密。
如何解密,我们会在第二章详说。你可以点击这里跳转到第二章。
如转载请在文章尾部添加:
原作者来自 adlered 个人技术博客:https://www.stackoverflow.wiki/