rsa 2048 java pem_RSA秘钥的PEM格式解析

我们通常所见到的RSA秘钥时,常见的未加密的格式大概就是PEM格式了。这段格式虽然看起来可读,但是实际上也是一段乱码一样的东西。他们一般格式是下面这几种情况:

-----BEGIN PRIVATE KEY-----

YG6XRKfkcxnaXGfFDWHL....

-----END PRIVATE KEY-----

-----BEGIN RSA PRIVATE KEY-----

YG6XRKfkcxnaXGfFDWHL....

-----END PRIVATE KEY-----

-----BEGIN PUBLIC KEY-----

YG6XRKfkcxnaXGfFDWHL....

-----END PRIVATE KEY-----

-----BEGIN RSA PUBLIC KEY-----

YG6XRKfkcxnaXGfFDWHL....

-----END RSA PUBLIC KEY-----

这些格式看起来都是一样的,但是往往这一点点区别可能影响到我们实际读取。很明显,带有PUBLIC的是RSA的公钥,带有PRIVATE的是RSA的私钥。但是带有RSA和不带有RSA其实是有区别的。头部带有RSA,说明该公/私钥就是RSA的秘钥。头部不带有RSA,说明该公/私钥有可能不是RSA的秘钥。这些头部不带有RSA的秘钥,他们的秘钥类型参数在中间的那段乱码中。

事实上,中间那段乱码是Base64格式的。经过Base64解码之后,是一段二进制格式的数据。这段数据采用的ASN.1的二进制编码格式.

ASN.1

ASN.1 是ISO和ITU-T的联合标准,最初是1984年的CCITT X.409:1984的一部分。由于其广泛的应用,1988年ASN.1移到独立标准X.208, 1995年进行全面修订后变成X.680系列标准。

ASN.1本身只定义了表示信息的抽象句法,但是没有限定其编码的方法。各种ASN.1编码规则提供了由ASN.1描述其抽象句法的数据的值的传送语法(具体表达)。标准的ASN.1编码规则有基本编码规则(BER,Basic Encoding Rules)、规范编码规则(CER,Canonical Encoding Rules)、唯一编码规则(DER,Distinguished Encoding Rules)、压缩编码规则(PER,Packed Encoding Rules)和XML编码规则(XER,XML Encoding Rules)。为了使ASN.1能够描述一些原先没有使用ASN.1定义,因此不适用上述任一编码规则的数据传输和表示的应用和协议,另外制订了ECN来扩展ASN.1的编码形式。ECN可以提供非常灵活的表明方法,但还没有得到普遍应用。

RSA和大部分秘钥的格式都是采用ASN.1 DER编码规则进行编码的。

RSA PUBLIC KEY和PUBLIC KEY区别解析

RSA公钥有两个部分,分别是Modulus和Exponent,例如

Modulus: 297,056,429,939,040,947,991,047,334,197,581,225,628,107,021,573,849,359,042,679,698,093,131,908,015,712,695,688,944,173,317,630,555,849,768,647,118,986,535,684,992,447,654,339,728,777,985,990,170,679,511,111,819,558,063,246,667,855,023,730,127,805,401,069,042,322,764,200,545,883,378,826,983,730,553,730,138,478,384,327,116,513,143,842,816,383,440,639,376,515,039,682,874,046,227,217,032,079,079,790,098,143,158,087,443,017,552,531,393,264,852,461,292,775,129,262,080,851,633,535,934,010,704,122,673,027,067,442,627,059,982,393,297,716,922,243,940,155,855,127,430,302,323,883,824,137,412,883,916,794,359,982,603,439,112,095,116,831,297,809,626,059,569,444,750,808,699,678,211,904,501,083,183,234,323,797,142,810,155,862,553,705,570,600,021,649,944,369,726,123,996,534,870,137,000,784,980,673,984,909,570,977,377,882,585,701

Exponent: 65,537

首先,我们将他们转换为16进制形式

Modulus: EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65

Exponent: 010001

RSA采用ASN.1二进制编码格式来保存这段二进制数据。转换后是这样。

SEQUENCE (2 elements)

INTEGER (2048 bit): 0282010100EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65

INTEGER (12 bit): 010001

最终,我们ASN.1将这个层次结构打包为二进制:

30 82 01 0A ;sequence (0x10A bytes long)

02 82 01 01 ;integer (0x101 bytes long)

00 EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5-D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65

02 03 ;integer (3 bytes long)

010001

然后,我们将这些字节使用base64编码为下面这样的,并加上一个头部和尾部

-----BEGIN RSA PUBLIC KEY-----

MIIBCgKCAQEA61BjmfXGEvWmegnBGSuS+rU9soUg2FnODva32D1AqhwdziwHINFa

D1MVlcrYG6XRKfkcxnaXGfFDWHLEvNBSEVCgJjtHAGZIm5GL/KA86KDp/CwDFMSw

luowcXwDwoyinmeOY9eKyh6aY72xJh7noLBBq1N0bWi1e2i+83txOCg4yV2oVXhB

o8pYEJ8LT3el6Smxol3C1oFMVdwPgc0vTl25XucMcG/ALE/KNY6pqC2AQ6R2ERlV

gPiUWOPatVkt7+Bs3h5Ramxh7XjBOXeulmCpGSynXNcpZ/06+vofGi/2MlpQZNhH

Ao8eayMp6FcvNucIpUndo1X8dKMv3Y26ZQIDAQAB

-----END RSA PUBLIC KEY-----

这就是PEM DER ASN.1 PKCS#1 RSA Public Key的秘钥格式。

