公钥的应用--加解密(一)
仍然以RSA算法为例,分别讨论
让我们再次祭起屠龙宝剑--OpenSSL工具,让它来给我们展示RSA加解密是怎样操作的。
前已知,进行加密操作需要知道接收方的RSA公钥,和需要加密的明文,然后再进行加密运算,最后得到密文。
公钥从哪里来,就让OpenSSL自动给我们生成吧(当然需要你去执行必要的命令),为了做到这一点,手头必须拥有OpenSSL工具。
至于怎么获取,请google之,网上有N多的文章。其中一种办法,就是到www.openssl.org下载源码包并进行编译(Windows下可以利用VC进行编译),可以得到OpenSSL可执行程序。
当然,如果你用的是Linux,则几乎所有运行Linux内核的操作系统都内置了OpenSSL工具,连编译都免去了。
有了工具,就可以干活了(生成公钥)。作为一个功能强大的密码安全工具,公钥加解密只是OpenSSL的一个典型应用。其他一些密码相关操作,比如对称加密解、Hash函数、证书功能等也包含在其中。不同种类的操作在OpenSSL中分门别类地用不同的子命令进行区分。比如生成RSA公钥请用genrsa子命令。要想知道详细的用法,请三选一:买OpenSSL书、Google相关帖子、查看OpenSSL源代码。
这里顺便说明下笔者的风格:只要网上能够直接搜索得到的相关操作及命令,本Blog一般不会详细讲解,基本拿来直接使用,只会提及大概,需要详细了解的读者朋友们请自己google。还申明一下,对于网上流传的一些特别好的文章,如果对本系列文章的整体构成有所帮助,则会详细说明,并同时说明出处。在此先行谢过这些文章的作者:-)
言归正传,生成RSA密钥对,使用openssl genrsa命令,查看RSA密钥对的命令是openssl rsa,使用RSA密钥对进行加解密操作,则运行的是openssl rsautl命令
openssl genrsa -out myrsakey.pem 1024 ---- 生成1024位的RSA公私钥,保存在文件myrsakey.pem中
openssl rsa -in myrsakey.pem -text ---- 显示保存在文件myrsakey.pem中的RSA密钥对内容
下面是一个例子
Private-Key: (1024 bit)
modulus:
00:c2:72:6c:87:20:32:a9:df:52:9c:7d:c3:de:10:
a7:b4:6d:e1:e5:a9:13:d1:da:e7:7d:3e:99:ae:3b:
13:eb:3c:fb:a6:0e:55:f2:45:3c:26:f2:c0:c4:b1:
51:6f:e7:2d:e6:23:5d:ae:de:f2:32:11:7e:a9:92:
61:c6:f8:9d:c8:58:df:ac:1c:43:dd:43:3b:b1:d3:
2d:03:12:99:72:74:b7:01:4e:5e:e1:97:7d:04:d5:
bb:2c:00:92:21:34:98:5a:90:63:4f:52:0f:07:8c:
61:36:7d:db:ed:73:7e:85:8b:aa:b0:0e:0f:42:48:
b1:58:25:05:de:97:bd:3b:11
publicExponent: 65537 (0x10001)
privateExponent:
57:78:33:9b:e1:7f:08:ed:7d:f3:09:9c:17:83:f4:
7c:f4:c5:1e:93:9d:67:d4:8a:37:cb:f6:43:eb:2d:
7d:af:94:20:51:e8:95:b0:51:6b:cf:dd:a9:5d:7e:
9d:d1:27:d3:93:eb:2b:a3:fc:dd:4b:03:68:72:81:
eb:88:a1:28:db:1e:d5:7a:4a:a6:46:e8:25:62:54:
6a:14:68:1a:b9:0d:30:da:1c:9d:62:f8:56:1e:b5:
36:f8:e0:1b:a8:77:3e:84:73:d9:51:6a:f9:da:bf:
f0:15:68:db:cd:bc:31:26:82:63:cf:ac:af:95:85:
eb:b6:da:a2:ec:e3:2d:71
prime1:
00:df:7e:1a:8a:44:69:a4:29:4d:32:96:31:37:91:
0a:f2:a4:52:cb:37:00:6d:76:bb:81:cc:56:f8:fe:
83:00:9f:f6:ca:bd:fa:e1:bf:88:1d:c2:0e:5f:b9:
22:c7:ab:b1:4c:dd:38:5b:f4:ba:d6:37:b6:46:b5:
3c:b6:70:ab:35
prime2:
00:de:ba:c9:79:55:df:c9:a2:8e:14:17:45:a7:04:
47:4c:a7:08:4e:6f:10:23:1b:2d:a4:f0:5f:35:d5:
50:2a:e5:94:cf:8c:f2:ca:2e:cd:43:e6:80:95:32:
59:cc:10:cd:fc:b0:a2:a7:18:e4:f3:2d:af:0f:89:
fd:3a:00:2f:ed
exponent1:
00:de:9d:bd:d1:fc:53:3e:31:e5:b3:7d:e7:88:71:
f1:75:c0:38:b8:33:11:39:f8:0a:ce:3f:bc:62:49:
22:34:7d:22:56:d0:e6:15:f7:b2:9d:f1:ae:5f:ab:
09:f9:da:0b:c1:84:99:9e:ff:27:1c:3a:62:56:0c:
31:6d:88:cd
exponent2:
43:bc:74:a7:64:f9:61:1e:01:ad:94:82:47:4f:e2:
cb:2a:05:39:ad:47:30:16:04:e4:a3:81:a1:22:95:
75:e6:4a:42:70:b0:29:d2:df:f4:25:76:b7:69:0f:
ac:22:f4:32:44:19:c3:4d:ab:db:54:ea:67:84:64:
b1:ad:fa:e5
coefficient:
00:cd:b2:3f:72:39:fb:e0:b3:54:d6:bf:aa:9b:80:
72:4a:9f:ca:e8:e1:99:38:b2:d2:4f:b3:b0:62:16:
d8:52:cc:ae:57:8f:76:32:b2:07:9f:b4:c7:2e:16:
50:ba:dd:0c:ff:4e:da:ea:70:f4:fe:2c:e4:4a:6e:
6e:c6:ec:25:39
简短说明一下,modulus就是n,prime1和prime2相当于p和q,publicExponent就是加密指数e(e和n构成公钥),privateExponent是私钥d
但是解密时我们通常不直接使用d,因为d往往位数很长,直接进行指数运算解密比较费时,所以又请出了exponent1、exponent2、coefficient来进行解密操作,总的时间消耗比直接计算要小。
由于这三个参数用于解密,所以作为私钥的另一种代表形式,也必须好好保管
加密命令
openssl rsautl -encrypt -raw -in plaintext -inkey myrsakey.pem -out ciphertext
明文(plaintext文件内容,二进制格式) ---- 有心的同学能看出明文的编码格式和用途吗
00000000h: 00 02 E1 F1 62 B7 67 CB 82 3C 74 D8 6D 26 F4 93
00000010h: E9 06 5E 20 71 40 F0 A9 89 3F 7A 6A FB 9D 45 C7
00000020h: 2D 54 51 DD 30 39 B9 0B 11 DB 3E 97 8D C0 F7 41
00000030h: 35 2F 32 07 21 B3 96 A1 BD 95 C1 36 CB 5A C2 84
00000040h: E0 0E FC 82 31 4C 48 FA E2 F2 AC E2 E9 A1 08 00
00000050h: 03 00 CD 8E D0 C5 CE 5D D7 81 28 38 43 21 09 DF
00000060h: ED 33 1B 5B 78 50 95 7F 27 C1 1F 72 07 3E A0 72
00000070h: E5 8B E7 E1 DD FA 3E 11 7C 5A D8 B4 7C 93 8D BD
密文(ciphertext文件内容,二进制格式)
00000000h: BD FE 58 A6 00 5E AC B0 99 3A A8 80 81 E6 12 74
00000010h: CF EF F9 BF E3 CA 47 34 09 CB E0 31 C9 F9 D2 CE
00000020h: E0 09 09 D6 CA C7 1A 4F BB DA 9A 9F 62 D6 1C B9
00000030h: F4 7C 61 DB 9D 24 99 E8 DE A7 87 F3 06 C3 BE C8
00000040h: 17 C5 0D 02 50 D7 87 33 57 12 99 5E E6 1D F5 43
00000050h: DE C2 97 87 CD 54 B1 EA 0E E0 10 AF A8 2B C9 9A
00000060h: 00 59 75 1A 1C A9 AE 06 E8 6F DF 0B 7B E3 3A A4
00000070h: D6 52 62 FB 4A 38 85 6C B1 94 E1 30 25 ED 2E 8D
知道了加密操作,解密只需要openssl rsautl子命令带-decrypt参数就可以了
读者可以用此命令验证前面加密操作的正确性,或者直接用perl脚本来计算验证