解读RSA公钥私钥储存格式

作者: | 更新日期:

ASN1是自描述应用协议的鼻祖.

大家好,这里是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以前都是默认,所以用的人更多.

参考资料如下

  1. X.690: https://en.wikipedia.org/wiki/X.690
  2. RSA Cryptography Specifications https://tools.ietf.org/html/rfc3447
  3. Private-Key Information Syntax Specification https://tools.ietf.org/html/rfc5208

对了现在开通了公众号和小密圈。
博客记录所有内容。
技术含量最高的文章放在公众号发布。
比较好玩的算法放在小密圈发布。
小密圈这周接受免费加入,欢迎大家加入看各种算法的思路。

长按图片关注公众号,接受最新文章消息。

点击查看评论

关注公众号,接收最新消息

关注小密圈,学习各种算法

tiankonguse +
穿越