后来,非对称加密算法有新的算法出来,例如ECC,DH等。加密组织决定,使用一种通用的格式PKCS#8,即头部是-----BEGIN PUBLIC KEY-----.他们在秘钥Body部分添加了额外的声明ID。RSA的ID是 1.2.840.113549.1.1.1

SEQUENCE (2 elements)

SEQUENCE (2 elements)

OBJECT IDENTIFIER 1.2.840.113549.1.1.1

NULL

BIT STRING (1 element)

SEQUENCE (2 elements)

INTEGER (2048 bit): 0282010100EB506399F5C612F5A67A09C1192B92FAB53DB28520D859CE0EF6B7D83D40AA1C1DCE2C0720D15A0F531595CAD81BA5D129F91CC6769719F1435872C4BCD0521150A0263B470066489B918BFCA03CE8A0E9FC2C0314C4B096EA30717C03C28CA29E678E63D78ACA1E9A63BDB1261EE7A0B041AB53746D68B57B68BEF37B71382838C95DA8557841A3CA58109F0B4F77A5E929B1A25DC2D6814C55DC0F81CD2F4E5DB95EE70C706FC02C4FCA358EA9A82D8043A47611195580F89458E3DAB5592DEFE06CDE1E516A6C61ED78C13977AE9660A9192CA75CD72967FD3AFAFA1F1A2FF6325A5064D847028F1E6B2329E8572F36E708A549DDA355FC74A32FDD8DBA65

INTEGER (12 bit): 010001

最终的ASN.1的二进制是:

30 82 01 22 ;SEQUENCE (0x122 bytes = 290 bytes)

| 30 0D ;SEQUENCE (0x0d bytes = 13 bytes)

| | 06 09 ;OBJECT IDENTIFIER (0x09 = 9 bytes)

| | 2A 86 48 86

| | F7 0D 01 01 01 ;hex encoding of 1.2.840.113549.1.1

| | 05 00 ;NULL (0 bytes)

| 03 82 01 0F 00 ;BIT STRING (0x10f = 271 bytes)

| | 30 82 01 0A ;SEQUENCE (0x10a = 266 bytes)

| | | 02 82 01 01 ;INTEGER (0x101 = 257 bytes)

| | | | 00 ;leading zero of INTEGER

| | | | EB 50 63 99 F5 C6 12 F5 A6 7A 09 C1 19 2B 92 FA

| | | | B5 3D B2 85 20 D8 59 CE 0E F6 B7 D8 3D 40 AA 1C

| | | | 1D CE 2C 07 20 D1 5A 0F 53 15 95 CA D8 1B A5 D1

| | | | 29 F9 1C C6 76 97 19 F1 43 58 72 C4 BC D0 52 11

| | | | 50 A0 26 3B 47 00 66 48 9B 91 8B FC A0 3C E8 A0

| | | | E9 FC 2C 03 14 C4 B0 96 EA 30 71 7C 03 C2 8C A2

| | | | 9E 67 8E 63 D7 8A CA 1E 9A 63 BD B1 26 1E E7 A0

| | | | B0 41 AB 53 74 6D 68 B5 7B 68 BE F3 7B 71 38 28

| | | | 38 C9 5D A8 55 78 41 A3 CA 58 10 9F 0B 4F 77 A5

| | | | E9 29 B1 A2 5D C2 D6 81 4C 55 DC 0F 81 CD 2F 4E

| | | | 5D B9 5E E7 0C 70 6F C0 2C 4F CA 35 8E A9 A8 2D

| | | | 80 43 A4 76 11 19 55 80 F8 94 58 E3 DA B5 59 2D

| | | | EF E0 6C DE 1E 51 6A 6C 61 ED 78 C1 39 77 AE 96

| | | | 60 A9 19 2C A7 5C D7 29 67 FD 3A FA FA 1F 1A 2F

| | | | F6 32 5A 50 64 D8 47 02 8F 1E 6B 23 29 E8 57 2F

| | | | 36 E7 08 A5 49 DD A3 55 FC 74 A3 2F DD 8D BA 65

| | | 02 03 ;INTEGER (03 = 3 bytes)

| | | | 010001

PKCS#1和PKCS#8

上面的RSA PUBLIC KEY是PKCS#1的规范,它的ASN.1编码格式是

RSAPublicKey ::= SEQUENCE {

modulus INTEGER, -- n

publicExponent INTEGER -- e

}

而PUBLIC KEY是PKCS#8的规范,该规范的Key格式适用于多个加密算法。它的ASN.1编码格式是

PublicKeyInfo ::= SEQUENCE {

algorithm AlgorithmIdentifier,

PublicKey BIT STRING ; 其中的BIT STRING是某个算法自己指定的二进制格式

; RSA算法的话,就是上面的RSAPublicKey

}

AlgorithmIdentifier ::= SEQUENCE {

algorithm OBJECT IDENTIFIER,

parameters ANY DEFINED BY algorithm OPTIONAL

}

除了公钥规范外,还有私钥的。PKCS#1的公钥规范是

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

}

PKCS#8的私钥规范是

PrivateKeyInfo ::= SEQUENCE {

version Version,

algorithm AlgorithmIdentifier,

PrivateKey BIT STRING

}

AlgorithmIdentifier ::= SEQUENCE {

algorithm OBJECT IDENTIFIER,

parameters ANY DEFINED BY algorithm OPTIONAL

}

头部的HACK

RSA 公钥的PKCS#8的头部基本上是固定长度的,因为 AlgorithmIdentifier的parameters基本都是NULL,而OBJECT IDENTIFIER是一个固定长度的数据结构,因此头部的长度基本是确定的。如果程序保证一定是RSA秘钥,我们可以通过直接偏移32字节的方式来读取RSA公钥的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值