解读RSA公钥私钥储存格式
作者:
| 更新日期:ASN1是自描述应用协议的鼻祖.
本文首发于公众号:天空的代码世界,微信号:tiankonguse
大家好,这里是tiankonguse的公众号(tiankonguse-code)。
tiankonguse曾是一名ACMer,现在是鹅厂视频部门的后台开发。
这里主要记录算法,数学,计算机技术等好玩的东西。这篇文章从公众号tiankonguse-code自动同步过来。
如果转载请加上署名:公众号tiankonguse-code,并附上公众号二维码,谢谢。
零、背景
之前在《最安全的加密算法RSA》的密钥生成小节中提到过公钥(yue)和私钥(yue)的数据都采用ASN.1格式表达。
然后我还贴上了我的公钥(yue), 看起来很像《二进制上的明文算法》中介绍的base64编码后的样子。
对于生成过RSA密钥或者看到我贴的公钥时, 不知道大家有没有想过那一串文本是什么?
我是一直有这个疑问的:RSA生成的公钥和私钥不是都是两个大整数吗?怎么变成一串文本了?他们之间有什么关系呢?我怎么得到这两个大整数呢?
是的,我有一连串的问题在头脑中自问自己。
这个问题在我头脑中已经很久了,我今天终于摆脱了拖延症,找到小程恢复我的VPS代理,打开GOOGLE一搜索,一切问题都找到了答案。
今天我们就来聊聊SSH的RSA的公钥密钥储存格式吧。
一、生成公钥密钥
早在13年在腾讯微博实习的时候,我就写过对应的文章《ubuntu ssh无密码登录》。
这篇文章主要介绍怎么生成ssh的公钥,然后后续就不需要每次登陆都填写密码了。
先使用ssh-keygen -b 1024 -t rsa
命令生成密钥对。
skyyuan@skyyuan-PC3:e $ touch /home/skyyuan/.ssh/id_rsa_test
skyyuan@skyyuan-PC3:e $ ssh-keygen -b 1024 -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/skyyuan/.ssh/id_rsa): /home/skyyuan/.ssh/id_rsa_test
/home/skyyuan/.ssh/id_rsa_test already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/skyyuan/.ssh/id_rsa_test.
Your public key has been saved in /home/skyyuan/.ssh/id_rsa_test.pub.
The key fingerprint is:
SHA256:KwT+vVDr4OV996zoX8lwyuoPFz3T9ruZwTn0ZETxGlw skyyuan@skyyuan-PC3
The key's randomart image is:
+---[RSA 1024]----+
| .E|
| . o.|
| . o o|
| . . .+.|
| . . S o.*=|
| o o o . O+B|
| = = . + B+|
| . B o =..o*|
| . + o=++oB+|
+----[SHA256]-----+
然后私钥就会保存在id_rsa_test
中,公钥保存在id_rsa_test.pub
中。
内容如下:
skyyuan@skyyuan-PC3:e $ ll /home/skyyuan/.ssh/id_rsa_test*
-rw-r--r-- 1 skyyuan Domain Users 887 七月 1 14:33 /home/skyyuan/.ssh/id_rsa_test
-rw-r--r-- 1 skyyuan Domain Users 233 七月 1 14:33 /home/skyyuan/.ssh/id_rsa_test.pub
skyyuan@skyyuan-PC3:e $ cat /home/skyyuan/.ssh/id_rsa_test.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCowBQToHN6bkB1j9K9W4eeieYyw8PGTuoo+ZezqnLhgkUbIRDv7xffnOSH4R4ZEtNAMj4qIc1KjS4Nzc1bF6/pplTWf5bOhMOdzVFpZ2YsgE9mahXWCxgYFzQL7j/LNz3QI6Q3o1ZdolTfFOfZRxyxr68J8TkJ90k7+a36Be8ghw== skyyuan@skyyuan-PC3
skyyuan@skyyuan-PC3:e $ cat /home/skyyuan/.ssh/id_rsa_test
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCowBQToHN6bkB1j9K9W4eeieYyw8PGTuoo+ZezqnLhgkUbIRDv
7xffnOSH4R4ZEtNAMj4qIc1KjS4Nzc1bF6/pplTWf5bOhMOdzVFpZ2YsgE9mahXW
CxgYFzQL7j/LNz3QI6Q3o1ZdolTfFOfZRxyxr68J8TkJ90k7+a36Be8ghwIDAQAB
AoGAAroP2P1XwFu1uPCZBCxNdbdeu+VD7Zlq2TynQeT4NEKpoTWYk3f2l8tuOe/e
T6NpPHlTXdTr/09mthxkPBuW4RXwcdZEtLTGjI3UJz8Qu8ofr9CYQ8ODJT4pYyxI
p6XwsWOelgaOIJHw0QHMHWYpk1joexBYIj6Gdj/l5b6OuUECQQDZ78dp7xn+nzR1
M3iRbFKP4CsK6ceYEDGTU2T9Kv+4IZ0qyDgjVCTSRDHBq9zdF8ycRtj45bI9pDuL
C2G6qxWhAkEAxjkd5mKTDD6uY8qF71z/r0q+kTFJuptrZYINRrKqefOB8drgCj7e
JRA0yp+Iy+3Oei/fi/q5eDRoDPAJjxS1JwJAEBdzSvAbpEBPGERHp70uz27G3tRq
J2Eyt+UVdNgC766Tsz/7XShuW5QrdFhjQ3PpaLSWerJDGegReW/KtITDYQJBAKE7
djmd9pPgLEMZSWYQVB0GBAnfeGQj5PBVH21hCE9XpVvPN6q9xj2JeBdUOpX9oZQ7
em7GirPelL/pQy0xn8MCQCizC/ROwNRMspTvIwvotkdfPRvr8j9wovhHxQwVvVHL
VIzqnSp46hm5OH8wpCUp9lSCKreeloEU0MwPZu8kij4=
-----END RSA PRIVATE KEY-----
看了上面的公钥和私钥内容,显然是base64编码的,那为什么使用base64储存呢? 因为实际内容是使用ASN.1标准编码的二进制内容,二进制可读性太差,所以使用base64转化为文本内容。
一、ASN.1标准
在什么是协议文章中,我提到一类自描述应用协议,比如json, xml, protocol buffers,Apache Thrift。
没错,自描述应用协议是我自己自定义的一个词语,今天才知道,原来早在1984年就存在ASN.1标准了, 所以自描述应用协议的官方叫法是ASN.1标准。
由于ASN.1本身只是表示接口数据的通用语法,没有限定编码方法。
在这个标准下,接口数据可以序列化(encode, serialized)也可以反序列化(decode, deserialized), 通常在网络通信以及跨平台通信中使用。
由于ASN.1是个标准,到具体编码时,就分为多种实现方式了, 如BER,CER,DER,PER,XER等等。
而RSA生成的密钥就是使用ASN.1中的DER(Distinguished Encoding Rules)来编码的。
二、再看base64
背景中说了, RSA得到的密钥看起来很像base64, 那我们就需要解码,得到原始的数据了。
可能有人会问为什么储存为base64呢? 答案是PER编码出来的数据是二进制,而在二进制上的明文算法中说过,文本中不能查看二进制。
所以这里就有了base64明文数据了。
刚好之前我自己写了一个base64加密解密函数,可以利用那两个函数来得到实际的二进制数据了。
使用base64解码,然后使用16进制打印出来是下面这个样子。
下面我们一步一步来看这个十六进制数据吧。
skyyuan:test $ ./a.out 0 AAAAB3NzaC1yc2EAAAADAQABAAAAgQCowBQToHN6bkB1j9K9W4eeieYyw8PGTuoo+ZezqnLhgkUbIRDv7xffnOSH4R4ZEtNAMj4qIc1KjS4Nzc1bF6/pplTWf5bOhMOdzVFpZ2YsgE9mahXWCxgYFzQL7j/LNz3QI6Q3o1ZdolTfFOfZRxyxr68J8TkJ90k7+a36Be8ghw==
pkg len:151 iBufLen:151 offset:710
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0000: 00 00 00 07 73 73 68 2d 72 73 61 00 00 00 03 01 ....ssh-rsa.....
0010: 00 01 00 00 00 81 00 a8 c0 14 13 a0 73 7a 6e 40 ............szn@
0020: 75 8f d2 bd 5b 87 9e 89 e6 32 c3 c3 c6 4e ea 28 u...[....2...N.(
0030: f9 97 b3 aa 72 e1 82 45 1b 21 10 ef ef 17 df 9c ....r..E.!......
0040: e4 87 e1 1e 19 12 d3 40 32 3e 2a 21 cd 4a 8d 2e .......@2>*!.J..
0050: 0d cd cd 5b 17 af e9 a6 54 d6 7f 96 ce 84 c3 9d ...[....T......
0060: cd 51 69 67 66 2c 80 4f 66 6a 15 d6 0b 18 18 17 .Qigf,.Ofj......
0070: 34 0b ee 3f cb 37 3d d0 23 a4 37 a3 56 5d a2 54 4..?.7=.#.7.V].T
0080: df 14 e7 d9 47 1c b1 af af 09 f1 39 09 f7 49 3b ....G......9..I;
0090: f9 ad fa 05 ef 20 87 ..... .
三、分析公钥
根据上一小节得到的十六进制,我们现在来分析这个十六进制。
根据rfc3447可以了解到RSA公钥的格式:简单的LV格式(length-value)。
这种格式其实不具备可扩展性,数据的个数和位置约定死了。
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
第一部分如下:
前四字节是字符串长度00 00 00 07
对应与整数7,然后是长度为7的字符串”ssh-rsa”。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0000: 00 00 00 07 73 73 68 2d 72 73 61 ....ssh-rsa
第二部分如下:
前四字节是字符串00 00 00 03
对应整数3,然后是三字节字符串01 00 01
。
这个数字是e, 在《最安全的加密算法RSA》的密钥生成小节中提到过,目前的实现方法为了简单,固定为65537。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0000: 00 00 00 03 01 .....
0010: 00 01 ...
第三部分如下:
前四字节是字符串00 00 00 81
对应整数129,然后后面有129个字节。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0010: 00 00 00 81 00 a8 c0 14 13 a0 73 7a 6e 40 ..........szn@
0020: 75 8f d2 bd 5b 87 9e 89 e6 32 c3 c3 c6 4e ea 28 u...[....2...N.(
0030: f9 97 b3 aa 72 e1 82 45 1b 21 10 ef ef 17 df 9c ....r..E.!......
0040: e4 87 e1 1e 19 12 d3 40 32 3e 2a 21 cd 4a 8d 2e .......@2>*!.J..
0050: 0d cd cd 5b 17 af e9 a6 54 d6 7f 96 ce 84 c3 9d ...[....T......
0060: cd 51 69 67 66 2c 80 4f 66 6a 15 d6 0b 18 18 17 .Qigf,.Ofj......
0070: 34 0b ee 3f cb 37 3d d0 23 a4 37 a3 56 5d a2 54 4..?.7=.#.7.V].T
0080: df 14 e7 d9 47 1c b1 af af 09 f1 39 09 f7 49 3b ....G......9..I;
0090: f9 ad fa 05 ef 20 87 ..... .
四、分析私钥
由于私钥也是base64编码,所以需要我们先转化为二进制数据,这里仍然使用十六进制打印出来。
对于私钥使用了ASN.1的TLV格式,虽然比公钥稍微好了一点,但是由于没有tag的概念,还是扩展性还是不是很友好。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0000: 30 82 02 5c 02 01 00 02 81 81 00 a8 c0 14 13 a0 0..\............
0010: 73 7a 6e 40 75 8f d2 bd 5b 87 9e 89 e6 32 c3 c3 szn@u...[....2..
0020: c6 4e ea 28 f9 97 b3 aa 72 e1 82 45 1b 21 10 ef .N.(....r..E.!..
0030: ef 17 df 9c e4 87 e1 1e 19 12 d3 40 32 3e 2a 21 ...........@2>*!
0040: cd 4a 8d 2e 0d cd cd 5b 17 af e9 a6 54 d6 7f 96 .J.....[....T..
0050: ce 84 c3 9d cd 51 69 67 66 2c 80 4f 66 6a 15 d6 .....Qigf,.Ofj..
0060: 0b 18 18 17 34 0b ee 3f cb 37 3d d0 23 a4 37 a3 ....4..?.7=.#.7.
0070: 56 5d a2 54 df 14 e7 d9 47 1c b1 af af 09 f1 39 V].T....G......9
0080: 09 f7 49 3b f9 ad fa 05 ef 20 87 02 03 01 00 01 ..I;..... ......
0090: 02 81 80 02 ba 0f d8 fd 57 c0 5b b5 b8 f0 99 04 ........W.[.....
00a0: 2c 4d 75 b7 5e bb e5 43 ed 99 6a d9 3c a7 41 e4 ,Mu.^..C..j.<.A.
00b0: f8 34 42 a9 a1 35 98 93 77 f6 97 cb 6e 39 ef de .4B..5..w...n9..
00c0: 4f a3 69 3c 79 53 5d d4 eb ff 4f 66 b6 1c 64 3c O.i<yS]...Of..d<
00d0: 1b 96 e1 15 f0 71 d6 44 b4 b4 c6 8c 8d d4 27 3f .....q.D......'?
00e0: 10 bb ca 1f af d0 98 43 c3 83 25 3e 29 63 2c 48 .......C..%>)c,H
00f0: a7 a5 f0 b1 63 9e 96 06 8e 20 91 f0 d1 01 cc 1d ....c.... ......
0100: 66 29 93 58 e8 7b 10 58 22 3e 86 76 3f e5 e5 be f).X.{.X">.v?...
0110: 8e b9 41 02 41 00 d9 ef c7 69 ef 19 fe 9f 34 75 ..A.A....i....4u
0120: 33 78 91 6c 52 8f e0 2b 0a e9 c7 98 10 31 93 53 3x.lR..+.....1.S
0130: 64 fd 2a ff b8 21 9d 2a c8 38 23 54 24 d2 44 31 d.*..!.*.8#T$.D1
0140: c1 ab dc dd 17 cc 9c 46 d8 f8 e5 b2 3d a4 3b 8b .......F....=.;.
0150: 0b 61 ba ab 15 a1 02 41 00 c6 39 1d e6 62 93 0c .a.....A..9..b..
0160: 3e ae 63 ca 85 ef 5c ff af 4a be 91 31 49 ba 9b >.c...\..J..1I..
0170: 6b 65 82 0d 46 b2 aa 79 f3 81 f1 da e0 0a 3e de ke..F..y......>.
0180: 25 10 34 ca 9f 88 cb ed ce 7a 2f df 8b fa b9 78 %.4......z/....x
0190: 34 68 0c f0 09 8f 14 b5 27 02 40 10 17 73 4a f0 4h......'.@..sJ.
01a0: 1b a4 40 4f 18 44 47 a7 bd 2e cf 6e c6 de d4 6a ..@O.DG....n...j
01b0: 27 61 32 b7 e5 15 74 d8 02 ef ae 93 b3 3f fb 5d 'a2...t......?.]
01c0: 28 6e 5b 94 2b 74 58 63 43 73 e9 68 b4 96 7a b2 (n[.+tXcCs.h..z.
01d0: 43 19 e8 11 79 6f ca b4 84 c3 61 02 41 00 a1 3b C...yo....a.A..;
01e0: 76 39 9d f6 93 e0 2c 43 19 49 66 10 54 1d 06 04 v9....,C.If.T...
01f0: 09 df 78 64 23 e4 f0 55 1f 6d 61 08 4f 57 a5 5b ..xd#..U.ma.OW.[
0200: cf 37 aa bd c6 3d 89 78 17 54 3a 95 fd a1 94 3b .7...=.x.T:....;
0210: 7a 6e c6 8a b3 de 94 bf e9 43 2d 31 9f c3 02 40 zn.......C-1...@
0220: 28 b3 0b f4 4e c0 d4 4c b2 94 ef 23 0b e8 b6 47 (...N..L...#...G
0230: 5f 3d 1b eb f2 3f 70 a2 f8 47 c5 0c 15 bd 51 cb _=...?p..G....Q.
0240: 54 8c ea 9d 2a 78 ea 19 b9 38 7f 30 a4 25 29 f6 T...*x...80.%).
0250: 54 82 2a b7 9e 96 81 14 d0 cc 0f 66 ef 24 8a 3e T.*........f.$.>
既然是有了一个标准,肯定有一些定义了,如下:
0x02 == Integer
0x03 == Bit String
0x04 == Octet String
0x05 == NULL
0x06 == Object Identifier
0x10 == "Sequence" and "Sequence of"
0x11 == "Set" and "Set of"
0x13 == Printable String
0x14 == T61 String
0x16 == IA5 String
0x17 == UTC Time
0x30 82 == ASN1 Sequence
RSA密钥协议如下:
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
有了协议和标准,我们就可以分析这个二进制数据了。
第一部分0X3082代表是ASN.1 Sequence,0X025c为seq值。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0000: 30 82 02 5c 0..\
第二部分0x02代表是一个整数, 0x01代表长度为1,0x00为algorithm version的值。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0000: 02 01 00 ...
第三部分0x02代表是一个整数, 0x81代表长度为129字节代表大素数积n。
后面的0x80可以忽略,这个数字以0x00开头的。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0000: 02 81 81 00 a8 c0 14 13 a0 .........
0010: 73 7a 6e 40 75 8f d2 bd 5b 87 9e 89 e6 32 c3 c3 szn@u...[....2..
0020: c6 4e ea 28 f9 97 b3 aa 72 e1 82 45 1b 21 10 ef .N.(....r..E.!..
0030: ef 17 df 9c e4 87 e1 1e 19 12 d3 40 32 3e 2a 21 ...........@2>*!
0040: cd 4a 8d 2e 0d cd cd 5b 17 af e9 a6 54 d6 7f 96 .J.....[....T..
0050: ce 84 c3 9d cd 51 69 67 66 2c 80 4f 66 6a 15 d6 .....Qigf,.Ofj..
0060: 0b 18 18 17 34 0b ee 3f cb 37 3d d0 23 a4 37 a3 ....4..?.7=.#.7.
0070: 56 5d a2 54 df 14 e7 d9 47 1c b1 af af 09 f1 39 V].T....G......9
0080: 09 f7 49 3b f9 ad fa 05 ef 20 87 ..I;..... .
第四部分0x02代表是一个整数, 0x03代表长度为3,代表公钥中的e.
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0080: 02 03 01 00 01 .....
第五部分0X0281代表后面是整数,长度为129字节,代表私钥中的d.
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0090: 02 81 80 02 ba 0f d8 fd 57 c0 5b b5 b8 f0 99 04 ........W.[.....
00a0: 2c 4d 75 b7 5e bb e5 43 ed 99 6a d9 3c a7 41 e4 ,Mu.^..C..j.<.A.
00b0: f8 34 42 a9 a1 35 98 93 77 f6 97 cb 6e 39 ef de .4B..5..w...n9..
00c0: 4f a3 69 3c 79 53 5d d4 eb ff 4f 66 b6 1c 64 3c O.i<yS]...Of..d<
00d0: 1b 96 e1 15 f0 71 d6 44 b4 b4 c6 8c 8d d4 27 3f .....q.D......'?
00e0: 10 bb ca 1f af d0 98 43 c3 83 25 3e 29 63 2c 48 .......C..%>)c,H
00f0: a7 a5 f0 b1 63 9e 96 06 8e 20 91 f0 d1 01 cc 1d ....c.... ......
0100: 66 29 93 58 e8 7b 10 58 22 3e 86 76 3f e5 e5 be f).X.{.X">.v?...
0110: 8e b9 41 ..A
第六部分是0x0241代表第一个素数,长度为65字节。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0110: 02 41 00 d9 ef c7 69 ef 19 fe 9f 34 75 .A....i....4u
0120: 33 78 91 6c 52 8f e0 2b 0a e9 c7 98 10 31 93 53 3x.lR..+.....1.S
0130: 64 fd 2a ff b8 21 9d 2a c8 38 23 54 24 d2 44 31 d.*..!.*.8#T$.D1
0140: c1 ab dc dd 17 cc 9c 46 d8 f8 e5 b2 3d a4 3b 8b .......F....=.;.
0150: 0b 61 ba ab 15 a1 .a....
第七部分是0x0241代表第二个素数,长度也是65字节。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0150: 02 41 00 c6 39 1d e6 62 93 0c .A..9..b..
0160: 3e ae 63 ca 85 ef 5c ff af 4a be 91 31 49 ba 9b >.c...\..J..1I..
0170: 6b 65 82 0d 46 b2 aa 79 f3 81 f1 da e0 0a 3e de ke..F..y......>.
0180: 25 10 34 ca 9f 88 cb ed ce 7a 2f df 8b fa b9 78 %.4......z/....x
0190: 34 68 0c f0 09 8f 14 b5 27 4h......'
第八部分0x0240代表d mod (p-1)
,长度是64字节。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0190: 02 40 10 17 73 4a f0 .@..sJ.
01a0: 1b a4 40 4f 18 44 47 a7 bd 2e cf 6e c6 de d4 6a ..@O.DG....n...j
01b0: 27 61 32 b7 e5 15 74 d8 02 ef ae 93 b3 3f fb 5d 'a2...t......?.]
01c0: 28 6e 5b 94 2b 74 58 63 43 73 e9 68 b4 96 7a b2 (n[.+tXcCs.h..z.
01d0: 43 19 e8 11 79 6f ca b4 84 c3 61 C...yo....a
第九部分0x0241代表d mod (q-1)
,长度为65字节.
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
01d0: 02 41 00 a1 3b .A..;
01e0: 76 39 9d f6 93 e0 2c 43 19 49 66 10 54 1d 06 04 v9....,C.If.T...
01f0: 09 df 78 64 23 e4 f0 55 1f 6d 61 08 4f 57 a5 5b ..xd#..U.ma.OW.[
0200: cf 37 aa bd c6 3d 89 78 17 54 3a 95 fd a1 94 3b .7...=.x.T:....;
0210: 7a 6e c6 8a b3 de 94 bf e9 43 2d 31 9f c3 zn.......C-1..
第10部分是0x0240代表(inverse of q) mod p
,长度是64字节。
______00_01_02_03_04_05_06_07_08_09_0A_0B_0C_0D_0E_0F
0210: 02 40 .@
0220: 28 b3 0b f4 4e c0 d4 4c b2 94 ef 23 0b e8 b6 47 (...N..L...#...G
0230: 5f 3d 1b eb f2 3f 70 a2 f8 47 c5 0c 15 bd 51 cb _=...?p..G....Q.
0240: 54 8c ea 9d 2a 78 ea 19 b9 38 7f 30 a4 25 29 f6 T...*x...80.%).
0250: 54 82 2a b7 9e 96 81 14 d0 cc 0f 66 ef 24 8a 3e T.*........f.$.>
五、总结
好了,了解了上面的之后我们就可以得到公钥和私钥的大整数数了。
如果自己尝试破解素数积,也可以使用私钥中的数据来检查是否正确。
看openssh和openssl源码的时候,发现代码中没有rsa的话默认使用ed25519加密,于是查了一下资料.
ed25519加密解密很快,生成时间短而且安全性更高,rsa则加密解密稍慢,生成时间长,安全性没有ed25519高,只是rsa以前都是默认,所以用的人更多.
参考资料如下
- X.690: https://en.wikipedia.org/wiki/X.690
- RSA Cryptography Specifications https://tools.ietf.org/html/rfc3447
- Private-Key Information Syntax Specification https://tools.ietf.org/html/rfc5208
对了现在开通了公众号和小密圈。
博客记录所有内容。
技术含量最高的文章放在公众号发布。
比较好玩的算法放在小密圈发布。
小密圈这周接受免费加入,欢迎大家加入看各种算法的思路。
长按图片关注公众号,接受最新文章消息。
本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。