比特派app钱包下载地址|链克密钥文件格式

比特派app钱包下载地址 2024-03-11 01:15:05

RSA密钥格式解析 - 简书

钥格式解析 - 简书登录注册写文章首页下载APP会员IT技术RSA密钥格式解析消逝在大夜里关注赞赏支持RSA密钥格式解析一、前言

在开发过程中,我们常常遇到用RSA进行加密、解密、签名及验签处理,而在进行这些处理的时候,必须首先到导入我们的密钥(公钥或私钥),而我们拿到的密钥有各种形式,例如:pem、der、cer、Pfx、p12、p7b等等。这里我们常常会有很多疑问,我们的处理代码需要那种格式的密钥?这些不同格式的密钥之间如何相互转化?在格式转化中,往往有牵扯到各种概念,象x509、PKCS#1、PKCS#7、PKCS#8、PKCS12,它们又是什么意思呢?接下来,这篇文章会为你一一梳理这些概念。

二、从分析一个RSA公钥开始

2.1、RSA密钥组成

关于RSA算法的原理这里就不做解释了,这边有一篇阮一峰的文章解释的很清楚,有兴趣的朋友可以去了解一下。RSA密码由三个整数组成,我们分别称之为n、e、d:

(n、d):私钥,这个我们要私密保存。

(n、e):公钥,可以对外公布。

n:模数(Modulus),私钥和公钥都包含有这个数。

e:公钥指数(publicExponent),一般是固定值65537。

d:私钥指数(privateExponent)。

2.2、使用OpenSSL生成一个RSA公钥

使用OpenSSL命名生成一个RSA公钥非常简单,只需要两个命令。

生成一个RSA密钥

openssl genrsa -out private_pkcs1.pem 2048

从生成的RSA密钥中提取RSA公钥

openssl rsa -in private_pkcs1.pem -out public_pkcs1.pem -pubout -RSAPublicKey_out

我们得到了一个PKCS#1形式、PEM格式文件的RSA公钥:

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

MIIBCgKCAQEAnLdoA3ba57YHBAenYbLGTcdC48VVvVVDXV6N/W+1FztBRjvNPV1D

MOcIJBrveTlgKug2PCVynaIttaNql6p/+Bm4G41kyZYy7RSaUCaJ3ryjcXsKfClt

nG9vCwbIN+bVchxRzj739zIA1tBHn9v22PhFcEfsSAy2G2EwM4bQ38n2UrMse9wb

LUGT0kzyquwPQs7vriU+1XBkrdssoAqbwgW5yUqxDosYB5h7D1YTW0qKkJ6PPNnL

XbMv2Meyjxq1sbWoF/m8uboaKklqal1ep5UqTp9OFNOaTrVyXY4Gkt7wq3OoNvk9

2cJ1fHz9wnriGo+oNut9gQr1WVjOzRkAwwIDAQAB

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

下面我们节开始分析这串数据,为了方便,我们这串数据成为 数据2-1。

2.3、RSA公钥解析

拿到 数据2-1 我们可以先提几个问题:

这段数据中包含了哪些信息?

什么叫做PKCS#1形式?

什么叫做PEM格式?

如何从这段数据中提取n、e的值?

2.3.1、什么叫做PEM格式?

我们可以通过OpenSSL命令,导出一个DER格式的公钥

openssl rsa -in private_pkcs1.pem -out public_pkcs1.der -pubout -RSAPublicKey_out -outform DER

public_pkcs1.der是个二进制文件,我们用二级制查看器查看:

CF9739BD-4609-4789-B30B-B984C648336B.png

public_pkcs1.pem 实际与 public_pkcs1.der 包含了完全相同的信息。回顾一下 数据2-1,我们发现这个数据有三部分:“-----BEGIN RSA PUBLIC KEY-----”、中间的数据、“-----END RSA PUBLIC KEY-----”。下面我们把 数据2-1 中间的数据用base解码:

F87D8871-A002-475D-90BB-F2F05D9847C4.png

可以看到,解码后和 public_pkcs1.der 里面的数据完全相同!

实际上,PEM就是把DER格式的数据用base64编码后,然后再在头尾加上一段“-----”开始的标记而已。

2.3.2、ASN.1

上一节我们提到,DER格式的密钥是二进制的数据,那么这段二进制的数据还有没有结构?通过查阅 RFC 8017,我们得到了一个PKCS#1形式的RSA公钥的定义:

RSAPublicKey ::= SEQUENCE {

modulus INTEGER, -- n

publicExponent INTEGER -- e

}

可以看到,PKCS#1形式的RSA公钥定义很简单,只包含n、e值。那这个定义如何帮助我们进一步解析DER格式公钥的二进制数据呢?实际上,上面的定义用的是ASN.1抽象语法标记(Abstract Syntax Notation One),ASN.1用来描述一段二级制数据的结构信息,就像我们用XML来描述文本文件的结构信息一样。我们不能把n、e两个值直接拼接在一起形成二进制公钥,因为这样做公钥的使用者在解析这段公钥的时候就会懵逼。这是什么类型的二级制数据?如果是是一个公钥,那么这个公钥是长度是多少?那段数据是n值,那一段是e值?所以实际上,DER格式公钥除了包含n、e信息以外,还包含了一些结构信息。这些信息我们都是根据上面的ASN.1定义的结构来进行编码和解析。同样的ASN.1定义,可以有多种编码方式:基本编码规则(BER)、可辨别编码规则(DER),这两种编码采取的是同样的规则,只不过BER编码结果不唯一,而DER对BER的规则加了约束使得结果唯一。BER编码的基本原理就是TLV(Type、Length、Value),一段二级制数据,开头几个字节指定了接下来的数据时什么类型的,随后几个字节给出Value部分的长度。然后Value部分里面又可以嵌套TLV,就这样编码下去...

我们的public_pkcs1.der就是采用可辨别编码规则(DER)编码方式。 下面就是我把der里面的二级制数据按照TLV进行格式化一下:

30 82 01 0A

02 82 01 01

00 9C B7 68 03 76 DA E7 B6 07 04 07 A7 61 B2 C6 4D C7 42 E3 C5 55 BD 55 43 5D 5E 8D FD 6F B5 17 3B 41 46 3B CD 3D 5D 43 30 E7 08 24 1A EF 79 39 60 2A E8 36 3C 25 72 9D A2 2D B5 A3 6A 97 AA 7F F8 19 B8 1B 8D 64 C9 96 32 ED 14 9A 50 26 89 DE BC A3 71 7B 0A 7C 29 6D 9C 6F 6F 0B 06 C8 37 E6 D5 72 1C 51 CE 3E F7 F7 32 00 D6 D0 47 9F DB F6 D8 F8 45 70 47 EC 48 0C B6 1B 61 30 33 86 D0 DF C9 F6 52 B3 2C 7B DC 1B 2D 41 93 D2 4C F2 AA EC 0F 42 CE EF AE 25 3E D5 70 64 AD DB 2C A0 0A 9B C2 05 B9 C9 4A B1 0E 8B 18 07 98 7B 0F 56 13 5B 4A 8A 90 9E 8F 3C D9 CB 5D B3 2F D8 C7 B2 8F 1A B5 B1 B5 A8 17 F9 BC B9 BA 1A 2A 49 6A 6A 5D 5E A7 95 2A 4E 9F 4E 14 D3 9A 4E B5 72 5D 8E 06 92 DE F0 AB 73 A8 36 F9 3D D9 C2 75 7C 7C FD C2 7A E2 1A 8F A8 36 EB 7D 81 0A F5 59 58 CE CD 19 00 C3

02 03

01 00 01

然后我们用OpenSSL查看我们密钥的n、e、d值

openssl rsa -in private_pkcs1.pem -text -noout

2F35414D-4C15-4D61-8AB1-FFF1B4CC1313.png

两相比对,我们就可以看出public_pkcs1.der文件的结构。

三、私钥解析

3.1、PKCS#1形式的私钥结构

在RFC 2347中,我们可以得到RSA私钥的ASN.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

}

里面包含了n、e、d值,其他参数都可以通过n、e、d计算得到,这里应该是为了方便用户使用,减少因用户计算方式不正确而导致一些操作的失败,故而直接把各种形式的参数定义在私钥里面。

我们把该私钥的二进制数据格式化,得到如下所示:

30 82 04 A2

02 01

00

02 82 01 01

00 9C B7 68 03 76 DA E7 B6 07 04 07 A7 61 B2 C6 4D C7 42 E3 C5 55 BD 55 43 5D 5E 8D FD 6F B5 17 3B 41 46 3B CD 3D 5D 43 30 E7 08 24 1A EF 79 39 60 2A E8 36 3C 25 72 9D A2 2D B5 A3 6A 97 AA 7F F8 19 B8 1B 8D 64 C9 96 32 ED 14 9A 50 26 89 DE BC A3 71 7B 0A 7C 29 6D 9C 6F 6F 0B 06 C8 37 E6 D5 72 1C 51 CE 3E F7 F7 32 00 D6 D0 47 9F DB F6 D8 F8 45 70 47 EC 48 0C B6 1B 61 30 33 86 D0 DF C9 F6 52 B3 2C 7B DC 1B 2D 41 93 D2 4C F2 AA EC 0F 42 CE EF AE 25 3E D5 70 64 AD DB 2C A0 0A 9B C2 05 B9 C9 4A B1 0E 8B 18 07 98 7B 0F 56 13 5B 4A 8A 90 9E 8F 3C D9 CB 5D B3 2F D8 C7 B2 8F 1A B5 B1 B5 A8 17 F9 BC B9 BA 1A 2A 49 6A 6A 5D 5E A7 95 2A 4E 9F 4E 14 D3 9A 4E B5 72 5D 8E 06 92 DE F0 AB 73 A8 36 F9 3D D9 C2 75 7C 7C FD C2 7A E2 1A 8F A8 36 EB 7D 81 0A F5 59 58 CE CD 19 00 C3

02 03

01 00 01

02 82 01 00

31 56 2C 10 AB 22 4F 40 27 05 45 C3 94 26 4B F7 C0 7B 76 69 71 8C A1 83 0B A9 F0 D9 90 89 5A 3E F5 55 BF 0D E5 FB AE 63 7E D8 39 45 A1 8E 70 59 AE 28 5C AA A2 BF 6A 90 DC 03 0A E7 4B C8 09 71 79 E7 54 05 37 6D 9F 33 79 1F BB 54 F0 4D 07 2A 2B EA 55 E9 FF 1C AB BD 4B F7 91 69 19 2F 40 24 82 40 18 20 EE 01 F2 78 73 7B 2D 26 DF 54 C8 69 95 FF 86 51 9E 39 30 87 44 27 5C 9D 5C 1B F5 D7 88 D4 9D E0 AD 0F 3C B0 A2 EC C8 A6 ED 60 CB DE 44 F9 B7 73 D8 29 4F 38 8C 24 91 29 56 B8 E0 94 0A E2 22 27 5B A4 51 90 BE A9 0E 66 EB A1 5C 68 93 D4 25 64 E3 97 B0 56 E1 9F 07 B6 AD 3F 5E 92 66 BB CC AC 4E 80 46 52 D7 3A 57 0D 52 E5 E9 49 37 62 F7 2E C0 0D C3 92 A6 A6 F6 0F D7 9F 1B 98 3E 20 8E F5 67 ED 19 A9 70 F0 82 F4 73 05 B8 30 01 5E 55 01 64 4E 29 BE 84 0A 38 BD EB F2 27 C1

02 81 81

00 D0 8E EF 5F F7 98 86 28 CC 96 71 53 0A 4D BB 84 02 68 0A E7 19 C6 82 7C 7F E4 F4 44 FB EF 6C 39 33 C1 33 F4 1A 28 72 A6 F3 32 09 6A 3A CD 25 3C A0 C1 28 96 87 2D 52 97 51 D5 9D 63 3A 74 73 D6 13 7B 60 A7 38 F3 84 D3 9D 2B 6E A4 71 DE 65 7F 5A 8F 0D 46 9F 2B F5 B0 64 83 F8 95 56 84 7B BF 04 DF 18 FD 0D DB 2A 55 15 2D 71 54 52 AC BD 19 45 2E 0B 84 AB BD 86 69 AE C0 BC 45 4C 31 4B CD

02 81 81

00 C0 5D 8A 29 17 C5 32 BF 92 B3 94 F1 B1 79 90 3E CE F1 B5 42 BB 4C F4 22 1B CF FB AD 46 92 9B AB 9E 60 73 12 EB 53 84 AC D5 58 7B F7 F7 56 63 FD 3B F1 18 8D 4B 67 BB 98 CB 4A D4 62 B8 5A 08 A0 38 E6 F4 74 7C 56 33 2C 99 38 A5 AB F0 83 C9 06 78 98 18 B9 F8 81 C9 5C 6F E1 82 A1 A1 D5 08 D6 BE 20 90 CA D6 E5 79 F9 DF E1 A7 A2 B0 1E D5 6F F9 3C 68 96 24 29 06 16 22 DA 2A 48 86 F5 8E CF

02 81 80

57 C2 EE 24 1A 12 8A D1 FC 55 8A 56 81 4D 78 8C F2 5E 49 C8 39 E6 78 DE 5F 0B 3F 67 10 05 0E 2B 7C 05 DF 10 E7 39 02 16 12 DC 89 6D B4 54 C3 48 A1 F4 E6 59 81 84 A6 EE 9A 37 23 C5 AF C1 75 45 2E 69 8A A0 93 AC 95 C6 5E AA FA 22 24 F0 8B 11 6E 50 28 2C 01 AB 03 F6 38 35 F8 93 0F 17 2C E3 92 EF 36 9A B6 0B F5 E2 5B C9 05 99 90 38 B4 52 3F F4 42 50 8F DC 6F 05 65 CE 20 EB A0 46 56 39

02 81 80

02 70 6D 33 0E 31 1A EE A0 EE 94 01 E8 8D 31 0E 0A D3 B7 C7 AB D6 52 F6 27 C2 20 5F D7 18 3E CF 13 48 07 CD 82 9C 61 7F 4B 89 3E B1 2B 3A B6 33 DC D1 B6 CC FB DA C9 DF 2B 1C BC CA AF A9 BC 98 43 80 72 33 13 EC 87 E3 95 E1 C9 00 00 21 BB A7 D0 59 A5 5E 9E 4F 0E FD 94 11 98 F5 71 B6 E0 D0 D0 42 5B 73 A6 FB EB EB 06 32 B7 4C 71 CD 42 49 94 30 76 E7 08 78 58 B2 69 28 B9 06 88 67 8E B3

02 81 80

0F 6D 4D 97 25 5A BC 9D F9 B4 4D FF AF 56 09 44 1A D6 CE 8D 27 AA B3 F8 D1 D3 E3 3B B2 77 D4 5A 45 6F DA 62 C3 1D B4 C9 AE 19 84 72 A4 91 A5 F1 5B F3 D6 BC 71 E9 FA 99 BD D5 03 E6 65 78 25 AE CD A8 5B 77 1F 15 60 AC 5F AA 7F C0 29 91 A1 9C 44 91 8B 82 9C 02 4C 4E 73 9A 6D 90 31 44 28 BA ED 5D 7D 1B 6E 4D E2 EB 66 C9 0B 49 FE A5 E7 7E 63 57 D9 BC 67 43 13 1D 26 CF 92 FD 17 74 77 5B

我们通过OpenSSL来查看一下密钥的各参数情况:

openssl rsa -in private_pkcs1.pem -text -noout

Private-Key: (2048 bit)

modulus:

00:9c:b7:68:03:76:da:e7:b6:07:04:07:a7:61:b2:

c6:4d:c7:42:e3:c5:55:bd:55:43:5d:5e:8d:fd:6f:

b5:17:3b:41:46:3b:cd:3d:5d:43:30:e7:08:24:1a:

ef:79:39:60:2a:e8:36:3c:25:72:9d:a2:2d:b5:a3:

6a:97:aa:7f:f8:19:b8:1b:8d:64:c9:96:32:ed:14:

9a:50:26:89:de:bc:a3:71:7b:0a:7c:29:6d:9c:6f:

6f:0b:06:c8:37:e6:d5:72:1c:51:ce:3e:f7:f7:32:

00:d6:d0:47:9f:db:f6:d8:f8:45:70:47:ec:48:0c:

b6:1b:61:30:33:86:d0:df:c9:f6:52:b3:2c:7b:dc:

1b:2d:41:93:d2:4c:f2:aa:ec:0f:42:ce:ef:ae:25:

3e:d5:70:64:ad:db:2c:a0:0a:9b:c2:05:b9:c9:4a:

b1:0e:8b:18:07:98:7b:0f:56:13:5b:4a:8a:90:9e:

8f:3c:d9:cb:5d:b3:2f:d8:c7:b2:8f:1a:b5:b1:b5:

a8:17:f9:bc:b9:ba:1a:2a:49:6a:6a:5d:5e:a7:95:

2a:4e:9f:4e:14:d3:9a:4e:b5:72:5d:8e:06:92:de:

f0:ab:73:a8:36:f9:3d:d9:c2:75:7c:7c:fd:c2:7a:

e2:1a:8f:a8:36:eb:7d:81:0a:f5:59:58:ce:cd:19:

00:c3

publicExponent: 65537 (0x10001)

privateExponent:

31:56:2c:10:ab:22:4f:40:27:05:45:c3:94:26:4b:

f7:c0:7b:76:69:71:8c:a1:83:0b:a9:f0:d9:90:89:

5a:3e:f5:55:bf:0d:e5:fb:ae:63:7e:d8:39:45:a1:

8e:70:59:ae:28:5c:aa:a2:bf:6a:90:dc:03:0a:e7:

4b:c8:09:71:79:e7:54:05:37:6d:9f:33:79:1f:bb:

54:f0:4d:07:2a:2b:ea:55:e9:ff:1c:ab:bd:4b:f7:

91:69:19:2f:40:24:82:40:18:20:ee:01:f2:78:73:

7b:2d:26:df:54:c8:69:95:ff:86:51:9e:39:30:87:

44:27:5c:9d:5c:1b:f5:d7:88:d4:9d:e0:ad:0f:3c:

b0:a2:ec:c8:a6:ed:60:cb:de:44:f9:b7:73:d8:29:

4f:38:8c:24:91:29:56:b8:e0:94:0a:e2:22:27:5b:

a4:51:90:be:a9:0e:66:eb:a1:5c:68:93:d4:25:64:

e3:97:b0:56:e1:9f:07:b6:ad:3f:5e:92:66:bb:cc:

ac:4e:80:46:52:d7:3a:57:0d:52:e5:e9:49:37:62:

f7:2e:c0:0d:c3:92:a6:a6:f6:0f:d7:9f:1b:98:3e:

20:8e:f5:67:ed:19:a9:70:f0:82:f4:73:05:b8:30:

01:5e:55:01:64:4e:29:be:84:0a:38:bd:eb:f2:27:

c1

prime1:

00:d0:8e:ef:5f:f7:98:86:28:cc:96:71:53:0a:4d:

bb:84:02:68:0a:e7:19:c6:82:7c:7f:e4:f4:44:fb:

ef:6c:39:33:c1:33:f4:1a:28:72:a6:f3:32:09:6a:

3a:cd:25:3c:a0:c1:28:96:87:2d:52:97:51:d5:9d:

63:3a:74:73:d6:13:7b:60:a7:38:f3:84:d3:9d:2b:

6e:a4:71:de:65:7f:5a:8f:0d:46:9f:2b:f5:b0:64:

83:f8:95:56:84:7b:bf:04:df:18:fd:0d:db:2a:55:

15:2d:71:54:52:ac:bd:19:45:2e:0b:84:ab:bd:86:

69:ae:c0:bc:45:4c:31:4b:cd

prime2:

00:c0:5d:8a:29:17:c5:32:bf:92:b3:94:f1:b1:79:

90:3e:ce:f1:b5:42:bb:4c:f4:22:1b:cf:fb:ad:46:

92:9b:ab:9e:60:73:12:eb:53:84:ac:d5:58:7b:f7:

f7:56:63:fd:3b:f1:18:8d:4b:67:bb:98:cb:4a:d4:

62:b8:5a:08:a0:38:e6:f4:74:7c:56:33:2c:99:38:

a5:ab:f0:83:c9:06:78:98:18:b9:f8:81:c9:5c:6f:

e1:82:a1:a1:d5:08:d6:be:20:90:ca:d6:e5:79:f9:

df:e1:a7:a2:b0:1e:d5:6f:f9:3c:68:96:24:29:06:

16:22:da:2a:48:86:f5:8e:cf

exponent1:

57:c2:ee:24:1a:12:8a:d1:fc:55:8a:56:81:4d:78:

8c:f2:5e:49:c8:39:e6:78:de:5f:0b:3f:67:10:05:

0e:2b:7c:05:df:10:e7:39:02:16:12:dc:89:6d:b4:

54:c3:48:a1:f4:e6:59:81:84:a6:ee:9a:37:23:c5:

af:c1:75:45:2e:69:8a:a0:93:ac:95:c6:5e:aa:fa:

22:24:f0:8b:11:6e:50:28:2c:01:ab:03:f6:38:35:

f8:93:0f:17:2c:e3:92:ef:36:9a:b6:0b:f5:e2:5b:

c9:05:99:90:38:b4:52:3f:f4:42:50:8f:dc:6f:05:

65:ce:20:eb:a0:46:56:39

exponent2:

02:70:6d:33:0e:31:1a:ee:a0:ee:94:01:e8:8d:31:

0e:0a:d3:b7:c7:ab:d6:52:f6:27:c2:20:5f:d7:18:

3e:cf:13:48:07:cd:82:9c:61:7f:4b:89:3e:b1:2b:

3a:b6:33:dc:d1:b6:cc:fb:da:c9:df:2b:1c:bc:ca:

af:a9:bc:98:43:80:72:33:13:ec:87:e3:95:e1:c9:

00:00:21:bb:a7:d0:59:a5:5e:9e:4f:0e:fd:94:11:

98:f5:71:b6:e0:d0:d0:42:5b:73:a6:fb:eb:eb:06:

32:b7:4c:71:cd:42:49:94:30:76:e7:08:78:58:b2:

69:28:b9:06:88:67:8e:b3

coefficient:

0f:6d:4d:97:25:5a:bc:9d:f9:b4:4d:ff:af:56:09:

44:1a:d6:ce:8d:27:aa:b3:f8:d1:d3:e3:3b:b2:77:

d4:5a:45:6f:da:62:c3:1d:b4:c9:ae:19:84:72:a4:

91:a5:f1:5b:f3:d6:bc:71:e9:fa:99:bd:d5:03:e6:

65:78:25:ae:cd:a8:5b:77:1f:15:60:ac:5f:aa:7f:

c0:29:91:a1:9c:44:91:8b:82:9c:02:4c:4e:73:9a:

6d:90:31:44:28:ba:ed:5d:7d:1b:6e:4d:e2:eb:66:

c9:0b:49:fe:a5:e7:7e:63:57:d9:bc:67:43:13:1d:

26:cf:92:fd:17:74:77:5b

两相比对,结构一目了然。

3.2、PKCS#8形式的私钥结构

前面我们介绍了PKCS#1形式的公钥和私钥,那么什么是PKCS#1形式?什么又是PKCS#8形式呢?实际上,PKCS#1形式的密钥专指RSA的密钥,如果一个ECC的密钥就无法用PKCS#1形式来表达。那么有没有一个通过的机构既可以表示RSA密钥,又可以表示ECC的密钥呢?有,这个就是PKCS#8形式的密钥。

在RFC 5208中,我们可以找到PKCS#8密钥的ASN.1定义,如下:

PrivateKeyInfo ::= SEQUENCE {

version Version,

privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},

privateKey PrivateKey,

attributes [0] Attributes OPTIONAL

}

二进制结构如下:

30 82 04 BC

02 01 00

30 0D

06 09

2A 86 48 86 F7 0D 01 01 01

05 00

04 82 04 A6

30 82 04 A2

02 01 00

02 82 01 01

00 9C B7 68 03 76 DA E7 B6 07 04 07 A7 61 B2 C6 4D C7 42 E3 C5 55 BD 55 43 5D 5E 8D FD 6F B5 17 3B 41 46 3B CD 3D 5D 43 30 E7 08 24 1A EF 79 39 60 2A E8 36 3C 25 72 9D A2 2D B5 A3 6A 97 AA 7F F8 19 B8 1B 8D 64 C9 96 32 ED 14 9A 50 26 89 DE BC A3 71 7B 0A 7C 29 6D 9C 6F 6F 0B 06 C8 37 E6 D5 72 1C 51 CE 3E F7 F7 32 00 D6 D0 47 9F DB F6 D8 F8 45 70 47 EC 48 0C B6 1B 61 30 33 86 D0 DF C9 F6 52 B3 2C 7B DC 1B 2D 41 93 D2 4C F2 AA EC 0F 42 CE EF AE 25 3E D5 70 64 AD DB 2C A0 0A 9B C2 05 B9 C9 4A B1 0E 8B 18 07 98 7B 0F 56 13 5B 4A 8A 90 9E 8F 3C D9 CB 5D B3 2F D8 C7 B2 8F 1A B5 B1 B5 A8 17 F9 BC B9 BA 1A 2A 49 6A 6A 5D 5E A7 95 2A 4E 9F 4E 14 D3 9A 4E B5 72 5D 8E 06 92 DE F0 AB 73 A8 36 F9 3D D9 C2 75 7C 7C FD C2 7A E2 1A 8F A8 36 EB 7D 81 0A F5 59 58 CE CD 19 00 C3

02 03

01 00 01

02 82 01 00

31 56 2C 10 AB 22 4F 40 27 05 45 C3 94 26 4B F7 C0 7B 76 69 71 8C A1 83 0B A9 F0 D9 90 89 5A 3E F5 55 BF 0D E5 FB AE 63 7E D8 39 45 A1 8E 70 59 AE 28 5C AA A2 BF 6A 90 DC 03 0A E7 4B C8 09 71 79 E7 54 05 37 6D 9F 33 79 1F BB 54 F0 4D 07 2A 2B EA 55 E9 FF 1C AB BD 4B F7 91 69 19 2F 40 24 82 40 18 20 EE 01 F2 78 73 7B 2D 26 DF 54 C8 69 95 FF 86 51 9E 39 30 87 44 27 5C 9D 5C 1B F5 D7 88 D4 9D E0 AD 0F 3C B0 A2 EC C8 A6 ED 60 CB DE 44 F9 B7 73 D8 29 4F 38 8C 24 91 29 56 B8 E0 94 0A E2 22 27 5B A4 51 90 BE A9 0E 66 EB A1 5C 68 93 D4 25 64 E3 97 B0 56 E1 9F 07 B6 AD 3F 5E 92 66 BB CC AC 4E 80 46 52 D7 3A 57 0D 52 E5 E9 49 37 62 F7 2E C0 0D C3 92 A6 A6 F6 0F D7 9F 1B 98 3E 20 8E F5 67 ED 19 A9 70 F0 82 F4 73 05 B8 30 01 5E 55 01 64 4E 29 BE 84 0A 38 BD EB F2 27 C1

02 81 81

00 D0 8E EF 5F F7 98 86 28 CC 96 71 53 0A 4D BB 84 02 68 0A E7 19 C6 82 7C 7F E4 F4 44 FB EF 6C 39 33 C1 33 F4 1A 28 72 A6 F3 32 09 6A 3A CD 25 3C A0 C1 28 96 87 2D 52 97 51 D5 9D 63 3A 74 73 D6 13 7B 60 A7 38 F3 84 D3 9D 2B 6E A4 71 DE 65 7F 5A 8F 0D 46 9F 2B F5 B0 64 83 F8 95 56 84 7B BF 04 DF 18 FD 0D DB 2A 55 15 2D 71 54 52 AC BD 19 45 2E 0B 84 AB BD 86 69 AE C0 BC 45 4C 31 4B CD

02 81 81

00 C0 5D 8A 29 17 C5 32 BF 92 B3 94 F1 B1 79 90 3E CE F1 B5 42 BB 4C F4 22 1B CF FB AD 46 92 9B AB 9E 60 73 12 EB 53 84 AC D5 58 7B F7 F7 56 63 FD 3B F1 18 8D 4B 67 BB 98 CB 4A D4 62 B8 5A 08 A0 38 E6 F4 74 7C 56 33 2C 99 38 A5 AB F0 83 C9 06 78 98 18 B9 F8 81 C9 5C 6F E1 82 A1 A1 D5 08 D6 BE 20 90 CA D6 E5 79 F9 DF E1 A7 A2 B0 1E D5 6F F9 3C 68 96 24 29 06 16 22 DA 2A 48 86 F5 8E CF

02 81 80

57 C2 EE 24 1A 12 8A D1 FC 55 8A 56 81 4D 78 8C F2 5E 49 C8 39 E6 78 DE 5F 0B 3F 67 10 05 0E 2B 7C 05 DF 10 E7 39 02 16 12 DC 89 6D B4 54 C3 48 A1 F4 E6 59 81 84 A6 EE 9A 37 23 C5 AF C1 75 45 2E 69 8A A0 93 AC 95 C6 5E AA FA 22 24 F0 8B 11 6E 50 28 2C 01 AB 03 F6 38 35 F8 93 0F 17 2C E3 92 EF 36 9A B6 0B F5 E2 5B C9 05 99 90 38 B4 52 3F F4 42 50 8F DC 6F 05 65 CE 20 EB A0 46 56 39

02 81 80

02 70 6D 33 0E 31 1A EE A0 EE 94 01 E8 8D 31 0E 0A D3 B7 C7 AB D6 52 F6 27 C2 20 5F D7 18 3E CF 13 48 07 CD 82 9C 61 7F 4B 89 3E B1 2B 3A B6 33 DC D1 B6 CC FB DA C9 DF 2B 1C BC CA AF A9 BC 98 43 80 72 33 13 EC 87 E3 95 E1 C9 00 00 21 BB A7 D0 59 A5 5E 9E 4F 0E FD 94 11 98 F5 71 B6 E0 D0 D0 42 5B 73 A6 FB EB EB 06 32 B7 4C 71 CD 42 49 94 30 76 E7 08 78 58 B2 69 28 B9 06 88 67 8E B3

02 81 80

0F 6D 4D 97 25 5A BC 9D F9 B4 4D FF AF 56 09 44 1A D6 CE 8D 27 AA B3 F8 D1 D3 E3 3B B2 77 D4 5A 45 6F DA 62 C3 1D B4 C9 AE 19 84 72 A4 91 A5 F1 5B F3 D6 BC 71 E9 FA 99 BD D5 03 E6 65 78 25 AE CD A8 5B 77 1F 15 60 AC 5F AA 7F C0 29 91 A1 9C 44 91 8B 82 9C 02 4C 4E 73 9A 6D 90 31 44 28 BA ED 5D 7D 1B 6E 4D E2 EB 66 C9 0B 49 FE A5 E7 7E 63 57 D9 BC 67 43 13 1D 26 CF 92 FD 17 74 77 5B

四、证书

4.1、证书的类型

证书有三种类型:X.509证书、PKCS#7证书、PKCS#12证书

4.2、X.509证书

X.509只包含公钥,没有私钥,这种证书一般公开发布,可用于放在客服端使用,用于加密、验签。它的ASN.1定义如下:

Certificate ::= SEQUENCE {

tbsCertificate TBSCertificate,

signatureAlgorithm AlgorithmIdentifier,

signatureValue BIT STRING

}

TBSCertificate ::= SEQUENCE {

version [0] EXPLICIT Version DEFAULT v1,

serialNumber CertificateSerialNumber,

signature AlgorithmIdentifier,

issuer Name,

validity Validity,

subject Name,

subjectPublicKeyInfo SubjectPublicKeyInfo,

issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,

-- If present, version MUST be v2 or v3

subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,

-- If present, version MUST be v2 or v3

extensions [3] EXPLICIT Extensions OPTIONAL

-- If present, version MUST be v3

}

SubjectPublicKeyInfo ::= SEQUENCE {

algorithm AlgorithmIdentifier,

subjectPublicKey BIT STRING

}

4.3、PKCS#12证书

因为X.509证书只包含公钥,但有些时候我们需要把私钥和公钥合并成一个证书,放在服务端使用,用于解密、签名。

PKCS#12就定义了这样一种证书,它既包含了公钥有包含了私钥。典型的入pfx、p12证书就是PKCS#12证书。

4.4、PKCS#7证书

当你收到一个网站的证书后,你需要验证其真实性。因为一个X.509证书包含了公钥、持有人信息、签名。为了验证其真实性,你需要签证其签名,而验证签名则需要签发的CA机构的公钥证书。同样原理,当你拿到CA机构的公钥证书后,你也需要验证该CA机构的真实性,而验证该CA机构的证书,你需要该CA上级机构的CA公钥证书...以此类推,你需要一直验证到根证书为止。

5740AAFE-450B-4150-98CE-EBC1A9ADE838.png

所以为了验证一个网站证书的真实性,你需要的不仅一张证书,而是一个证书链。而PKCS#7就定义了这样一个证书链的类型结构。典型如p7b后缀名的证书就是这样的格式。

下图是苹果网站的证书链:

DC755EA0-70C2-4607-B9F2-30279C687B3E.png

5、用OpenSSL命令行处理各种类型间的转换

5.1、密钥处理

RSA私钥生成(==> PKCS#1)

openssl genrsa -out private_pkcs1.pem 2048

RSA公钥提取

openssl rsa -in private_pkcs1.pem -out public_pkcs8.pem -pubout

openssl rsa -in private_pkcs1.pem -out public_pkcs1.pem -pubout -RSAPublicKey_out

openssl rsa -in private_pkcs8.pem -out public_pkcs8.pem -pubout

openssl rsa -in private_pkcs8.pem -out public_pkcs1.pem -pubout -RSAPublicKey_out

RSA公钥格式转换(PKCS#8 ==> PKCS#1)

openssl rsa -in public_pkcs8.pem -out public_pkcs1.pem -pubin -RSAPublicKey_out

RSA私钥格式转换(PKCS#1 ==> PKCS#8)

openssl pkcs8 -in private_pkcs1.pem -out private_pkcs8.pem -topk8 -nocrypt

RSA私钥格式转换(PKCS#8 ==> PKCS#1)

openssl rsa -in private_pkcs8.pem -out private_pkcs1.pem

RSA公钥编码格式转换(PKCS#8:PEM ==> DER)

openssl rsa -pubin -in public_pkcs8.pem -out public_pkcs8.der -outform DER

openssl rsa -in private_pkcs8.pem -out private_pkcs1.der -outform DER

查看私钥及公钥n、e、d

输出到命令行窗口

openssl rsa -in private_pkcs8.pem -text

openssl rsa -in private_pkcs1.pem -text

openssl rsa -in public_pkcs8.pem -text -pubin

openssl rsa -in public_pkcs1.pem -text -pubin (命令报错,不可执行)

输出到文件

openssl rsa -in private_pkcs8.pem -text -out out.txt

从pfx文件中提取私钥(==> PKCS#8)

openssl pkcs12 -in demo_749054.pfx -nocerts -nodes -out private_pkcs8.pem

5.2、X.509证书处理

创建

1.生成私钥

openssl genrsa -out private_pkcs1.pem 4096

2.生成证书签名请求(CSR)

openssl req -new -key private_pkcs1.key -out certificate_csr.csr

3.使用上一步的证书签名请求签发证书

openssl x509 -req -days 365 -in certificate_csr.csr -signkey private_pkcs1.key -out certificate.pem

openssl x509 -req -days 365 -in certificate_csr.csr -signkey private_pkcs1.key -out certificate.der -outform DER

以上三个步骤也可以通一个简单的方法,实现一步创建私钥和证书(此种方式生成的私钥必须加密):

openssl req -new -x509 -newkey rsa:4096 -keyout private_pkcs1.pem -out certificate.der

查看证书内容

openssl x509 -in certificate.pem -text

openssl x509 -in certificate.pem -text -noout (不输出文件本身内容)

openssl x509 -in certificate.der -inform DER -text

5.3、PKCS7证书处理

从 p7b 文件中提取所有证书(PKCS7 ==> X.509?)

openssl pkcs7 -inform DER -in certificate_pkcs7.p7b -out certificate.pem -print_certs

从提取的证书中提取公钥(X.509? ==> PKCS8)

openssl x509 -in certificate.pem -pubkey -noout > public_pkcs8.pem

5.4、PKCS12证书处理

移除 pfx 证书密钥

运行下面命令,第一次输入原证书密码,第二次数据新证书密码(直接回车表示无密码)

openssl pkcs12 -in encrypted.pfx -out decrypted.pfx

从 pfx 证书中导出密钥 (pfx ==> PKCS8)

openssl pkcs12 -in certificate_p12.pfx -out private_pkcs8.pem -nodes -nocerts

从 pfx 证书中导出密钥及证书 (pfx ==> PKCS8、X.509)

openssl pkcs12 -in certificate_p12.pfx -out private_pkcs8.pem -nodes

根据密钥及证书导出pfx

openssl pkcs12 -inkey private_pkcs1.pem -in certificate.pem -out p12.pfx -export

5.5、ASN.1 解析

解析公钥(PKCS#1)

openssl asn1parse -in public_pkcs1.pem

openssl ans1parse -in certificate.pem

openssl ans1parse -in certificate.der -inform DER

最后编辑于 :2019.06.11 11:50:27©著作权归作者所有,转载或内容合作请联系作者人面猴序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...沈念sama阅读 146,067评论 1赞 309死咒序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...沈念sama阅读 62,478评论 1赞 260救了他两次的神仙让他今天三更去死文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...开封第一讲书人阅读 97,028评论 0赞 215道士缉凶录:失踪的卖姜人 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...开封第一讲书人阅读 41,647评论 0赞 186港岛之恋(遗憾婚礼)正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...茶点故事阅读 49,531评论 1赞 263恶毒庶女顶嫁案:这布局不是一般人想出来的文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...开封第一讲书人阅读 39,131评论 1赞 182城市分裂传说那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...沈念sama阅读 30,705评论 2赞 279双鸳鸯连环套:你想象不到人心有多黑文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...开封第一讲书人阅读 29,477评论 0赞 174万荣杀人案实录序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...沈念sama阅读 32,842评论 0赞 218护林员之死正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...茶点故事阅读 29,556评论 2赞 223白月光启示录正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...茶点故事阅读 30,888评论 1赞 234活死人序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...沈念sama阅读 27,356评论 2赞 219日本核电站爆炸内幕正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...茶点故事阅读 31,824评论 3赞 214男人毒药:我在死后第九天来索命文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...开封第一讲书人阅读 25,713评论 0赞 9一桩弑父案,背后竟有这般阴谋文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...开封第一讲书人阅读 26,147评论 0赞 170情欲美人皮我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...沈念sama阅读 33,880评论 2赞 236代替公主和亲正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...茶点故事阅读 34,047评论 2赞 240推荐阅读更多精彩内容openssl 密钥生成和解析最近,在写java读取key的时候遇到了一个version的问题。不解,就各种找资料,这里总结一下. ANS.1编...kamiSDY阅读 12,182评论 1赞 6PKI知识点整理1 基础 1.1 对称算法 描述:对称加密是指加密过程和解密过程使用相同的密码。主要分:分组加密、序列加密。 原理...御浅永夜阅读 2,168评论 1赞 4非对称加密证书及编码格式简介一. 证书 目前总的来说有三种常用的证书格式:X.509证书、PKCS#12证书和PKCS#7证书。X.509证书...飘荡着呢阅读 2,856评论 0赞 1什么是数字证书数字证书就是网络通讯中标志通讯各方身份信息的一系列数据,其作用类似于现实生活中的身份证。它是由一个权威机构发行的,...拉肚阅读 20,936评论 1赞 17证书文件编码格式介绍转:https://blog.csdn.net/mycoolx/article/details/6730435 O...right_33cb阅读 3,433评论 0赞 0评论1赞1515赞16赞赞赏更

4. 公私钥对(RSA,SM2)格式 以及存储 - Zzangg - 博客园

4. 公私钥对(RSA,SM2)格式 以及存储 - Zzangg - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

Zzangg

 

公告

日历

导航

博客园

首页

新随笔

新文章

联系

订阅

管理

 

4. 公私钥对(RSA,SM2)格式 以及存储

公私钥对(RSA,SM2)格式 以及存储

目录

私钥存储

RSA

格式

存储

生成密钥

派生公钥

格式转换

私钥

私钥的PKCS #8格式存储

SM2

格式

存储

生成私钥

派生公钥

DER格式转化

pkcs #8格式的sm2

参考

私钥存储

私钥保存形式主要包括,文件形式、密码设备形式和软件系统形式。

当采用文件形式保存私钥时,私钥的安全性通常采用口令进行保护,同时基于口令可对私钥文件迹行加密存储。当系统侧用私钥进行签名或解密时,需要将该私钥文件读入内存或密码模块中进行密码运算。为保护私钥的安全性,通常使用口令对私钥文件进行加密保护。

当采用密码设备形式保存私钥时,密码设备可提供安全机制保护私钥存储的安全性和私钥访问的安全性。

RSA

p126、p152、p222

PKCS#1:RSA密码标准

一 格式

RSA公钥参数格式的ANS.1描述

RSA私钥参数的ANS.1描述

PKCS #8 格式下私钥的信息的ASN.1描述

二 存储

1. 使用OpenSSL生成长度为2048的私钥 : private_pkcs1.pem

openssl genrsa -out private_pkcs1.pem 2048

2. 从私钥中派生RSA的公钥 : public_pkcs1.pem

openssl rsa -in private_pkcs1.pem -out public_pkcs1.pem -pubout -RSAPublicKey_out

.pem格式

3. 将公钥转换成DER格式

openssl rsa -in private_pkcs1.pem -out public_pkcs1.der -pubout -RSAPublicKey_out -outform DER

DER格式是ASN.1标准化编码规则的一种。这里可以看见DER格式的公钥显示出来的是一堆乱码。我们使用ASN1view查看一下他的内容

结果

这里可以看见,生成的公钥完全符合PKCS #1定义下的ASN.1描述

它的结构是这样的

30 82 01 0A

02 82 01 01

00 bb 98 88 c7 26 e8 0d fd 13 6b 42 7b 17 6f 1e d6 9c bc 7b 93 68 eb 59 b3 ea 44 17 09 61 ba 18 f7 61 d9 b7 c8 fb 9d 4d 2a 01 4d 2b 37 50 06 d4 d1 b6 9c 1f 4b 14 6f 93 0d a1 9d 7c c6 e3 fe d9 af 5c 5a db 10 1f 3e 59 c5 89 cb 55 70 3c 02 1b a7 cb d0 33 71 58 8a 10 10 0b 31 67 76 8f 0b 74 1c d0 8b 37 09 78 a9 87 8a ee 3a 82 80 c0 63 95 19 80 14 bf bb 3e 0b fa 3c e8 d1 dd 34 fb b5 ea 93 53 8c 1e fc 96 82 01 6d ec 89 c5 43 0e f6 17 ad e9 2d 7a fe e2 05 13 eb 39 5f f7 b0 d9 fa dd 4f c9 f1 45 8b 0e d7 ef 5a 1d 7f 67 96 14 07 f9 6e 9d 2e 2f d2 82 11 15 e5 41 b0 d7 3d c0 9d f9 69 17 f9 9d 24 d1 09 9e 95 1c db d1 22 27 18 45 fe 30 c6 fb 2f 3f 83 5e 5f c1 87 f1 86 19 d7 e4 db d1 a0 00 b8 85 f4 77 7e cc 2d 4e b8 4c d4 7a 1f 68 2e e5 fb a1 39 40 6f 6a c8 68 67 13 15 ab 3d

02 03

10 00 01

DER编码分析

RSAPublicKey为SEQUENCE结构类型,编码规则为DER定长模式。对于标识串,采用低标识编码方式,只需要一个字节。SEQUENCE的tag为0x10;class选择universal,则第7、8位位0,SEQUENCE为结构类型,则位6位1。因此标识符为0x30。

modulus和publicExponent都是INTRGER,所以标识都为0x02。

长度计算,按照下图可知。RSAPublicKey的长度为0x010A,modulus的长度为0x0101,publicExponent的长度为0x03

使用OpenSSL查看密钥的n、e、d

openssl rsa -in private_pkcs1.pem -text -noout

结果如何下

跟通过ASN1view得到的结果完全完全一致

4. 私钥的ASN.1结果

使用ASN1view查看私钥

与标准结构不同的是,asn1view中只显示了9个INTEGER。经过比对私钥中缺少的是标准中的最后一项。并且标准中的version,在私钥中被定义成了INTEGER。

私钥描述

version

类型INTEGER 02

长度 01

内容 00

modulus

类型INTEGER 02

长度 82 01 01

内容 00 bb 98 88 c7 26 e8 0d fd 13 6b 42 7b 17 6f 1e d6 9c bc 7b 93 68 eb 59 b3 ea 44 17 09 61 ba 18 f7 61 d9 b7 c8 fb 9d 4d 2a 01 4d 2b 37 50 06 d4 d1 b6 9c 1f 4b 14 6f 93 0d a1 9d 7c c6 e3 fe d9 af 5c 5a db 10 1f 3e 59 c5 89 cb 55 70 3c 02 1b a7 cb d0 33 71 58 8a 10 10 0b 31 67 76 8f 0b 74 1c d0 8b 37 09 78 a9 87 8a ee 3a 82 80 c0 63 95 19 80 14 bf bb 3e 0b fa 3c e8 d1 dd 34 fb b5 ea 93 53 8c 1e fc 96 82 01 6d ec 89 c5 43 0e f6 17 ad e9 2d 7a fe e2 05 13 eb 39 5f f7 b0 d9 fa dd 4f c9 f1 45 8b 0e d7 ef 5a 1d 7f 67 96 14 07 f9 6e 9d 2e 2f d2 82 11 15 e5 41 b0 d7 3d c0 9d f9 69 17 f9 9d 24 d1 09 9e 95 1c db d1 22 27 18 45 fe 30 c6 fb 2f 3f 83 5e 5f c1 87 f1 86 19 d7 e4 db d1 a0 00 b8 85 f4 77 7e cc 2d 4e b8 4c d4 7a 1f 68 2e e5 fb a1 39 40 6f 6a c8 68 67 13 15 ab 3d

publicExponent

类型 INTEGER 02

长度 03

内容 01 00 01

privateExponent

类型 INTEGER 02

长度 82 10 00

内容 50 7e a6 0a 16 56 b2 51 ea 78 36 c1 8c 8f a0 c2 e3 e4 38 7e 4b 21 d9 8e ca b1 c6 d4 be bb 54 a5 29 b6 7b 16 e1 68 60 c8 ea 60 0b 70 23 85 9a e2 15 a2 2e 07 50 50 83 df f0 7e 1c 21 57 89 6e 2c c1 cb 36 7e 57 79 b0 99 83 83 dd 38 58 77 6b 18 77 ea f1 77 ec 4e e9 8f 88 cd fd 20 31 46 ef de c1 59 4b 17 64 50 12 19 fa 18 df 10 91 fc e8 e8 55 3e 11 fb 2d 27 84 8b 88 37 2c dc e4 38 ed da e6 08 70 b8 81 d7 ca e3 05 8e 57 93 27 d6 40 f1 70 d6 de 0c ca ab 7b ac e3 4a 7d 1d 5e b7 0d 65 18 f7 d6 6c 09 3b c0 ed ef 51 ff 28 56 4e 2c 23 be 42 62 64 69 e9 cd f4 52 d3 3d 83 91 33 e3 12 47 1b 2c c0 10 57 36 8b 23 ec 1c f6 6c ae 06 f5 e3 b0 2b 9f f7 73 7e 1f 5b 06 b2 13 56 ae 52 57 1f 22 59 85 5a 33 9f 9a 8c 47 af 9e de 69 83 34 98 c9 1e ca c7 f1 56 6f 62 e8 7f 79 e9 d2 e6 e1

prime1(p)

类型 INTEGER 02

长度 81 81

内容 00 f8 a0 64 59 36 3e cb f4 ce c8 2f d4 a4 7a 8d 38 aa 3a 3d 08 6c a8 77 63 85 63 e0 47 dc 74 8e d5 f0 dc a2 19 c0 ca bf 08 15 a6 4d a9 e9 16 e9 7c 06 e1 89 5a 3b c4 e9 ce a0 2d 97 92 32 68 8b e8 8c 04 a7 cc c7 39 9c 4b f0 1c ca 77 0b f6 e3 e5 8d 4e 65 0e 47 3e 90 a0 c6 d2 89 ae 2d 19 52 e6 24 51 09 33 31 43 c9 8b be 5f f5 55 f5 e4 b9 7f 01 68 4c bd 3c eb 3d 75 d0 ff 30 46 94 2e 9b a5

prime2(q)

类型 INTEGER 02

长度 81 81

内容 00 c1 28 c9 e0 c1 83 3e d7 a2 4f 26 bc b3 d3 6d 9e ee d1 75 bb e5 e7 f2 5d 20 50 2a f7 3b fd 37 37 12 03 bd 1f f0 d7 af 97 26 c1 4f 36 23 82 2f bf 38 af d1 6c 0b b9 39 75 d6 66 24 45 32 b9 2b dd 41 5b c8 ae 0c 2a f6 95 a8 86 3f 9b 21 ef 8b 71 f7 28 bc 94 af 14 d7 55 59 91 19 92 34 02 84 c3 bf bd 21 b5 90 53 d7 f5 e9 d9 a8 73 c5 c4 b4 94 e5 0b 4c 2e ef bb ad a1 cd a4 04 ce 81 b7 9d b9

exponent1

类型 INTEGER 02

长度 81 80

内容 40 0f 63 8b b0 f4 61 2c c4 92 c3 f0 30 28 fb 76 1c 36 41 3f 88 6f a7 c3 56 bd 33 2e 90 d8 df 6c b4 50 c4 db 89 d7 33 7d 6b c6 9b c0 29 b4 a3 98 37 55 a9 44 3c 9e 31 f7 f1 41 8e 0a 37 3e c4 bd b8 46 02 ce 3a 8e d7 7c a1 73 69 9f 5e cf d0 4c 77 2a 39 d3 81 fb d6 db f6 1e 8d 26 f9 ab ca b6 4d a9 2b 8b ab 27 e2 28 45 77 08 09 8b ff d0 e3 ae 83 27 32 a3 1d a1 8a 57 bd 48 bd 06 b5 33 99

exponent2

类型 INTEGER 02

长度 81 81

内容 00 ae 9c 9c c2 5c ac b4 66 62 07 83 51 1a 8e 8a 8e 1d fd a3 9c 94 1c b5 6f 92 02 66 94 d0 d9 fa cc 01 b0 f7 8a a4 41 96 2d e1 8e e6 78 5e 69 15 98 9b 39 f4 ea e3 3e 31 bf 60 6d 3d 64 80 91 fc 21 2b 30 39 9d 7c ca 69 d6 a8 5d 93 aa 3d 67 3a 7b 6f 9e 97 bb 20 fa 8a 1e 51 b5 65 94 51 07 e5 d4 be c3 ce 71 3f 63 4b da b5 e7 58 ec 2f 5f be 8e ca ef 07 93 76 8c 06 4e 3a 83 87 04 d7 26 91 a1

coefficient

类型 INTEGER 02

长度 81 81

内容 00 d5 a5 84 48 e8 69 89 d7 58 14 ea 34 7f 57 59 50 1c 30 5c fc fb f8 8c 4b dd 1e ec 81 a4 63 ff 17 2e cb 18 84 4f 40 75 ad e4 ff 50 a5 e8 5c cc 65 c2 b4 74 60 ba 26 e5 3f 98 16 fe 30 0c c5 1f 8c c4 a4 7c 80 be e6 8f cc ff 53 52 05 c1 f3 22 ed 17 7f 08 64 3b a9 28 8b ae df 42 0b 58 5d 5d 75 18 33 dd 71 15 71 25 52 84 49 a3 a9 4e 1e 5f 05 5e 9e c4 3f 9c 96 b9 af a8 99 83 80 3f 58 57 f7 42

5. PKCS #8的RSA私钥存储

PKCS #8规定私钥单独以文件形式存储的格式

私钥密文格式使用ASN.1描述

encryptedAlgorithm是密码算法标识,用于加密私钥。密钥通常为对称密钥,通常由口令产生。encryptedData保存加密后的私钥。私钥明文首先使用PrivateKeyInfo形式编码,由encryptedAlgorithm所标识的对称密码算法加密后保存到encryptedData中。

PrivateKeyInfo的ASN.1描述

RSA密钥的PKCS #8存储的ASN.1的描述

将pkcs #1格式的RSA私钥转换成pkcs #8

openssl pkcs8 -topk8 -inform PEM -outform PEM -nocrypt -in private_pkcs1.pem -out private_pkcs8.pem ,不对私钥进行加密

使用ASN1view查看private_pkcs8.pem

encryptedData

在ASN.1view中被选中的浅蓝色区域就是私钥明文的一部分。

encryptedAlgorithm

version

缺省置为0

尝试生成被加密的pkcs #8格式私钥

openssl pkcs8 -topk8 -inform PEM -outform PEM -passout pass:20201326 -in private_pkcs1.pem -out private_pkcs8_2.pem,加密密码:20201326

ASN1view查看

与前面未加密的相比在第二部分多了很多内容。

第一部分

结构

PrivateKeyAlgorithmIdentifier ::= SEQUENCE {

algorithm OBJECT IDENTIFIER,

parameters ANY DEFINED BY algorithm OPTIONAL }

转换给定具体数值后,该部分的ASN.1描述结构如下:

30 57 -- AlgorithmIdentifier 结构整体长度

06 09 2a 86 48 86 f7 0d 01 05 0d -- Object Identifier (OID) 1.2.840.113549.1.5.13 (pbkdf2WithHMACSHA1)

30 4a --参数部分讲述

30 29 -- AlgorithmParameters 结构长度

06 09 2a 86 48 86 f7 0d 01 05 0c

30 1c -- PBKDF2-params 结构长度

04 08 -- salt 长度

b5 82 a5 ba 16 d4 1a 3b -- salt

02 02 -- iterations 长度

08 00 -- iterationCount = 2048

30 0c -- prf - AlgorithmIdentifier 结构长度

06 08 -- PBKDF2-prf OBJECT IDENTIFIER 长度

2a 86 48 86 f7 0d 02 09 05 00 - OID=1.2.840.113549.2.9 (HMAC-SHA256)

其中,algorithm字段表示该私钥的加密算法,由OID确定,这里的OID为1.2.840.113549.1.5.13,表示使用PBKDF2进行密钥派生。parameters字段是可选字段,表示加密算法所需的参数,这里使用了PBKDF2的参数。parameters字段的具体结构包含了salt、iterationCount和PRF(Pseudo-Random Function)三部分,表示密钥派生中的盐值、迭代次数和伪随机函数。salt是一个8个字节长的随机数值;iterationCount表示密钥派生循环次数,这里的值为2048;PRF表示伪随机函数,这里采用HMAC-SHA256。

encryptedData

这里明显的发现内容被加密了,与明文不同

SM2

p128、p152、

格式

《SM2密码算法使用规范》规定了SM2的算法和公/私钥格式,在国家标准中能够查到

SM2公钥格式用ASN.1描述

SM2私钥格式用ASN.1描述

存储

生成一个长为2048的私钥

openssl ecparam -genkey -name SM2 -out private_sm2_key.pem

派生公钥

openssl ec -in private_sm2_key.pem -pubout -out public_sm2_key.pem

将公私钥转换成DER格式

公钥:openssl ec -in public_sm2_key.pem -pubin -outform der -out public_sm2_key.der

私钥:openssl ec -in private_sm2_key.pem -outform der -out private_sm2_key.der

公钥

第一个OBJECT IDENTIFIRE:公钥参数

第二个OBJECT IDENTIFIRE:算法标识符

BIT STRING:SM2公钥坐标

私钥

INTEGER :私钥的版本号

OCTET STRING:私钥参数集

Context[0]:算法标识符

Context[1]:私钥的值

将SM2密钥存储格式转为PKCS #8

pkcs #8对密钥的描述

公钥

openssl pkey -inform PEM -in private_sm2_pkcs8.pem -pubout -outform PEM -out public_sm2_pkcs8.pem

私钥

openssl pkcs8 -topk8 -inform PEM -in private_sm2_key.pem -outform PEM -nocrypt -out private_sm2_pkcs8.pem

30 81 87 -- PrivateKeyInfo 结构整体长度

02 01 00 -- version,值为 0

30 13 -- AlgorithmIdentifier 结构长度

06 07 2a 86 48 ce 3d 02 01 -- Object Identifier (OID) 1.2.840.10045.2.1 (ECDSA with SHA-1)

06 08 2a 81 1c cf 55 01 82 2d -- Object Identifier (OID) 1.2.156.10197.1.2.2 (SM2 encryption and signature algorithm)

04 6d -- 私钥长度,值为 109

30 6b -- ECPrivateKey 结构长度

02 01 01 -- 私钥版本号,值为 1

04 20 -- 私钥 (d) 长度,值为 32

53 11 10 26 01 d9 77 49 9e 85 8d ce 9d a3 47 00 a3 a4 2b d1 b1 99 0d 76 dd 1e ab 8f e2 86 ef 3c

a1 44 03 42

a0 3c -- 曲线参数部分

30 3a -- ECParameters 结构长度

06 07 2a 86 48 ce 3d 02 01 -- Object Identifier (OID) 1.2.840.10045.3.1.7 (SM2 curve)

02 01 00 -- 椭圆曲线版本号,值为 0

30 2c -- 椭圆曲线参数部分长度

06 08 2a 81 1c cf 55 01 82 2d -- Object Identifier (OID) 1.2.156.10197.1.2.2 (SM2 encryption and signature algorithm)

02 20 -- 曲线参数 (a) 长度,值为 32

c7 53 01 0c 62 aa 95 68 19 c5 bf 19 d7 91 07 d7 bd 6e d5 36 44 88 a7 4c 1b 16 aa 2e 8a f8 5d fe

02 20 -- 曲线参数 (b) 长度,值为 32

84 71 46 57 c0 c7 de aa 43 7e 58 5e ba e5 02 c8 57 70 62 06 03 c5 42 72 9c 18 86 7b 1e be 26 eb

asn1view的结果对比标准来看,是满足pkcs#8的标准的。这里生成的pkcs#8的公/私钥没有经过加密。如果想要尝试加密可以参考PKCS #8的RSA私钥存储中的对RSA的加密存储。

参考

GB/T 35276-2017

PKI/CA与数字证书技术大全

RSA密钥格式解析

cursor以及其他AI产品

posted on

2023-06-08 23:39 

Zzangg 

阅读(2064) 

评论(0) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

 

Copyright © 2024 Zzangg

Powered by .NET 8.0 on Kubernetes

博客园

区块链-密钥的格式_试说明区块链系统中常用的私钥格式及各自代表的含义。-CSDN博客

>

区块链-密钥的格式_试说明区块链系统中常用的私钥格式及各自代表的含义。-CSDN博客

区块链-密钥的格式

最新推荐文章于 2023-08-12 09:30:54 发布

朝歌1122

最新推荐文章于 2023-08-12 09:30:54 发布

阅读量2.5k

收藏

1

点赞数

1

分类专栏:

区块链

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_40452317/article/details/90179186

版权

区块链

专栏收录该内容

69 篇文章

8 订阅

订阅专栏

目录:https://blog.csdn.net/qq_40452317/article/details/88541373

私钥格式

一下是常用的一些私钥中使用的三种格式。十六进制和原始的二进制格式用在软件的内部,很少展示给用户看。WIF格式用在钱包之间密钥的输入和输出,也用于代表私钥的二维码(条形码)。

 

Raw原意是"未加工"。RAW格式的全称是RAW Image Format,在编程中称之为原始。

十六进制,简写为hex。

WIF(wallet import format),钱包导入格式。

Private key to WIF compressed(压缩)

This is how we can find the WIF from a private key:

private_key = '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f'

decoded_private_key = bitcoin.decode_privkey(private_key, 'hex')

wif = bitcoin.encode_privkey(decoded_private_key, 'wif')

# 5HpHgWkLaovGWySEFpng1XQ6pdG1TzNWR7SrETvfTRVdKHNXZh8

This  is how to get the WIF compressed :

private_key = '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f'

compressed_private_key = private_key + '01'

wifcomp1 = bitcoin.encode_privkey(bitcoin.decode_privkey(private_key, 'hex'), \

'wif_compressed')

# KwDidQJHSE67VJ6MWRvbBKAxhD3F48DvqRT6JRqrjd7MHLBjGF7Vor

关于如何将私钥转成WIF格式看:https://blog.csdn.net/qq_40452317/article/details/90180009

Same key,different formats. 

公钥格式

公钥也可以多种格式,分为压缩格式和非压缩格式。

前面得到公钥是在椭圆曲线上的一个点,由一对坐标(x,y)组成。公钥通常表示为前缀04紧接着两个256比特的数字。其中一个256比特数字是公钥的x坐标,另一个256比特数字是y坐标。前缀0是用来区分非压缩格式公钥, 压缩格式公钥是以02或者03开头。

下面是由前文中的私钥所生成的公钥,其坐标x和y如下:

x=F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A

y=07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

下面是同样的公钥以520比特的数字(130个十六进制数字)来表达。这个520比特的数字以前缀04开头,紧接着是x及y坐标,组成格式为04xy:

K= 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

 

优惠劵

朝歌1122

关注

关注

1

点赞

1

收藏

觉得还不错?

一键收藏

知道了

0

评论

区块链-密钥的格式

目录:https://blog.csdn.net/qq_40452317/article/details/88541373私钥格式一下是常用的一些私钥中使用的三种格式。十六进制和原始的二进制格式用在软件的内部,很少展示给用户看。WIF格式用在钱包之间密钥的输入和输出,也用于代表私钥的二维码(条形码)。Raw原意是"未加工"。RAW格式的全称是RAW Image Forma...

复制链接

扫一扫

专栏目录

基于区块链的密钥更新和可信定位系统.pdf

08-16

#资源达人分享计划#

区块链-私钥和公钥简介

朝歌

05-09

8819

目录:https://blog.csdn.net/qq_40452317/article/details/89646633

密码学在希腊语中是“秘密写作”的意思,但密码学这门科学不仅只包含被称之为秘密写作的加密学。 密码学也可以用来证明秘密的知识,而不会泄露秘密(数字签名),或证明数据的真实性(数字指纹)。 这些类型的加密证明是比特币中关 键的数学工具并在比特币应用程序中被广泛使用。具有讽刺...

参与评论

您还未登录,请先

登录

后发表或查看评论

由浅及深了解区块链之:(2)公钥私钥,时间戳,哈希值,数字签名

weixin_42373888的博客

09-28

3520

上一节普及了区块链中比特币的基本知识,接下来就要介绍其中涉及到的专业术语了

1:公钥,私钥

公钥和私钥是通过一种算法得到一对密钥对(一个叫公钥,一个叫私钥),两者常常用于网络安全之中的信息加密和解密。公钥可以理解为公开的钥匙,私钥相应的可以理解为私人的钥匙。例如张三要发一封绝密邮件到王五的手上,这份邮件的处理过程为:张三用王五的公钥加密这份文件后然后发给王五,王五收到加密文件后用自己的私钥进行解密...

ARC4加密库

寒冰屋的专栏

06-21

1412

在这篇文章中,您将了解有关ARC4算法的详细信息以及如何在您的项目中使用ARC4加密库。您将看到加密和解密数据的示例,以及使用加密流的示例。

区块链资产「地址、密码、私钥、助记词、Keystore 」

小单的博客专栏

07-26

1833

随着国内区块链交易平台的逐步关闭,区块链资产钱包的使用会越来越频繁和重要,国内最好的以太系钱包当属 imToken,在使用钱包时,有几个名词必须理解深刻……

WIF私钥

JackieDYH的博客

03-16

418

公钥一般来说是椭圆曲线上的x,y坐标拼接在一起的。压缩的公钥其实就是x的坐标,因为有了椭圆曲线还有x,顺理成章就可以求出y

WIF私钥的生成逻辑如下图

version我们这里设置为16进制的80

如果privateKey对应的公钥是被压缩过的,那么privateKey后面要加上16进制的01

区块链中privateKey为32个字节(256位)

func generatePrivateKey(hexprivatekey string,compressed bool) []byte{

.

DES加密

m0_74422124的博客

03-10

1132

DES是一种将64比特的明文加密成64比特密文的对称密码算法,密钥长度56比特。64比特的单位称为分组,DES是分组密码的一种。DES,又称Feistel密码,在Feistel网络中,加密的各个步骤称为轮,整个加密过程就是进行若干次轮的循环。(R0和K1,经过轮运算,再与L0异或。一)IP置换,按照初始置换表,将原来的64位二进制重新排序。(将原始数据第58位的数转化为第一个,将原始数据50的数转化为第二个......)二)16轮的轮函数F变换。

BTC不同格式私钥的相互转换

橙子君的博客

07-07

1万+

BTC不同格式私钥的相互转换

前言:众所周知,比特币常见到的私钥格式有三种,分别是16进制格式的,WIF格式,以及WIF压缩格式。它们的本质是一样的,但是它们之间应该如何进行转换呢?请看正文~

这里以 精通BTC一书中的例子做转换介绍,原始数据如下:

//16进制私钥

1e99423a4ed27608a15a2616a2b0e9e52ced330ac530edcc32c8ffc6a526aedd

...

读取sm国密算法公私钥

大申在努力的专栏

01-13

8404

1生成国密SM2公私钥

国密公钥格式:公钥为64位,前后各32位,对应椭圆算法中BigInteger X 和 BigInteger X ,私钥为32位,对应算法中的BigInteger d。

公私钥生成算法,网上有多种,这里采用最简单一种,使用支付宝开放平台工具,直接生成

工具地址

https://docs.open.alipay.com/291/105972/

2.java读取公钥

...

序列密码体制——密码学笔记(三)

weixin_40397257的博客

07-27

1564

一、密码学中的随机数

许多密码系统的安全性都依赖于随机数的生成,例如DES加密算法中的密钥,RSA加密和数字签名中的素数。

序列密码的保密性完全取决于密钥的随机性。

如果密钥是真正的随机数,则这种体制在理论上就是不可破译的。但这种方式所需的密钥量大得惊人,在实际上是不可行的。目前一般采用伪随机序列来代替随机序列作为密钥序列,也就是序列存在着一定的循环周期。这样序列周期的长短就成为保密性的关键。如果周期足够长,就会有...

区块链系统:什么是私钥?

目前专注区块链相关技术的学习与分享

03-19

1572

在比特币中,私钥本质上就是一个256位的随机整数。我们以JavaScript为例,演示如何创建比特币私钥。在JavaScript中,内置的Number类型使用56位表示整数和浮点数,最大可表示的整数最大只有。其他语言如Java一般也仅提供64位的整数类型。要表示一个256位的整数,只能使用数组来模拟。使用这个库来表示任意大小的整数。下面的代码演示了通过ECPair创建一个新的私钥后,d我们把它打印出来:注意:每次运行上述程序,都会生成一个随机的ECPair,即每次生成的私钥都是不同的。

区块链名词解释:私钥、助记词、keystore

lidiya007的博客

10-12

2332

  在我们注册以太坊钱包的时候,会遇到一系列的名词,如私钥、助记词、keystore等。如果不了解这些概念以及它们的重要性,很多人的操作可能会对自己存放在钱包里的资金造成风险。今天我们把这几个概念说明一下。

  首先说私钥。私钥是钱包最重要的信息!私钥是钱包最重要的信息!私钥是钱包最重要的信息!重要的事情说三遍。别人如果掌握了你的私钥,就等于掌握了你的钱包——他可以通过私钥,把你的钱包导入i...

区块链系统探索之路:私钥的压缩和WIF格式详解

最新发布

tyler_download的专栏

08-12

1185

在前面章节中,我们详细介绍了公钥的压缩,在比特币网络中,一个私钥可以对应两个地址,一个地址是由未压缩公钥所生成的地址,另一个就是由压缩公钥所创建的地址,从公钥到区块链地址的转换算法,我们在这里给出详细描述和代码实现,本节我们看看私钥的压缩以及相关的WIF数据格式。搞笑的是私钥”压缩“后,其长度反而比压缩前增加了一个字节。而“压缩”方法也相当简单,就是在私钥末尾增加一个字节01,例如如果私钥的数据为...

密钥格式梳理

Starr

02-04

2766

der\pem, crt/cer, x509

RSA公私钥各种格式(包括加密)转换以及验签过程

08-18

功能如下:

1、转换各种PEM(XML)格式公私钥,可以根据私钥获取公钥(pkcs8一般java用,xml格式一般C#用)

2、签名数据

3、验签并获取签名前的数据

3、公私钥格式加密或去密(支持大量对称算法,包括淘汰的)

4、生成RSA公私钥对

软件调用OpenSSL相关函数,ui使用Qt5.9(不支持xp),遵循LGPL协议。

支持win7以上的32或64位系统

私钥与WIF(钱包导入格式)

朝歌

05-13

5143

私钥转导入钱包格式–private key–>wallet import format

1-私钥

例如:`0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D

2-增加0x80版本号到私钥的前面

例如:`800C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89...

python加密解密方法

热门推荐

一碗烈酒的博客

12-29

1万+

base64解密

def get_base64(str_to_base64): # base64解密

return base64.b64decode(str_to_base64)

MD5加密

def get_md5(str): # md5加密

return hashlib.md5(str.encode()).hexdigest()

...

区块链原理学习之二-私钥公钥和地址

sunhaidong886的专栏

08-31

9257

比特币属于加密货币,其加密的基础是加密学。秘钥分为公钥和私钥,其成对出现。公钥用于交易中的收款确认,类似于银行交易中的“收款方”。私钥用于数字签名,确认交易的所有权,类似于银行交易中的“签名”。加密基础算法主要分为幂加密和椭圆曲线加密,比特币的加密原理采用后者。此种加密算法的特点是从一方到另一方交易实现,反之则较难实现。

私钥和公钥的生成算法:1)由随机算法形成私钥 2)根据椭圆算法由私钥形

区块链-高级密钥和地址

朝歌

05-17

1764

目录:https://blog.csdn.net/qq_40452317/article/details/89646633

摘自《精通比特币》

1、加密私钥(BIP0038)

私钥必须保密。私钥的机密性需求情况是,在实践中相当难以实现,因为该需求与同样重要的安全对象可用性相互矛盾。当你需要为了避免私钥丢失而存储备份时,会发现维护私钥私密性是一件相当困难的事情。

通过密码加密存有私钥的...

区块链密码学算法有哪些

06-02

对称加密算法是一种使用相同密钥进行加密和解密的算法。在区块链中,对称加密算法常用于保护数据的机密性,比如保护交易信息等。 3. 非对称加密算法:RSA、ECC等。 非对称加密算法是一种使用公钥和私钥进行加密和...

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

朝歌1122

CSDN认证博客专家

CSDN认证企业博客

码龄6年

暂无认证

239

原创

2万+

周排名

161万+

总排名

94万+

访问

等级

1万+

积分

347

粉丝

460

获赞

74

评论

2264

收藏

私信

关注

热门文章

windows系统日志查看

36396

python-OverflowError: Python int too large to convert to C long

35838

python-NameError: name '_name_' is not defined(主函数)

26577

V神(Vitalik Buterin),区块链名人—以太坊(Eth)创始人简介

22518

区块链- Merkle树

21691

分类专栏

其它

6篇

ctf

1篇

php

8篇

js

7篇

渗透测试

1篇

web安全

1篇

Python

12篇

人脸识别

1篇

C语言

20篇

数据结构

16篇

算法

42篇

区块链

69篇

c++

35篇

c

3篇

QT

18篇

network

89篇

AI

6篇

solidity

1篇

css

5篇

html

7篇

程序人生

11篇

密码学

8篇

android

1篇

微信小程序开发

3篇

以太坊

7篇

安全

1篇

最新评论

区块链-不对称可撤销承诺

Tonyqwe123:

如果一方无条件的(不论对方是否作弊)执行撤销操作来获取通道的余额又该如何限制?

算法-蛮力法-最近对问题

捧着风、:

我有文本且写了呢,可以运行出来,但是运行结果里面没有各点坐标,只有最近距离,他的代码需要后期自己修改

算法-蛮力法-最近对问题

ns_daywalker:

有没有可能你没有“close.text”也没有在里面写点的坐标

算法-蛮力法-最近对问题

ns_daywalker:

请问为什么ind1,ind2没有初始化值也能传到函数里面使用

算法-蛮力法-最近对问题

ns_daywalker:

有没有可能你没有“close.text”也没有在里面写你的点坐标

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Ubuntu上火狐浏览器无法上网的解决方法

国内外20多个科研论文下载神器(科研小白成长记 番外篇)

审稿+写作经验总结:研究生易范的学术论文写作错误与不足

2020年16篇

2019年257篇

2018年30篇

目录

目录

分类专栏

其它

6篇

ctf

1篇

php

8篇

js

7篇

渗透测试

1篇

web安全

1篇

Python

12篇

人脸识别

1篇

C语言

20篇

数据结构

16篇

算法

42篇

区块链

69篇

c++

35篇

c

3篇

QT

18篇

network

89篇

AI

6篇

solidity

1篇

css

5篇

html

7篇

程序人生

11篇

密码学

8篇

android

1篇

微信小程序开发

3篇

以太坊

7篇

安全

1篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

(PKCS1) RSA 公私钥 pem 文件解析 - 知乎

(PKCS1) RSA 公私钥 pem 文件解析 - 知乎切换模式写文章登录/注册(PKCS1) RSA 公私钥 pem 文件解析hahaha1. 概述在公钥密码学(也称为 非对称密码术)中,加密机制依赖于两个相关的密钥,一个公钥和一个私钥。公钥用于加密消息,而只有私钥的所有者才能解密消息。 在本教程中,我们将了解如何从 PEM 文件中读取公钥和私钥。首先,我们将研究有关公钥密码学的一些重要概念。然后,我们将学习如何解析 PEM 文件。2. 概念在开始之前,让我们先了解一些关键概念。X.509 是定义公钥证书格式的标准。 因此,这种格式描述了其他信息中的公钥。DER是最流行的编码格式,用于在文件中存储 X.509 证书、PKCS8 私钥等数据。这是一种二进制编码,无法使用文本编辑器查看生成的内容。PKCS8是用于存储私钥信息的标准语法。可以选择使用对称算法对私钥进行加密。 该标准不仅可以处理 RSA 私钥,还可以处理其他算法。PKCS8 私钥通常通过 PEM 编码格式进行交换。PEM是 DER 证书的 base-64 编码机制。PEM 还可以对其他类型的数据进行编码,例如公钥/私钥和证书请求。PEM 文件还包含描述编码数据类型的页眉和页脚,举例如下:-----BEGIN RSA PRIVATE KEY-----...Base64 encoding of the DER encoded certificate...-----END RSA PRIVATE KEY-----3:解析PEM证书1:示例证书:-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQDnsN1F66mF6h6y/XpyN+ZU/w5AyeWBjZNIqi33/ATn4qQpw+kDHrKyF7sQ/RNw6tibM90iM6VOA14305umPbPROJJs3JoB6Lao74SUm58aO9T+Ct7rO52E+3r5jyDQicdRl6lIhLigNADXPD/KoNwfrRrCyw4wTHMZhSHc8eUHeQIDAQABAoGABVTIgqddiztL4Yp7ms02e5Yy2cLLiSOc0/s2e5JM+pj4dg2P+wZlzjtFjqqEHAELYubam8LcduMU8+vmlPiufoK9fo47fLsX1PFCY9TDKL1dFlZgBAmJU7hR27h/gCo4r3PMub/snq7n+skrbarZbX1J6Q1o5UYKFIrrIjNObEECQQD0DIzIdMObPUUuW+JXg10kz/ayYn3irxZmp5ngc+b9WZfSOPehZBsLWsIb1eC7y9DZMhZfBQ/sPaO80tvqJMUFAkEA8wlj3B3zK20pK+Hj+vFiAlaQmqILTSfv/9jMm8tbVfXt+bHrmZdNjruGVQDb7V2pW9HeG5PgDB3vKXeOiVfC5QJAYikKFzaf1rj2ModSqtBzjnL3Txi+eYbjA7c19UmpBw4aOrwfHhMdrZt7p6aHFgIMps+2n9Fxbhv8194YBj1z4QJAPONWXFg4iuGvVeoi9sSwvEs5sTP1xt/BlgSXxlRdTpztgQgdMX6hlKfQkM1FTCOSAYoDrj8O+5ooR+hHEoulLQJBAOtaMvMWIOG7mARngpwqfJ07L41/T0ITHteiiYJfCurzkLVCx1XA3MlN+u5gn7osUHMbah0Ze3uakSZ6za3mL5Y=-----END RSA PRIVATE KEY-----解析:1)删除页眉、页脚和新行。2)将 Base64 编码的字符串解码为其对应的二进制格式。 解析之后的16进制数据:3082025C02010002818100E7B0DD45EBA985EA1EB2FD7A7237E654FF0E40C9E5818D9348AA2DF7FC04E7E2A429C3E9031EB2B217BB10FD1370EAD89B33DD2233A54E035E37D39BA63DB3D138926CDC9A01E8B6A8EF84949B9F1A3BD4FE0ADEEB3B9D84FB7AF98F20D089C75197A94884B8A03400D73C3FCAA0DC1FAD1AC2CB0E304C73198521DCF1E5077902030100010281800554C882A75D8B3B4BE18A7B9ACD367B9632D9C2CB89239CD3FB367B924CFA98F8760D8FFB0665CE3B458EAA841C010B62E6DA9BC2DC76E314F3EBE694F8AE7E82BD7E8E3B7CBB17D4F14263D4C328BD5D16566004098953B851DBB87F802A38AF73CCB9BFEC9EAEE7FAC92B6DAAD96D7D49E90D68E5460A148AEB22334E6C41024100F40C8CC874C39B3D452E5BE257835D24CFF6B2627DE2AF1666A799E073E6FD5997D238F7A1641B0B5AC21BD5E0BBCBD0D932165F050FEC3DA3BCD2DBEA24C505024100F30963DC1DF32B6D292BE1E3FAF1620256909AA20B4D27EFFFD8CC9BCB5B55F5EDF9B1EB99974D8EBB865500DBED5DA95BD1DE1B93E00C1DEF29778E8957C2E5024062290A17369FD6B8F6328752AAD0738E72F74F18BE7986E303B735F549A9070E1A3ABC1F1E131DAD9B7BA7A68716020CA6CFB69FD1716E1BFCD7DE18063D73E102403CE3565C58388AE1AF55EA22F6C4B0BC4B39B133F5C6DFC1960497C6545D4E9CED81081D317EA194A7D090CD454C2392018A03AE3F0EFB9A2847E847128BA52D024100EB5A32F31620E1BB980467829C2A7C9D3B2F8D7F4F42131ED7A289825F0AEAF390B542C755C0DCC94DFAEE609FBA2C50731B6A1D197B7B9A91267ACDADE62F96解析数据:3082025C# 标签头,类型为SEQUENCE (sequence 序列),此标签头共 4 字节。注(不确定):3082 应该指 私钥#以下共 604 字节 (0x025c)020100 # 整型 长度 为 0 (0x00),内容:version028181 # 整型 长度 为 129 字节 (0x81),内容:模数 n (modulus)00e7b0dd45eba985ea1eb2fd7a7237e654ff0e40c9e5818d9348aa2df7fc04e7e2a429c3e9031eb2b217bb10fd1370ead89b33dd2233a54e035e37d39ba63db3d138926cdc9a01e8b6a8ef84949b9f1a3bd4fe0adeeb3b9d84fb7af98f20d089c75197a94884b8a03400d73c3fcaa0dc1fad1ac2cb0e304c73198521dcf1e507790203 # 整型 长度 为 3 字节(0x03),内容:e (公钥指数)010001028180 # 整型 长度 为 128 字节(0x80),内容:d (私钥指数)0554c882a75d8b3b4be18a7b9acd367b9632d9c2cb89239cd3fb367b924cfa98f8760d8ffb0665ce3b458eaa841c010b62e6da9bc2dc76e314f3ebe694f8ae7e82bd7e8e3b7cbb17d4f14263d4c328bd5d16566004098953b851dbb87f802a38af73ccb9bfec9eaee7fac92b6daad96d7d49e90d68e5460a148aeb22334e6c410241 # 整型 长度 为 65 字节(0x41),内容:p (素数)00f40c8cc874c39b3d452e5be257835d24cff6b2627de2af1666a799e073e6fd5997d238f7a1641b0b5ac21bd5e0bbcbd0d932165f050fec3da3bcd2dbea24c5050241 # 整型 长度 为 65 字节(0x41),内容:q (素数)00f30963dc1df32b6d292be1e3faf1620256909aa20b4d27efffd8cc9bcb5b55f5edf9b1eb99974d8ebb865500dbed5da95bd1de1b93e00c1def29778e8957c2e50240 # 整型 长度 为 64 字节(0x40),内容:d mod(p-1)62290a17369fd6b8f6328752aad0738e72f74f18be7986e303b735f549a9070e1a3abc1f1e131dad9b7ba7a68716020ca6cfb69fd1716e1bfcd7de18063d73e10240 # 整型 长度 为 64 字节(0x40),内容:d mod(q-1)3ce3565c58388ae1af55ea22f6c4b0bc4b39b133f5c6dfc1960497c6545d4e9ced81081d317ea194a7d090cd454c2392018a03ae3f0efb9a2847e847128ba52d0241 # 整型 长度 为 65 字节(0x41),内容:(1/q)mod p <即 (q**-1)mod p>00eb5a32f31620e1bb980467829c2a7c9d3b2f8d7f4f42131ed7a289825f0aeaf390b542c755c0dcc94dfaee609fba2c50731b6a1d197b7b9a91267acdade62f96通过上面解析可以获取到证书中的RSA密钥。发布于 2022-01-24 16:08加密​赞同 14​​25 条评论​分享​喜欢​收藏​申请

密码学基础3:密钥文件格式完全解析 - 简书

础3:密钥文件格式完全解析 - 简书登录注册写文章首页下载APP会员IT技术密码学基础3:密钥文件格式完全解析__七把刀__关注赞赏支持密码学基础3:密钥文件格式完全解析

这是密码学笔记第三篇。之前两篇分析了 RSA 算法和椭圆曲线密码学的基本原理,从中可以知道 RSA 算法的本质是大整数质数因子分解,椭圆曲线密码学的本质是曲线上的打点,朴素的原理后面处处闪耀着数学之光。从理论到实践,这篇文章来解析下日常使用的密钥文件格式。

文章主要解决下面几个问题:

使用 openssl 和 ssh-keygen 生成的 RSA 和 ECC 的密钥文件里面存了什么内容,用的什么编码规则?

有些 RSA 私钥头部是 -----BEGIN RSA PRIVATE KEY-----,而有些又是 -----BEGIN PRIVATE KEY-----,它们存储的内容有什么区别?

使用 openssl 生成的公钥跟 ssh-keygen 生成的密钥对中的公钥格式不一样,它们有什么区别?

openssl 和 ssh-keygen 都支持输入密码对私钥加密以增强安全性,它们加密方式分别是什么?有什么不同之处吗?

1 ASN.1

ASN.1(Abstract Syntax Notation One) 是一种数据描述语言,跟 protobuf 和 Thrift 这些接口描述语言类似,它通过模块(module) 来描述数据结构。ASN.1 最早用于电信领域,后来在计算机密码学中也有广泛应用。

ASN.1 定义了一些数据类型来描述数据结构,包括基础类型(如整数类型 INTEGER,布尔类型 BOOLEAN,字符串类型 OCTET STRING,BIT STRING)和结构化类型(如结构体类型 SEQUENCE,列表类型 SEQUENCE OF 等),完整类型列表见 [ASN.1 Types]。类型通常都有个类型标签,其中类型标签分为通用的、应用自定义的、上下文特定的、以及私有的 4 种类型。其中通用的类型标签如下:

Type

Tag Number

INTEGER

0x02

BIT STRING

0x03

OCTET STRING

0x04

NULL

0x05

OBJECT IDENTIFIER

0x06

SEQUENCE and SEQUENCE OF

0x10

IA5String

0x16

UTCTime

0x17

下面用ASN.1定义了一个名为 FooProtocol 的模块,其中包含一个结构体类型字段 FooQuestion。结构体 FooQuestion 包括一个整形字段 id 和一个字符串类型字段 question(IA5String 是不包括控制字符的字符串类型)。

FooProtocol DEFINITIONS ::= BEGIN

FooQuestion ::= SEQUENCE {

id INTEGER,

question IA5String

}

END

ASN.1 只是描述了数据结构,并没有指定怎么编码数据。因此,出现了多种编码规则以方便数据在网络上传输和不同终端间交互。比较常见的有 XER, JER, BER, DER等。如待编码的数据如下:

myQuestion FooQuestion ::= SEQUENCE {

id 5,

question "Anybody there?"

}

使用各编码规则编码结果如下,其中 XER 和 JER 不用多说,BER 和 DER 是最常见的密钥文件编码规则,下一节详细分析。

XER(XML Encoding Rules)

5

Anybody there?

JER(JSON Encoding Rules)

{ "id" : 5, "question" : "Anybody there?" }

BER(Basic Encoding Rules)

30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

DER(Distinguished Encoding Rules)

30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f

2 编码规则

前文提到 ASN.1 只是定义了数据结构,并未规定具体的编码方式,与之对应的有多种编码规则。ASN.1 与特定的编码规则一起通过使用独立于计算机架构和编程语言的方法来描述数据结构,为结构化数据的表示、编码、传输、解码提供了便利。本节主要介绍密钥和证书中常见的编码规则 BER,DER,以及由 DER 衍生出的密钥文件格式 PEM。

BER (Basic Encoding Rules)

BER 是基础编码规则,编码结构包括类型标志、长度,值以及结束符(可选),每个字段以 8bit 即字节进行分割。

----------------------------------------------------

| Identifier | Length | Contents | End-of-contents |

| octets | octets | octets | octets |

----------------------------------------------------

Identifier: 类型标志,就是ASN.1 规定的类型,只是除了标签号(tag number)外,还加了 3 位,第 7,8 位用于区分是通用的标签类型还是其他标签类型, 第 6 位 用于区分是基础类型还是结构化类型。Identifier 结构如下,后面我们会看到密钥中的结构体类型 SEQUENCE 的 Identifier 为 0x30,即是由这个格式而来(0011000)。

---------------------------------

| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |

---------------------------------

|Class |P/C| Tag Number |

---------------------------------

Class:如果是通用类型标签则为 00,应用自定义的类型标签则为 01,上下文特定类型标签 10,私有类型标签 11。

P/C:如果是基础类型,则为 0,结构化类型为 1。

Tag Number:就是 ASN.1 中定义的数据类型标签号。

Length: 分三种情况,

1)数据长度 < 128:则 Length 的 8bit首位为0,其他7位表示数据长度。

2)数据长度 >= 128:则 Length 的第一个8bit为 0x8?,其中 ? 是后面跟的是长度。比如 0x81 表示后面一个字节为长度,如果是 0x82 则表示后面两个字节为长度,以此类推。

3)如果数据长度未知,则 Length=0x80,并增加 End-of-contents=00 00 结束标记。

Contents & End-of-contents: 数据内容。对于未知数据长度的数据类型,才有 End-of-contents,为00 00。

实例:

使用 OCTET STRING 编码字符串 Hello,为 04 05 48 65 6C 6C 6F,即类型为 04,长度为 05,内容为 0x48 65 6C 6C 6F,即 Hello 的 ASCII 码。

使用 INTEGER 编码整数 129,为 02 81 81。

结构化类型是包含了多个数据类型的复合类型,后面详细分析。

DER (Distinguished Encoding Rules)

DER 是典型的 Tag-Length-Value(TLV) 编码方式,是 PKCS 密钥体系常用的编码。

DER 是 BER 的子集,编码规则几乎一样,不过去掉了 BER 的一些灵活性,多了几个限制:

如果数据长度在 0-127 之间,则 Length 必须使用第 1 种编码方式。

如果数据长度 >= 128,则 Length 必须使用第 2 种编码方式,且 Length 必须用最少的字节编码,如果能用 2 字节的则不能用 3 字节。

数据要用明确长度的编码方式,不支持 Length 的第3种编码即未知数据长度+结束标记的方式。

注意:ASN.1 规定整型 INTEGER 需要支持正整数、负整数和零。BER/DER 使用大端模式存储 INTEGER,并通过最高位来编码正负数(最高位0为正数,1为负数)。 如果密钥参数值最高位为 1,则 BER/DER 编码会在参数前额外加 0x00 以表示正数,这也就是为什么有时候密钥参数前面会多出1字节 0x00 的原因。

PEM(Privacy Enhanced Mail): 因为 DER 编码是二进制数据,早期的 Email 不能发送附件,也不方便直接传输二进制数据([原因]),因此密钥文件通常会在 DER 编码基础上进行 Base64 编码,这就是经常看到的密钥文件格式 PEM。PEM 最早是用来增强邮件安全性的,不过没有被广泛接受,最后却是在密码学中得到了发扬光大,如 openssl 和 ssh-keygen 工具生成的公私钥文件默认都采用 PEM 格式。需要注意的是,PEM 本身不是 ASN.1 的编码规则,它只是 Base64-encoded DER。

3 密钥格式解析

ASN.1 编码规则只定义了数据编码方式,但是并没有赋予数据意义。公钥密码学标准 PKCS (Public Key Cryptography Standards) 和公钥基础设施 PKIX(Public-Key Infrastructure X.509) 等使用 ASN.1 的类型定义密钥和证书的格式和编码,以描述公私钥和证书属性。 需要注意,PKCS 虽然名字是公钥密码学标准,它其实也包括私钥格式标准。 这两个标准的内容浩瀚如烟,本节只分析常见几种密钥相关的部分。

3.1 PKCS #1

PKCS #1 是 RSA Cryptography Specifications,即 RSA 密码学规范,它在 [rfc8017] 中有详细说明,定义了 RSA 密钥文件的格式和编码方式,以及加解密、签名、填充的基础算法。

RSA 密钥格式

RSA 公私钥的 ASN.1 类型定义如下,根据类型定义和数据编码,就能解析出 RSA 公私钥中的参数了(参数含义请参考我之前的《RSA算法原理解析》一文)。

RSAPublicKey ::= SEQUENCE {

modulus INTEGER, -- n

publicExponent INTEGER -- e

}

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

}

使用 openssl 生成的一对 RSA 公私钥 (示例为方便展示,用的 1024 位密钥,实际中请使用 2048 位以上)

$ openssl genrsa -out prikey.p1 1024

$ openssl rsa -in prikey.p1 -pubout -RSAPublicKey_out > pubkey.p1

PKCS#1 格式解析如下:公钥的 SEQUENCE 包括 RSA 公钥参数 n 和 e 两个属性。RSA 私钥则首先是版本号 0,然后是 RSA 私钥的 8 个参数。

PKCS#1 公钥

PKCS#1 私钥

加密私钥

可以对 PKCS#1 的私钥进行加密,如 ssh-keygen 可以指定 passphrase (测试的密码是 testtest)加密 RSA 私钥,加密后的私钥 enc_prikey.p1 格式如下:

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

Proc-Type: 4,ENCRYPTED

DEK-Info: AES-128-CBC,8C2A8D6593F411D7336B842037B5200B

EncryptedRSAPrivateKey

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

DEK-Info 里面指明了加密算法是 AES-128-CBC,IV 是 8C2A8D6593F411D7336B842037B5200B,AES加密的实际密码=md5(设定密码 + IV的前8个字节)。可以使用 openssl aes-128-cbc 验证加密结果是否与 EncryptedRSAPrivateKey 一致。

$ tail -n +2 prikey.p1 | grep -v 'END RSA' | base64 -d |

openssl aes-128-cbc -e -iv 8C2A8D6593F411D7336B842037B5200B -K $(python -c "exec(\"import hashlib\\nprint hashlib.md5(bytearray('testtest') + bytearray.fromhex('8C2A8D6593F411D7')).hexdigest()\")") | base64

3.2 PKCS #8

PKCS#8 是 Private-Key Information Syntax Standard,即私钥格式相关的标准,它不像 PKCS#1 只支持 RSA,而是支持各种类型的私钥。PKCS#8 私钥文件格式中首尾并未说明私钥算法类型,算法类型在数据中标识。PKCS#8 中的私钥也支持加密。

未加密私钥格式

未加密私钥格式的 ASN.1 类型定义如下(参见 [rfc5958] ):

OneAsymmetricKey ::= SEQUENCE {

version Version,

privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,

privateKey PrivateKey,

attributes [0] Attributes OPTIONAL,

...,

[[2: publicKey [1] PublicKey OPTIONAL ]],

...}

Version ::= INTEGER # 版本号。

PrivateKeyAlgorithmIdentifier ::= SEQUENCE { # 密钥算法标识

algorithm OBJECT IDENTIFIER,

parameters ANY DEFINED BY algorithm OPTIONAL }

PrivateKey ::= OCTET STRING # 不同类型的私钥格式不同,比如 RSA 的是 RSAPrivateKey类型,而 ECC 的是 ECPrivateKey 类型。

Attributes ::= SET OF Attribute # 跟公钥相关的属性,比如证书什么的,在公私钥中通常为空。

PublicKey ::= BIT STRING # 不同类型密钥包含的公钥内容也不同。

RSA 私钥格式

可以使用 openssl 将 PKCS#1 格式的私钥 prikey.p1 转换成 PKCS#8 格式的 prikey.p8,如下:

$ openssl pkcs8 -in prikey.p1 -topk8 -out prikey.p8 -nocrypt

私钥格式解析如下:

PKCS#8 RSA私钥格式

version:版本号,目前值为 0。

privateKeyAlgorithm:私钥算法, rsaEncryption 的OBJECT IDENTIFIER 是 1.2.840.113549.1.1.1,具体含义参见 [这里]。

privateKey:私钥,OCTET STRING 类型,里面其实封装了一个 RSAPrivateKey 类型,跟 PKCS#1 一样。

attributes 和 publicKey 为空。

ECC 私钥格式

椭圆曲线类型的私钥格式在 rfc5915 中定义如下:

ECPrivateKey ::= SEQUENCE {

version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),

privateKey OCTET STRING,

parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,

publicKey [1] BIT STRING OPTIONAL

}

使用 openssl 创建一个 PKCS#8 格式的 ecc 密钥,采用 prime256v1 曲线:

# 生成传统格式的 ECC 私钥,类似 PKCS#1 那样,只包含 privateKey,密钥类型在头部 -----BEGIN EC PRIVATE KEY----- 标识,椭圆曲线在 parameters 标识。

$ openssl ecparam -name prime256v1 -genkey -noout -out ecc_prikey.tradfile

# 转换为 PKCS#8 格式

$ openssl pkcs8 -topk8 -in ecc_prikey.tradfile -out ecc_prikey.p8 -nocrypt

$ cat ecc_prikey.p8

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

MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMbahscIGpSZ6NULI

iQ/pTI9ZcvFdXKtjN1bAGO2bxvahRANCAATwq1k9rx/8neP8MqVR7UuJ98bLFsU5

jpueH0ougZNWrsKUki0cgKDGrb3C8Q2NMRO336ve22Xk674lk/ZDHkAV

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

ASN.1 格式解析如下:

PKCS#8 ECC私钥格式

前面部分是算法标识 1.2.840.10045.2.1(ecPublicKey) 和 1.2.840.10045.3.1.7 (prime256v1)。

后面是私钥信息,其中包括了版本号 1,OCTET STRING 类型私钥 31B6A1...F6,BIT STRING 类型的公钥 0000 0100 1111 0000...。

当然通过 openssl 可以直接解析出公私钥和曲线类型,如下:

$ openssl ec -in ecc_prikey.p8 -noout -text

read EC key

Private-Key: (256 bit)

priv:

31:b6:a1:b1:c2:06:a5:26:7a:35:42:c8:89:0f:e9:

4c:8f:59:72:f1:5d:5c:ab:63:37:56:c0:18:ed:9b:

c6:f6

pub:

04:f0:ab:59:3d:af:1f:fc:9d:e3:fc:32:a5:51:ed:

4b:89:f7:c6:cb:16:c5:39:8e:9b:9e:1f:4a:2e:81:

93:56:ae:c2:94:92:2d:1c:80:a0:c6:ad:bd:c2:f1:

0d:8d:31:13:b7:df:ab:de:db:65:e4:eb:be:25:93:

f6:43:1e:40:15

ASN1 OID: prime256v1

NIST CURVE: P-256

在上一篇《椭圆曲线密码学原理分析》一文知道,椭圆曲线的密钥生成其实就是一个公式 P = nG,n 就是私钥,G 是基点,P 是公钥。注意到这里公钥的第一个字节 04 表示公钥格式是 uncompressed format,即非压缩格式,也就是把点的 X 和 Y 坐标合到一起作为公钥。压缩格式就是只用 X 坐标或者 Y 坐标中的一个,另一个坐标根据曲线方程可以求得([rfc5480] 有详细说明)。可以通过 libnum 库来验证下公私钥的准确性。

$ cat ecc.py

from libnum.ecc import Curve

curve = Curve(

a=0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc,

b=0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b,

p=0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff,

g = (0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296,

0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5)

)

pri = 0x31b6a1b1c206a5267a3542c8890fe94c8f5972f15d5cab633756c018ed9bc6f6

pub = curve.power(curve.g, pri)

print hex(pub[0]), hex(pub[1])

$ python ecc.py

('0xf0ab593daf1ffc9de3fc32a551ed4b89f7c6cb16c5398e9b9e1f4a2e819356aeL',

'0xc294922d1c80a0c6adbdc2f10d8d3113b7dfabdedb65e4ebbe2593f6431e4015L')

加密私钥格式

PKCS#8 里面对私钥加密提供了 PBES2(Password-Based Encryption Scheme 2)加密模式支持。通过 PBKDF2(Password-Based Key Derivation Function 2) 对原始密码进行多次哈希处理作为加密密码以增强破解难度,然后用对称加密算法 AES 或者 DES 对私钥进行加密。

PBKDF2 是一种 CPU 密集型算法,但是如果使用 GPU 阵列或者 FPGA 来破解还是相对容易。在密码存储中现在更倾向于用 Bcrypt,它不仅是 CPU 运算密集,而且是内存密集,破解难度会更高一些。不过总的来说, PBKDF2 比 ssh-keygen 的 md5 方式生存密码安全性会高很多。

PKCS#8 加密类型私钥的 ASN.1 类型定义如下:

EncryptedPrivateKeyInfo ::= SEQUENCE {

encryptionAlgorithm EncryptionAlgorithmIdentifier,

encryptedData EncryptedData }

EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier

{ CONTENT-ENCRYPTION,

{ KeyEncryptionAlgorithms } }

EncryptedData ::= OCTET STRING

使用 openssl 对 PKCS#8 格式的密钥加密是很方便的,默认就支持(生成密钥时不加 -nocrypt 参数即可)。加密后的 ecc_prikey.p8 格式解析如下:

加密的 PKCS#8 ECC私钥格式

其中加密模式是 pkcs5PBES2,密钥生成算法是 PBKDF2,参数 salt= E20EED9A112B7BFA,iteration=2048,哈希算法是 hmacWithSHA256。

对称加密算法是 aes256-cbc,参数 iv=27579581D081AEDA083889370232AD1A。

最后一行 11E9C5C2.... 就是加密私钥 encryptedData。

加密过程解析:

先使用密钥生成算法 PBKDF2 生成加密密码,python 可以用 backports.pbkdf2 模块。

import os, binascii

from backports.pbkdf2 import pbkdf2_hmac

salt = binascii.unhexlify('E20EED9A112B7BFA')

passwd = b"testtest"

key = pbkdf2_hmac("sha256", passwd, salt, 2048, 32)

print("Derived key:", binascii.hexlify(key))

# 输出: ('Derived key:', 'bf48084fd98fcbacd8e024166efb7232c897282fe7e4ff836db3f3d81e32ede9')

然后使用 openssl 的 aes256-cbc 加密原私钥,可以验证跟 encryptedData 是一样的。

$ tail -n +2 ecc_prikey.p8 | grep -v 'END '| base64 -d |

openssl aes-256-cbc -e -iv 27579581D081AEDA083889370232AD1A -K bf48084fd98fcbacd8e024166efb7232c897282fe7e4ff836db3f3d81e32ede9 | hexdump -C

00000000 11 e9 c5 c2 4c c3 2d bb fa 84 b9 fb db f1 d1 ff |....L.-.........|

00000010 f0 6a 5b fa c3 a6 88 cd 02 4c ac 52 84 f4 cb c1 |.j[......L.R....|

......

00000080 8f 72 96 7a 58 aa 1f 5a 6f c1 bf dc 43 1a 46 26 |.r.zX..Zo...C.F&|

3.3 PKIX

前面提到 PKCS#8 定义了通用的私钥格式支持各类私钥,在 PKIX ([rfc5280]) 中也定义了通用的公钥格式。其中包括算法标识和公钥内容,算法标识 AlgorithmIdentifier 与前面私钥中的 PrivateAlgorithmIdentifier 是类似的。

SubjectPublicKeyInfo ::= SEQUENCE {

algorithm AlgorithmIdentifier,

subjectPublicKey BIT STRING }

AlgorithmIdentifier ::= SEQUENCE {

algorithm OBJECT IDENTIFIER,

parameters ANY DEFINED BY algorithm OPTIONAL

}

将之前的 PKCS#1 格式的 RSA 公钥转换成 PKIX 的格式:

$ openssl rsa -RSAPublicKey_in -in ../pk1/pubkey.p1 -pubout > pubkey.pkix

PKIX 格式的公钥解析如下,包括公钥算法 rsaEncryption 和 RSA 公钥参数 n 和 e。

PKIX公钥格式

3.4 openssl 和 ssh-keygen 生成公钥格式区别

相信大家会发现 ssh-keygen -t rsa 生成的 RSA 密钥对中公钥格式跟 PKCS#1 和 PKIX 中的都不一样。ssh-keygen 生成的公钥 id_rsa.pub 如下所示:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC+gCiA//vUMu/2dYj9oGUpY2TCw5/AtkfI2cWvl7hOkliQd7uI61gE9BV5w+Ib+HnjAB9lFYS4A8rlpRlkH9a+mCN2K/Oh5dhoonxat4qeHB5XDvmImUfdOGayT5l176KWP4ftGJt+8ygRpo05zcbuBrd/KxFZ7KDiQyXRvRv9mw== vagrant@stretch

这是 openssh 使用的一种专属格式:

[type-name] [base64-encoded-ssh-public-key] [comment]

其中 base64-encoded-ssh-public-key 并没有使用 ASN.1 的数据类型定义和 DER 编码,而是使用的 SSH 协议定义的格式(见 [rfc4251]),分为 3 部分:

string "ssh-rsa"

mpint e

mpint n

这里的 string 类型和 mpint 类型在 rfc4251 中定义,其中 mpint是使用字符串的方式来存储整数,它们都会在数据前先用4字节存储数据长度。id_rsa.pub 解析后格式如下所示:

00 00 00 07 73 73 68 2d 72 73 61 | 长度 7,值 ssh-rsa|

00 00 00 03 01 00 01 | e 长度 3,值 0x010001 |

00 00 00 81 00 be 80 28 80 ff fb d4 |n 长度 127,值 0x00 be 80 28 80...|

......

也可以将 ssh-keygen 生成的公钥转换成 PKCS#1 的格式:

$ ssh-keygen -f id_rsa.pub -e -m pem > pubkey.p1

4 总结

PKCS 和 PKIX 使用 ASN.1 定义了密钥的数据结构,并使用 DER 编码规则编码密钥,最终使用 PEM (Base64-encoded DER) 格式将密钥数据存储在密钥文件中。

PKCS#1 首部会标识密钥算法类型,PKCS#8 则是在密钥数据中有字段专门存储密钥算法。openssh 使用的公钥格式是 SSH 协议中定义的,虽然参数值一样,但是编码方式与 PKCS 和 PKIX 标准都不同。

ssh-keygen 是对原始密码和初始向量经过一个简单规则 md5 后生成加密密码,然后使用 aes128-cbc 对称加密。而 openssl 则是对原始密码采用 PBKDF2 算法生成加密密码,然后使用 aes256-cbc 对称加密,openssl 的加密方式更安全一些。

参考资料

https://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One

https://en.wikipedia.org/wiki/PKCS

https://martin.kleppmann.com/2013/05/24/improving-security-of-ssh-private-keys.html

https://cryptobook.nakov.com/mac-and-key-derivation/pbkdf2

https://blog.ndpar.com/2017/04/17/p1-p8/

https://lapo.it/asn1js (解析ASN.1的在线工具,比 openssl asn1parser 清晰一点)

最后编辑于 :2019.10.10 17:22:48©著作权归作者所有,转载或内容合作请联系作者人面猴序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...沈念sama阅读 146,067评论 1赞 309死咒序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...沈念sama阅读 62,478评论 1赞 260救了他两次的神仙让他今天三更去死文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...开封第一讲书人阅读 97,028评论 0赞 215道士缉凶录:失踪的卖姜人 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...开封第一讲书人阅读 41,647评论 0赞 186港岛之恋(遗憾婚礼)正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...茶点故事阅读 49,531评论 1赞 263恶毒庶女顶嫁案:这布局不是一般人想出来的文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...开封第一讲书人阅读 39,131评论 1赞 182城市分裂传说那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...沈念sama阅读 30,705评论 2赞 279双鸳鸯连环套:你想象不到人心有多黑文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...开封第一讲书人阅读 29,477评论 0赞 174万荣杀人案实录序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...沈念sama阅读 32,842评论 0赞 218护林员之死正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...茶点故事阅读 29,556评论 2赞 223白月光启示录正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...茶点故事阅读 30,888评论 1赞 234活死人序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...沈念sama阅读 27,356评论 2赞 219日本核电站爆炸内幕正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...茶点故事阅读 31,824评论 3赞 214男人毒药:我在死后第九天来索命文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...开封第一讲书人阅读 25,713评论 0赞 9一桩弑父案,背后竟有这般阴谋文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...开封第一讲书人阅读 26,147评论 0赞 170情欲美人皮我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...沈念sama阅读 33,880评论 2赞 236代替公主和亲正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...茶点故事阅读 34,047评论 2赞 240推荐阅读更多精彩内容RSA密钥格式解析一、前言 在开发过程中,我们常常遇到用RSA进行加密、解密、签名及验签处理,而在进行这些处理的时候,必须首先到导入...消逝在大夜里阅读 31,010评论 1赞 15openssl 密钥生成和解析最近,在写java读取key的时候遇到了一个version的问题。不解,就各种找资料,这里总结一下. ANS.1编...kamiSDY阅读 12,182评论 1赞 6PKI知识点整理1 基础 1.1 对称算法 描述:对称加密是指加密过程和解密过程使用相同的密码。主要分:分组加密、序列加密。 原理...御浅永夜阅读 2,168评论 1赞 4C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(....高坚果兄弟阅读 3,105评论 0赞 2证书文件编码格式介绍转:https://blog.csdn.net/mycoolx/article/details/6730435 O...right_33cb阅读 3,433评论 0赞 0评论4赞1919赞20赞赞赏更

RSA密钥格式解析_rsa公钥格式-CSDN博客

>

RSA密钥格式解析_rsa公钥格式-CSDN博客

RSA密钥格式解析

最新推荐文章于 2023-10-08 17:44:17 发布

he25819

最新推荐文章于 2023-10-08 17:44:17 发布

阅读量1.4w

收藏

60

点赞数

20

分类专栏:

转载

文章标签:

rsa

原文链接:https://www.jianshu.com/p/c93a993f8997

版权

转载

专栏收录该内容

15 篇文章

1 订阅

订阅专栏

原文:https://www.jianshu.com/p/c93a993f8997

一、前言

在开发过程中,我们常常遇到用RSA进行加密、解密、签名及验签处理,而在进行这些处理的时候,必须首先到导入我们的密钥(公钥或私钥),而我们拿到的密钥有各种形式,例如:pem、der、cer、Pfx、p12、p7b等等。这里我们常常会有很多疑问,我们的处理代码需要那种格式的密钥?这些不同格式的密钥之间如何相互转化?在格式转化中,往往有牵扯到各种概念,象x509、PKCS#1、PKCS#7、PKCS#8、PKCS12,它们又是什么意思呢?接下来,这篇文章会为你一一梳理这些概念。

二、从分析一个RSA公钥开始

2.1、RSA密钥组成

关于RSA算法的原理这里就不做解释了,这边有一篇阮一峰的文章解释的很清楚,有兴趣的朋友可以去了解一下。RSA密码由三个整数组成,我们分别称之为n、e、d:

(n、d):私钥,这个我们要私密保存。(n、e):公钥,可以对外公布。n:模数(Modulus),私钥和公钥都包含有这个数。e:公钥指数(publicExponent),一般是固定值65537。d:私钥指数(privateExponent)。

2.2、使用OpenSSL生成一个RSA公钥

使用OpenSSL命名生成一个RSA公钥非常简单,只需要两个命令。

生成一个RSA密钥

openssl genrsa -out private_pkcs1.pem 2048

从生成的RSA密钥中提取RSA公钥

openssl rsa -in private_pkcs1.pem -out public_pkcs1.pem -pubout -RSAPublicKey_out

我们得到了一个PKCS#1形式、PEM格式文件的RSA公钥:

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

MIIBCgKCAQEAnLdoA3ba57YHBAenYbLGTcdC48VVvVVDXV6N/W+1FztBRjvNPV1D

MOcIJBrveTlgKug2PCVynaIttaNql6p/+Bm4G41kyZYy7RSaUCaJ3ryjcXsKfClt

nG9vCwbIN+bVchxRzj739zIA1tBHn9v22PhFcEfsSAy2G2EwM4bQ38n2UrMse9wb

LUGT0kzyquwPQs7vriU+1XBkrdssoAqbwgW5yUqxDosYB5h7D1YTW0qKkJ6PPNnL

XbMv2Meyjxq1sbWoF/m8uboaKklqal1ep5UqTp9OFNOaTrVyXY4Gkt7wq3OoNvk9

2cJ1fHz9wnriGo+oNut9gQr1WVjOzRkAwwIDAQAB

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

下面我们节开始分析这串数据,为了方便,我们这串数据成为 数据2-1。

2.3、RSA公钥解析

拿到 数据2-1 我们可以先提几个问题:

这段数据中包含了哪些信息?什么叫做PKCS#1形式?什么叫做PEM格式?如何从这段数据中提取n、e的值?

2.3.1、什么叫做PEM格式?

我们可以通过OpenSSL命令,导出一个DER格式的公钥

openssl rsa -in private_pkcs1.pem -out public_pkcs1.der -pubout -RSAPublicKey_out -outform DER

public_pkcs1.der是个二进制文件,我们用二级制查看器查看:

public_pkcs1.pem 实际与 public_pkcs1.der 包含了完全相同的信息。回顾一下 数据2-1,我们发现这个数据有三部分:“-----BEGIN RSA PUBLIC KEY-----”、中间的数据、“-----END RSA PUBLIC KEY-----”。下面我们把 数据2-1 中间的数据用base解码:

可以看到,解码后和 public_pkcs1.der 里面的数据完全相同!

实际上,PEM就是把DER格式的数据用base64编码后,然后再在头尾加上一段“-----”开始的标记而已。

2.3.2、ASN.1

上一节我们提到,DER格式的密钥是二进制的数据,那么这段二进制的数据还有没有结构?通过查阅 RFC 8017,我们得到了一个PKCS#1形式的RSA公钥的定义:

RSAPublicKey ::= SEQUENCE {

modulus INTEGER, -- n

publicExponent INTEGER -- e

}

可以看到,PKCS#1形式的RSA公钥定义很简单,只包含n、e值。那这个定义如何帮助我们进一步解析DER格式公钥的二进制数据呢?实际上,上面的定义用的是ASN.1抽象语法标记(Abstract Syntax Notation One),ASN.1用来描述一段二级制数据的结构信息,就像我们用XML来描述文本文件的结构信息一样。我们不能把n、e两个值直接拼接在一起形成二进制公钥,因为这样做公钥的使用者在解析这段公钥的时候就会懵逼。这是什么类型的二级制数据?如果是是一个公钥,那么这个公钥是长度是多少?那段数据是n值,那一段是e值?所以实际上,DER格式公钥除了包含n、e信息以外,还包含了一些结构信息。这些信息我们都是根据上面的ASN.1定义的结构来进行编码和解析。同样的ASN.1定义,可以有多种编码方式:基本编码规则(BER)、可辨别编码规则(DER),这两种编码采取的是同样的规则,只不过BER编码结果不唯一,而DER对BER的规则加了约束使得结果唯一。BER编码的基本原理就是TLV(Type、Length、Value),一段二级制数据,开头几个字节指定了接下来的数据时什么类型的,随后几个字节给出Value部分的长度。然后Value部分里面又可以嵌套TLV,就这样编码下去...

我们的public_pkcs1.der就是采用可辨别编码规则(DER)编码方式。 下面就是我把der里面的二级制数据按照TLV进行格式化一下:

30 82 01 0A

02 82 01 01

00 9C B7 68 03 76 DA E7 B6 07 04 07 A7 61 B2 C6 4D C7 42 E3 C5 55 BD 55 43 5D 5E 8D FD 6F B5 17 3B 41 46 3B CD 3D 5D 43 30 E7 08 24 1A EF 79 39 60 2A E8 36 3C 25 72 9D A2 2D B5 A3 6A 97 AA 7F F8 19 B8 1B 8D 64 C9 96 32 ED 14 9A 50 26 89 DE BC A3 71 7B 0A 7C 29 6D 9C 6F 6F 0B 06 C8 37 E6 D5 72 1C 51 CE 3E F7 F7 32 00 D6 D0 47 9F DB F6 D8 F8 45 70 47 EC 48 0C B6 1B 61 30 33 86 D0 DF C9 F6 52 B3 2C 7B DC 1B 2D 41 93 D2 4C F2 AA EC 0F 42 CE EF AE 25 3E D5 70 64 AD DB 2C A0 0A 9B C2 05 B9 C9 4A B1 0E 8B 18 07 98 7B 0F 56 13 5B 4A 8A 90 9E 8F 3C D9 CB 5D B3 2F D8 C7 B2 8F 1A B5 B1 B5 A8 17 F9 BC B9 BA 1A 2A 49 6A 6A 5D 5E A7 95 2A 4E 9F 4E 14 D3 9A 4E B5 72 5D 8E 06 92 DE F0 AB 73 A8 36 F9 3D D9 C2 75 7C 7C FD C2 7A E2 1A 8F A8 36 EB 7D 81 0A F5 59 58 CE CD 19 00 C3

02 03

01 00 01

然后我们用OpenSSL查看我们密钥的n、e、d值

openssl rsa -in private_pkcs1.pem -text -noout

两相比对,我们就可以看出public_pkcs1.der文件的结构。

三、私钥解析

3.1、PKCS#1形式的私钥结构

在RFC 2347中,我们可以得到RSA私钥的ASN.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

}

里面包含了n、e、d值,其他参数都可以通过n、e、d计算得到,这里应该是为了方便用户使用,减少因用户计算方式不正确而导致一些操作的失败,故而直接把各种形式的参数定义在私钥里面。

我们把该私钥的二进制数据格式化,得到如下所示:

30 82 04 A2

02 01

00

02 82 01 01

00 9C B7 68 03 76 DA E7 B6 07 04 07 A7 61 B2 C6 4D C7 42 E3 C5 55 BD 55 43 5D 5E 8D FD 6F B5 17 3B 41 46 3B CD 3D 5D 43 30 E7 08 24 1A EF 79 39 60 2A E8 36 3C 25 72 9D A2 2D B5 A3 6A 97 AA 7F F8 19 B8 1B 8D 64 C9 96 32 ED 14 9A 50 26 89 DE BC A3 71 7B 0A 7C 29 6D 9C 6F 6F 0B 06 C8 37 E6 D5 72 1C 51 CE 3E F7 F7 32 00 D6 D0 47 9F DB F6 D8 F8 45 70 47 EC 48 0C B6 1B 61 30 33 86 D0 DF C9 F6 52 B3 2C 7B DC 1B 2D 41 93 D2 4C F2 AA EC 0F 42 CE EF AE 25 3E D5 70 64 AD DB 2C A0 0A 9B C2 05 B9 C9 4A B1 0E 8B 18 07 98 7B 0F 56 13 5B 4A 8A 90 9E 8F 3C D9 CB 5D B3 2F D8 C7 B2 8F 1A B5 B1 B5 A8 17 F9 BC B9 BA 1A 2A 49 6A 6A 5D 5E A7 95 2A 4E 9F 4E 14 D3 9A 4E B5 72 5D 8E 06 92 DE F0 AB 73 A8 36 F9 3D D9 C2 75 7C 7C FD C2 7A E2 1A 8F A8 36 EB 7D 81 0A F5 59 58 CE CD 19 00 C3

02 03

01 00 01

02 82 01 00

31 56 2C 10 AB 22 4F 40 27 05 45 C3 94 26 4B F7 C0 7B 76 69 71 8C A1 83 0B A9 F0 D9 90 89 5A 3E F5 55 BF 0D E5 FB AE 63 7E D8 39 45 A1 8E 70 59 AE 28 5C AA A2 BF 6A 90 DC 03 0A E7 4B C8 09 71 79 E7 54 05 37 6D 9F 33 79 1F BB 54 F0 4D 07 2A 2B EA 55 E9 FF 1C AB BD 4B F7 91 69 19 2F 40 24 82 40 18 20 EE 01 F2 78 73 7B 2D 26 DF 54 C8 69 95 FF 86 51 9E 39 30 87 44 27 5C 9D 5C 1B F5 D7 88 D4 9D E0 AD 0F 3C B0 A2 EC C8 A6 ED 60 CB DE 44 F9 B7 73 D8 29 4F 38 8C 24 91 29 56 B8 E0 94 0A E2 22 27 5B A4 51 90 BE A9 0E 66 EB A1 5C 68 93 D4 25 64 E3 97 B0 56 E1 9F 07 B6 AD 3F 5E 92 66 BB CC AC 4E 80 46 52 D7 3A 57 0D 52 E5 E9 49 37 62 F7 2E C0 0D C3 92 A6 A6 F6 0F D7 9F 1B 98 3E 20 8E F5 67 ED 19 A9 70 F0 82 F4 73 05 B8 30 01 5E 55 01 64 4E 29 BE 84 0A 38 BD EB F2 27 C1

02 81 81

00 D0 8E EF 5F F7 98 86 28 CC 96 71 53 0A 4D BB 84 02 68 0A E7 19 C6 82 7C 7F E4 F4 44 FB EF 6C 39 33 C1 33 F4 1A 28 72 A6 F3 32 09 6A 3A CD 25 3C A0 C1 28 96 87 2D 52 97 51 D5 9D 63 3A 74 73 D6 13 7B 60 A7 38 F3 84 D3 9D 2B 6E A4 71 DE 65 7F 5A 8F 0D 46 9F 2B F5 B0 64 83 F8 95 56 84 7B BF 04 DF 18 FD 0D DB 2A 55 15 2D 71 54 52 AC BD 19 45 2E 0B 84 AB BD 86 69 AE C0 BC 45 4C 31 4B CD

02 81 81

00 C0 5D 8A 29 17 C5 32 BF 92 B3 94 F1 B1 79 90 3E CE F1 B5 42 BB 4C F4 22 1B CF FB AD 46 92 9B AB 9E 60 73 12 EB 53 84 AC D5 58 7B F7 F7 56 63 FD 3B F1 18 8D 4B 67 BB 98 CB 4A D4 62 B8 5A 08 A0 38 E6 F4 74 7C 56 33 2C 99 38 A5 AB F0 83 C9 06 78 98 18 B9 F8 81 C9 5C 6F E1 82 A1 A1 D5 08 D6 BE 20 90 CA D6 E5 79 F9 DF E1 A7 A2 B0 1E D5 6F F9 3C 68 96 24 29 06 16 22 DA 2A 48 86 F5 8E CF

02 81 80

57 C2 EE 24 1A 12 8A D1 FC 55 8A 56 81 4D 78 8C F2 5E 49 C8 39 E6 78 DE 5F 0B 3F 67 10 05 0E 2B 7C 05 DF 10 E7 39 02 16 12 DC 89 6D B4 54 C3 48 A1 F4 E6 59 81 84 A6 EE 9A 37 23 C5 AF C1 75 45 2E 69 8A A0 93 AC 95 C6 5E AA FA 22 24 F0 8B 11 6E 50 28 2C 01 AB 03 F6 38 35 F8 93 0F 17 2C E3 92 EF 36 9A B6 0B F5 E2 5B C9 05 99 90 38 B4 52 3F F4 42 50 8F DC 6F 05 65 CE 20 EB A0 46 56 39

02 81 80

02 70 6D 33 0E 31 1A EE A0 EE 94 01 E8 8D 31 0E 0A D3 B7 C7 AB D6 52 F6 27 C2 20 5F D7 18 3E CF 13 48 07 CD 82 9C 61 7F 4B 89 3E B1 2B 3A B6 33 DC D1 B6 CC FB DA C9 DF 2B 1C BC CA AF A9 BC 98 43 80 72 33 13 EC 87 E3 95 E1 C9 00 00 21 BB A7 D0 59 A5 5E 9E 4F 0E FD 94 11 98 F5 71 B6 E0 D0 D0 42 5B 73 A6 FB EB EB 06 32 B7 4C 71 CD 42 49 94 30 76 E7 08 78 58 B2 69 28 B9 06 88 67 8E B3

02 81 80

0F 6D 4D 97 25 5A BC 9D F9 B4 4D FF AF 56 09 44 1A D6 CE 8D 27 AA B3 F8 D1 D3 E3 3B B2 77 D4 5A 45 6F DA 62 C3 1D B4 C9 AE 19 84 72 A4 91 A5 F1 5B F3 D6 BC 71 E9 FA 99 BD D5 03 E6 65 78 25 AE CD A8 5B 77 1F 15 60 AC 5F AA 7F C0 29 91 A1 9C 44 91 8B 82 9C 02 4C 4E 73 9A 6D 90 31 44 28 BA ED 5D 7D 1B 6E 4D E2 EB 66 C9 0B 49 FE A5 E7 7E 63 57 D9 BC 67 43 13 1D 26 CF 92 FD 17 74 77 5B

我们通过OpenSSL来查看一下密钥的各参数情况:

openssl rsa -in private_pkcs1.pem -text -noout

Private-Key: (2048 bit)

modulus:

00:9c:b7:68:03:76:da:e7:b6:07:04:07:a7:61:b2:

c6:4d:c7:42:e3:c5:55:bd:55:43:5d:5e:8d:fd:6f:

b5:17:3b:41:46:3b:cd:3d:5d:43:30:e7:08:24:1a:

ef:79:39:60:2a:e8:36:3c:25:72:9d:a2:2d:b5:a3:

6a:97:aa:7f:f8:19:b8:1b:8d:64:c9:96:32:ed:14:

9a:50:26:89:de:bc:a3:71:7b:0a:7c:29:6d:9c:6f:

6f:0b:06:c8:37:e6:d5:72:1c:51:ce:3e:f7:f7:32:

00:d6:d0:47:9f:db:f6:d8:f8:45:70:47:ec:48:0c:

b6:1b:61:30:33:86:d0:df:c9:f6:52:b3:2c:7b:dc:

1b:2d:41:93:d2:4c:f2:aa:ec:0f:42:ce:ef:ae:25:

3e:d5:70:64:ad:db:2c:a0:0a:9b:c2:05:b9:c9:4a:

b1:0e:8b:18:07:98:7b:0f:56:13:5b:4a:8a:90:9e:

8f:3c:d9:cb:5d:b3:2f:d8:c7:b2:8f:1a:b5:b1:b5:

a8:17:f9:bc:b9:ba:1a:2a:49:6a:6a:5d:5e:a7:95:

2a:4e:9f:4e:14:d3:9a:4e:b5:72:5d:8e:06:92:de:

f0:ab:73:a8:36:f9:3d:d9:c2:75:7c:7c:fd:c2:7a:

e2:1a:8f:a8:36:eb:7d:81:0a:f5:59:58:ce:cd:19:

00:c3

publicExponent: 65537 (0x10001)

privateExponent:

31:56:2c:10:ab:22:4f:40:27:05:45:c3:94:26:4b:

f7:c0:7b:76:69:71:8c:a1:83:0b:a9:f0:d9:90:89:

5a:3e:f5:55:bf:0d:e5:fb:ae:63:7e:d8:39:45:a1:

8e:70:59:ae:28:5c:aa:a2:bf:6a:90:dc:03:0a:e7:

4b:c8:09:71:79:e7:54:05:37:6d:9f:33:79:1f:bb:

54:f0:4d:07:2a:2b:ea:55:e9:ff:1c:ab:bd:4b:f7:

91:69:19:2f:40:24:82:40:18:20:ee:01:f2:78:73:

7b:2d:26:df:54:c8:69:95:ff:86:51:9e:39:30:87:

44:27:5c:9d:5c:1b:f5:d7:88:d4:9d:e0:ad:0f:3c:

b0:a2:ec:c8:a6:ed:60:cb:de:44:f9:b7:73:d8:29:

4f:38:8c:24:91:29:56:b8:e0:94:0a:e2:22:27:5b:

a4:51:90:be:a9:0e:66:eb:a1:5c:68:93:d4:25:64:

e3:97:b0:56:e1:9f:07:b6:ad:3f:5e:92:66:bb:cc:

ac:4e:80:46:52:d7:3a:57:0d:52:e5:e9:49:37:62:

f7:2e:c0:0d:c3:92:a6:a6:f6:0f:d7:9f:1b:98:3e:

20:8e:f5:67:ed:19:a9:70:f0:82:f4:73:05:b8:30:

01:5e:55:01:64:4e:29:be:84:0a:38:bd:eb:f2:27:

c1

prime1:

00:d0:8e:ef:5f:f7:98:86:28:cc:96:71:53:0a:4d:

bb:84:02:68:0a:e7:19:c6:82:7c:7f:e4:f4:44:fb:

ef:6c:39:33:c1:33:f4:1a:28:72:a6:f3:32:09:6a:

3a:cd:25:3c:a0:c1:28:96:87:2d:52:97:51:d5:9d:

63:3a:74:73:d6:13:7b:60:a7:38:f3:84:d3:9d:2b:

6e:a4:71:de:65:7f:5a:8f:0d:46:9f:2b:f5:b0:64:

83:f8:95:56:84:7b:bf:04:df:18:fd:0d:db:2a:55:

15:2d:71:54:52:ac:bd:19:45:2e:0b:84:ab:bd:86:

69:ae:c0:bc:45:4c:31:4b:cd

prime2:

00:c0:5d:8a:29:17:c5:32:bf:92:b3:94:f1:b1:79:

90:3e:ce:f1:b5:42:bb:4c:f4:22:1b:cf:fb:ad:46:

92:9b:ab:9e:60:73:12:eb:53:84:ac:d5:58:7b:f7:

f7:56:63:fd:3b:f1:18:8d:4b:67:bb:98:cb:4a:d4:

62:b8:5a:08:a0:38:e6:f4:74:7c:56:33:2c:99:38:

a5:ab:f0:83:c9:06:78:98:18:b9:f8:81:c9:5c:6f:

e1:82:a1:a1:d5:08:d6:be:20:90:ca:d6:e5:79:f9:

df:e1:a7:a2:b0:1e:d5:6f:f9:3c:68:96:24:29:06:

16:22:da:2a:48:86:f5:8e:cf

exponent1:

57:c2:ee:24:1a:12:8a:d1:fc:55:8a:56:81:4d:78:

8c:f2:5e:49:c8:39:e6:78:de:5f:0b:3f:67:10:05:

0e:2b:7c:05:df:10:e7:39:02:16:12:dc:89:6d:b4:

54:c3:48:a1:f4:e6:59:81:84:a6:ee:9a:37:23:c5:

af:c1:75:45:2e:69:8a:a0:93:ac:95:c6:5e:aa:fa:

22:24:f0:8b:11:6e:50:28:2c:01:ab:03:f6:38:35:

f8:93:0f:17:2c:e3:92:ef:36:9a:b6:0b:f5:e2:5b:

c9:05:99:90:38:b4:52:3f:f4:42:50:8f:dc:6f:05:

65:ce:20:eb:a0:46:56:39

exponent2:

02:70:6d:33:0e:31:1a:ee:a0:ee:94:01:e8:8d:31:

0e:0a:d3:b7:c7:ab:d6:52:f6:27:c2:20:5f:d7:18:

3e:cf:13:48:07:cd:82:9c:61:7f:4b:89:3e:b1:2b:

3a:b6:33:dc:d1:b6:cc:fb:da:c9:df:2b:1c:bc:ca:

af:a9:bc:98:43:80:72:33:13:ec:87:e3:95:e1:c9:

00:00:21:bb:a7:d0:59:a5:5e:9e:4f:0e:fd:94:11:

98:f5:71:b6:e0:d0:d0:42:5b:73:a6:fb:eb:eb:06:

32:b7:4c:71:cd:42:49:94:30:76:e7:08:78:58:b2:

69:28:b9:06:88:67:8e:b3

coefficient:

0f:6d:4d:97:25:5a:bc:9d:f9:b4:4d:ff:af:56:09:

44:1a:d6:ce:8d:27:aa:b3:f8:d1:d3:e3:3b:b2:77:

d4:5a:45:6f:da:62:c3:1d:b4:c9:ae:19:84:72:a4:

91:a5:f1:5b:f3:d6:bc:71:e9:fa:99:bd:d5:03:e6:

65:78:25:ae:cd:a8:5b:77:1f:15:60:ac:5f:aa:7f:

c0:29:91:a1:9c:44:91:8b:82:9c:02:4c:4e:73:9a:

6d:90:31:44:28:ba:ed:5d:7d:1b:6e:4d:e2:eb:66:

c9:0b:49:fe:a5:e7:7e:63:57:d9:bc:67:43:13:1d:

26:cf:92:fd:17:74:77:5b

两相比对,结构一目了然。

3.2、PKCS#8形式的私钥结构

前面我们介绍了PKCS#1形式的公钥和私钥,那么什么是PKCS#1形式?什么又是PKCS#8形式呢?实际上,PKCS#1形式的密钥专指RSA的密钥,如果一个ECC的密钥就无法用PKCS#1形式来表达。那么有没有一个通过的机构既可以表示RSA密钥,又可以表示ECC的密钥呢?有,这个就是PKCS#8形式的密钥。

在RFC 5208中,我们可以找到PKCS#8密钥的ASN.1定义,如下:

PrivateKeyInfo ::= SEQUENCE {

version Version,

privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},

privateKey PrivateKey,

attributes [0] Attributes OPTIONAL

}

二进制结构如下:

30 82 04 BC

02 01 00

30 0D

06 09

2A 86 48 86 F7 0D 01 01 01

05 00

04 82 04 A6

30 82 04 A2

02 01 00

02 82 01 01

00 9C B7 68 03 76 DA E7 B6 07 04 07 A7 61 B2 C6 4D C7 42 E3 C5 55 BD 55 43 5D 5E 8D FD 6F B5 17 3B 41 46 3B CD 3D 5D 43 30 E7 08 24 1A EF 79 39 60 2A E8 36 3C 25 72 9D A2 2D B5 A3 6A 97 AA 7F F8 19 B8 1B 8D 64 C9 96 32 ED 14 9A 50 26 89 DE BC A3 71 7B 0A 7C 29 6D 9C 6F 6F 0B 06 C8 37 E6 D5 72 1C 51 CE 3E F7 F7 32 00 D6 D0 47 9F DB F6 D8 F8 45 70 47 EC 48 0C B6 1B 61 30 33 86 D0 DF C9 F6 52 B3 2C 7B DC 1B 2D 41 93 D2 4C F2 AA EC 0F 42 CE EF AE 25 3E D5 70 64 AD DB 2C A0 0A 9B C2 05 B9 C9 4A B1 0E 8B 18 07 98 7B 0F 56 13 5B 4A 8A 90 9E 8F 3C D9 CB 5D B3 2F D8 C7 B2 8F 1A B5 B1 B5 A8 17 F9 BC B9 BA 1A 2A 49 6A 6A 5D 5E A7 95 2A 4E 9F 4E 14 D3 9A 4E B5 72 5D 8E 06 92 DE F0 AB 73 A8 36 F9 3D D9 C2 75 7C 7C FD C2 7A E2 1A 8F A8 36 EB 7D 81 0A F5 59 58 CE CD 19 00 C3

02 03

01 00 01

02 82 01 00

31 56 2C 10 AB 22 4F 40 27 05 45 C3 94 26 4B F7 C0 7B 76 69 71 8C A1 83 0B A9 F0 D9 90 89 5A 3E F5 55 BF 0D E5 FB AE 63 7E D8 39 45 A1 8E 70 59 AE 28 5C AA A2 BF 6A 90 DC 03 0A E7 4B C8 09 71 79 E7 54 05 37 6D 9F 33 79 1F BB 54 F0 4D 07 2A 2B EA 55 E9 FF 1C AB BD 4B F7 91 69 19 2F 40 24 82 40 18 20 EE 01 F2 78 73 7B 2D 26 DF 54 C8 69 95 FF 86 51 9E 39 30 87 44 27 5C 9D 5C 1B F5 D7 88 D4 9D E0 AD 0F 3C B0 A2 EC C8 A6 ED 60 CB DE 44 F9 B7 73 D8 29 4F 38 8C 24 91 29 56 B8 E0 94 0A E2 22 27 5B A4 51 90 BE A9 0E 66 EB A1 5C 68 93 D4 25 64 E3 97 B0 56 E1 9F 07 B6 AD 3F 5E 92 66 BB CC AC 4E 80 46 52 D7 3A 57 0D 52 E5 E9 49 37 62 F7 2E C0 0D C3 92 A6 A6 F6 0F D7 9F 1B 98 3E 20 8E F5 67 ED 19 A9 70 F0 82 F4 73 05 B8 30 01 5E 55 01 64 4E 29 BE 84 0A 38 BD EB F2 27 C1

02 81 81

00 D0 8E EF 5F F7 98 86 28 CC 96 71 53 0A 4D BB 84 02 68 0A E7 19 C6 82 7C 7F E4 F4 44 FB EF 6C 39 33 C1 33 F4 1A 28 72 A6 F3 32 09 6A 3A CD 25 3C A0 C1 28 96 87 2D 52 97 51 D5 9D 63 3A 74 73 D6 13 7B 60 A7 38 F3 84 D3 9D 2B 6E A4 71 DE 65 7F 5A 8F 0D 46 9F 2B F5 B0 64 83 F8 95 56 84 7B BF 04 DF 18 FD 0D DB 2A 55 15 2D 71 54 52 AC BD 19 45 2E 0B 84 AB BD 86 69 AE C0 BC 45 4C 31 4B CD

02 81 81

00 C0 5D 8A 29 17 C5 32 BF 92 B3 94 F1 B1 79 90 3E CE F1 B5 42 BB 4C F4 22 1B CF FB AD 46 92 9B AB 9E 60 73 12 EB 53 84 AC D5 58 7B F7 F7 56 63 FD 3B F1 18 8D 4B 67 BB 98 CB 4A D4 62 B8 5A 08 A0 38 E6 F4 74 7C 56 33 2C 99 38 A5 AB F0 83 C9 06 78 98 18 B9 F8 81 C9 5C 6F E1 82 A1 A1 D5 08 D6 BE 20 90 CA D6 E5 79 F9 DF E1 A7 A2 B0 1E D5 6F F9 3C 68 96 24 29 06 16 22 DA 2A 48 86 F5 8E CF

02 81 80

57 C2 EE 24 1A 12 8A D1 FC 55 8A 56 81 4D 78 8C F2 5E 49 C8 39 E6 78 DE 5F 0B 3F 67 10 05 0E 2B 7C 05 DF 10 E7 39 02 16 12 DC 89 6D B4 54 C3 48 A1 F4 E6 59 81 84 A6 EE 9A 37 23 C5 AF C1 75 45 2E 69 8A A0 93 AC 95 C6 5E AA FA 22 24 F0 8B 11 6E 50 28 2C 01 AB 03 F6 38 35 F8 93 0F 17 2C E3 92 EF 36 9A B6 0B F5 E2 5B C9 05 99 90 38 B4 52 3F F4 42 50 8F DC 6F 05 65 CE 20 EB A0 46 56 39

02 81 80

02 70 6D 33 0E 31 1A EE A0 EE 94 01 E8 8D 31 0E 0A D3 B7 C7 AB D6 52 F6 27 C2 20 5F D7 18 3E CF 13 48 07 CD 82 9C 61 7F 4B 89 3E B1 2B 3A B6 33 DC D1 B6 CC FB DA C9 DF 2B 1C BC CA AF A9 BC 98 43 80 72 33 13 EC 87 E3 95 E1 C9 00 00 21 BB A7 D0 59 A5 5E 9E 4F 0E FD 94 11 98 F5 71 B6 E0 D0 D0 42 5B 73 A6 FB EB EB 06 32 B7 4C 71 CD 42 49 94 30 76 E7 08 78 58 B2 69 28 B9 06 88 67 8E B3

02 81 80

0F 6D 4D 97 25 5A BC 9D F9 B4 4D FF AF 56 09 44 1A D6 CE 8D 27 AA B3 F8 D1 D3 E3 3B B2 77 D4 5A 45 6F DA 62 C3 1D B4 C9 AE 19 84 72 A4 91 A5 F1 5B F3 D6 BC 71 E9 FA 99 BD D5 03 E6 65 78 25 AE CD A8 5B 77 1F 15 60 AC 5F AA 7F C0 29 91 A1 9C 44 91 8B 82 9C 02 4C 4E 73 9A 6D 90 31 44 28 BA ED 5D 7D 1B 6E 4D E2 EB 66 C9 0B 49 FE A5 E7 7E 63 57 D9 BC 67 43 13 1D 26 CF 92 FD 17 74 77 5B

四、证书

4.1、证书的类型

证书有三种类型:X.509证书、PKCS#7证书、PKCS#12证书

4.2、X.509证书

X.509只包含公钥,没有私钥,这种证书一般公开发布,可用于放在客服端使用,用于加密、验签。它的ASN.1定义如下:

Certificate ::= SEQUENCE {

tbsCertificate TBSCertificate,

signatureAlgorithm AlgorithmIdentifier,

signatureValue BIT STRING

}

TBSCertificate ::= SEQUENCE {

version [0] EXPLICIT Version DEFAULT v1,

serialNumber CertificateSerialNumber,

signature AlgorithmIdentifier,

issuer Name,

validity Validity,

subject Name,

subjectPublicKeyInfo SubjectPublicKeyInfo,

issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,

-- If present, version MUST be v2 or v3

subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,

-- If present, version MUST be v2 or v3

extensions [3] EXPLICIT Extensions OPTIONAL

-- If present, version MUST be v3

}

SubjectPublicKeyInfo ::= SEQUENCE {

algorithm AlgorithmIdentifier,

subjectPublicKey BIT STRING

}

4.3、PKCS#12证书

因为X.509证书只包含公钥,但有些时候我们需要把私钥和公钥合并成一个证书,放在服务端使用,用于解密、签名。 PKCS#12就定义了这样一种证书,它既包含了公钥有包含了私钥。典型的入pfx、p12证书就是PKCS#12证书。

4.4、PKCS#7证书

当你收到一个网站的证书后,你需要验证其真实性。因为一个X.509证书包含了公钥、持有人信息、签名。为了验证其真实性,你需要签证其签名,而验证签名则需要签发的CA机构的公钥证书。同样原理,当你拿到CA机构的公钥证书后,你也需要验证该CA机构的真实性,而验证该CA机构的证书,你需要该CA上级机构的CA公钥证书...以此类推,你需要一直验证到根证书为止。

所以为了验证一个网站证书的真实性,你需要的不仅一张证书,而是一个证书链。而PKCS#7就定义了这样一个证书链的类型结构。典型如p7b后缀名的证书就是这样的格式。

下图是苹果网站的证书链:

5、用OpenSSL命令行处理各种类型间的转换

5.1、密钥处理

RSA私钥生成(==> PKCS#1)

openssl genrsa -out private_pkcs1.pem 2048

RSA公钥提取

openssl rsa -in private_pkcs1.pem -out public_pkcs8.pem -pubout

openssl rsa -in private_pkcs1.pem -out public_pkcs1.pem -pubout -RSAPublicKey_out

openssl rsa -in private_pkcs8.pem -out public_pkcs8.pem -pubout

openssl rsa -in private_pkcs8.pem -out public_pkcs1.pem -pubout -RSAPublicKey_out

RSA公钥格式转换(PKCS#8 ==> PKCS#1)

openssl rsa -in public_pkcs8.pem -out public_pkcs1.pem -pubin -RSAPublicKey_out

RSA私钥格式转换(PKCS#1 ==> PKCS#8)

openssl pkcs8 -in private_pkcs1.pem -out private_pkcs8.pem -topk8 -nocrypt

RSA私钥格式转换(PKCS#8 ==> PKCS#1)

openssl rsa -in private_pkcs8.pem -out private_pkcs1.pem

RSA公钥编码格式转换(PKCS#8:PEM ==> DER)

openssl rsa -pubin -in public_pkcs8.pem -out public_pkcs8.der -outform DER

openssl rsa -in private_pkcs8.pem -out private_pkcs1.der -outform DER

查看私钥及公钥n、e、d

输出到命令行窗口

openssl rsa -in private_pkcs8.pem -text

openssl rsa -in private_pkcs1.pem -text

openssl rsa -in public_pkcs8.pem -text -pubin

openssl rsa -in public_pkcs1.pem -text -pubin (命令报错,不可执行)

输出到文件

openssl rsa -in private_pkcs8.pem -text -out out.txt

从pfx文件中提取私钥(==> PKCS#8)

openssl pkcs12 -in demo_749054.pfx -nocerts -nodes -out private_pkcs8.pem

5.2、X.509证书处理

创建

1.生成私钥

openssl genrsa -out private_pkcs1.pem 4096

2.生成证书签名请求(CSR)

openssl req -new -key private_pkcs1.key -out certificate_csr.csr

3.使用上一步的证书签名请求签发证书

openssl x509 -req -days 365 -in certificate_csr.csr -signkey private_pkcs1.key -out certificate.pem

openssl x509 -req -days 365 -in certificate_csr.csr -signkey private_pkcs1.key -out certificate.der -outform DER

以上三个步骤也可以通一个简单的方法,实现一步创建私钥和证书(此种方式生成的私钥必须加密):

openssl req -new -x509 -newkey rsa:4096 -keyout private_pkcs1.pem -out certificate.der

查看证书内容

openssl x509 -in certificate.pem -text

openssl x509 -in certificate.pem -text -noout (不输出文件本身内容)

openssl x509 -in certificate.der -inform DER -text

5.3、PKCS7证书处理

从 p7b 文件中提取所有证书(PKCS7 ==> X.509?)

openssl pkcs7 -inform DER -in certificate_pkcs7.p7b -out certificate.pem -print_certs

从提取的证书中提取公钥(X.509? ==> PKCS8)

openssl x509 -in certificate.pem -pubkey -noout > public_pkcs8.pem

5.4、PKCS12证书处理

移除 pfx 证书密钥

运行下面命令,第一次输入原证书密码,第二次数据新证书密码(直接回车表示无密码)

openssl pkcs12 -in encrypted.pfx -out decrypted.pfx

从 pfx 证书中导出密钥 (pfx ==> PKCS8)

openssl pkcs12 -in certificate_p12.pfx -out private_pkcs8.pem -nodes -nocerts

从 pfx 证书中导出密钥及证书 (pfx ==> PKCS8、X.509)

openssl pkcs12 -in certificate_p12.pfx -out private_pkcs8.pem -nodes

根据密钥及证书导出pfx

openssl pkcs12 -inkey private_pkcs1.pem -in certificate.pem -out p12.pfx -export

5.5、ASN.1 解析

解析公钥(PKCS#1)

openssl asn1parse -in public_pkcs1.pem

openssl ans1parse -in certificate.pem

openssl ans1parse -in certificate.der -inform DER

优惠劵

he25819

关注

关注

20

点赞

60

收藏

觉得还不错?

一键收藏

知道了

1

评论

RSA密钥格式解析

原文:https://www.jianshu.com/p/c93a993f8997一、前言在开发过程中,我们常常遇到用RSA进行加密、解密、签名及验签处理,而在进行这些处理的时候,必须首先到导入我们的密钥(公钥或私钥),而我们拿到的密钥有各种形式,例如:pem、der、cer、Pfx、p12、p7b等等。这里我们常常会有很多疑问,我们的处理代码需要那种格式的密钥?这些不同格式的密钥之间如何相互转化?在格式转化中,往往有牵扯到各种概念,象x509、PKCS#1、PKCS#7、PKCS#8、PKCS12

复制链接

扫一扫

专栏目录

RSA公钥加密体制

Yuuaaa的博客

09-27

2198

RSA是第一个安全、实用的公钥加密算法,已成为国际标准,是目前应用广泛的公钥加密体制。RSA的基础是数论的欧拉定理,它的安全性依赖于大整数因子分解的困难性。

RSA的公钥和私钥的ASN.1编码

wzj_whut的专栏

01-14

1万+

RSA的公钥和私钥的ASN.1编码

ASN.1 BER编码 https://blog.csdn.net/wzj_whut/article/details/86241935

pkcs-1定义

ftp://ftp.rsa.com/pub/pkcs/ascii/pkcs-1.asc

https://tools.ietf.org/html/rfc2313

https://tools.ietf.org/html/rfc5280

X.509中的...

1 条评论

您还未登录,请先

登录

后发表或查看评论

Java中RSA非对称密钥加解密使用示例

12-22

一、简介:

  RSA加密算法是常用的非对称加密算法,CFCA在证书服务中离不了它。RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为流行的公开密钥算法。

  二、RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表

  三、使用方式:

  ① 假设A、B机器进行通信,已A机器为主;

  ② A首先需要用自己的私钥为发送请求数据签名,并将公钥一同发送给B;

  ③ B收到数据后,需要用A发送的公钥进行验证,已确保

RSA私钥和公钥文件格式 (pkcs#7, pkcs#8, pkcs#12, pem)

热门推荐

tuhuolong的专栏

01-16

3万+

RSA Public Key file (PKCS#1)

The RSA Public key PEM file is specific for RSA keys.

It starts and ends with the tags:

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

BASE64 ENCODED DATA

-----END RSA PUBLIC KEY

RSA加密中PEM、DER的编解码问题

wisemanchen的博客

05-08

3455

本文导航1 前言2 PEM与DER转换2.1 PEM转DER格式2.2 DER转PEM格式3 DER解码3.1 初步解码3.2 DER文件结构3.3 解码*关于BIT_STRING和modulus部分数据以0x00开头的说明*Ref

1 前言

最近在玩CTF,还没入门,做题的时候遇到一道RSA的题,给了一个pubkey.pem文件和一个flag.enc文件。之前对于rsa的认识停留在ssh的时候生成公钥和私钥文件,但是文件里面具体内容没有关注过,所以打开pubkey.pem文件后不知道怎么处理。

看了网上都

RSA与证书

01-19

3469

这篇文章详细讲述一下RSA与证书的相关内容。内容有点多,但都是干货。

RSA密钥格式解析 DER-PEM 转换代码

luopandeng的专栏

02-22

7351

环境: ubuntu20.4 内核 5.10.10

RSA是最常见的非对称加密算法,RSA的原理就不做介绍了,主要介绍一下密钥格式,linux 进行密钥转换编程。

要学习RSA编码,首先需要理解RSA密钥的格式。

RSA有公钥,私钥之分,公钥私钥都使用相同的语法格式。

RSA的密钥有两种格式,PEM格式,DER格式

PEM格式

PEM格式包含几种报文头"-----BEGIN PUBLIC KEY-----": PKCS#8 格式公钥"-----BEGIN PRIVATE ...

RSA公私钥格式分析及其在Java和Openssl之间的转换方法

yaoyuanyylyy的专栏

05-01

5340

文章目录PKCS#1和PKCS#8X.509公钥证书ASN.1抽象语法标记DER和PEM编码OID对象标识符用openssl命令生成RSA密钥生成RSA私钥从私钥中导出公钥PKCS#1格式的RSA公钥PKCS#1格式的RSA私钥PKCS#8格式的未加密的RSA私钥X.509中RSA公钥待续

PKCS#1和PKCS#8

PKCS(The Public-Key Cryptography Standar...

RSA公私钥对及相关加解密格式详解(一)

ryanzzzzz的博客

10-08

1224

89 - 1字节,标识后续0x89=137=3+1+128+2+3字节内容。3081 - 公钥标签头,81表示紧跟后续1个字节标识公钥长度。8181 - 标识后面的模式n的长度为0x81 = 129字节。028181 - 3字节,标识后续为0x81 = 129字节。0203010001 - 这里和公钥相同,也就是e的取值。010001 - RSA公钥(n,e)中的e取值。0203 - 2字节,标识e的长度为3字节。3082 - 标签头,后面接2字节标识长度。00 - 1字节,内容固定为0x00。

RSA加密算法个人理解

oldwolf1987的专栏

03-31

3912

RSA加密算法   引用http://www.cfca.com.cn/zhishi/wz-012.htmRSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。但是有不少新来的同事对它不太了解,恰好看到一本书中作者用实例对它进行了简化而生动的描述,使得高深的数学理论能够被容易地理解。我们经过整理和改写特别推荐给大家阅读,希望能够对时间紧张但是又想了解它的同事有所帮助。 

RSA公私钥各种格式(包括加密)转换以及验签过程

08-18

功能如下:

1、转换各种PEM(XML)格式公私钥,可以根据私钥获取公钥(pkcs8一般java用,xml格式一般C#用)

2、签名数据

3、验签并获取签名前的数据

3、公私钥格式加密或去密(支持大量对称算法,包括淘汰的)

4、生成RSA公私钥对

软件调用OpenSSL相关函数,ui使用Qt5.9(不支持xp),遵循LGPL协议。

支持win7以上的32或64位系统

openssl中把pem格式转为RSA解析密钥中的参数

08-07

openssl 1.1.1C 中把pem格式的rsa密钥解析出,RSA格式的密钥,然后从RSA密钥中解析出RSA密钥中的,n,d,e,dp,dq等信息;

RSA公私钥DER格式说明

10-28

RSA算法的公私钥 编码格式之DER编码的详细字段分割说明

C#JAVA密钥转换 与生成

10-03

C#与JAVA调用密钥的格式不一样,需要转换,同时还提供了密钥生成功能

《RSA实现中弱密钥漏洞分析》本科毕业论文一万字.doc

10-23

2.2 RSA密钥生成 2.3 RSA加密解密过程 第三章 弱密钥漏洞概述 3.1 弱密钥定义 3.2 弱密钥漏洞分类 3.3 弱密钥生成原因 第四章 弱密钥漏洞分析 4.1 弱密钥漏洞的攻击方法 4.2 弱密钥漏洞的影响 第五章 弱密钥漏洞的...

JAVA源码JAVA基于BS结构下的OA流程可视化的研究与实现(源代码+论文)

最新发布

03-09

JAVA源码JAVA基于BS结构下的OA流程可视化的研究与实现(源代码+论文)本资源系百度网盘分享地址

人工智能数据集(1003.json)

03-09

人工智能数据集(1003.json)

器具位于空调空间,温度、湿度均衡,唯有日月引力、气压影响结果。

幸运之门软件突破简单数字囹圄,实时采集天体信息,构建三角引力模型,直抵随机数据之秘。

包括但不限于纬度(北京中心区)、月球赤纬及开奖当时的太阳地球距离、地月距离等等。

依据“下期开出时间”的“日月引力”、“大气压”等模型演算出若干珠玑数据。

属于高级智能计算,需从(100多万)中摘选最佳数据。

html+css+bootstrap-花店商城网站设计,精美的花店网站代码Florist.zip

03-09

【技术分析】

HTML,是一种制作万维网页面的标准语言,它消除了不同计算机之间信息交流的障碍;

CSS,可以帮助把网页外观做得更加美观;

JavaScript,是一种轻量级的解释型编程语言;

jQuery,使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供AJAX交互;

Bootstrap 是快速开发 Web 应用程序的前端工具包。它是一个 CSS,HTML 和 JS 的集合,它使用了最新的浏览器技术,给你的 Web 开发提供了时尚的版式;

AJAX,创建交互式网页应用的网页开发技术。

【设计思路】

用户友好性:界面简洁直观,易于操作,减少用户的学习成本。

模块化设计:将系统功能模块化,每个模块负责一类功能,方便扩展和维护。

Responsiveness:后台管理系统应当是响应式设计,能够适配不同设备屏幕大小,包括电脑、平板和手机等。

权限控制:根据用户角色设定不同的权限,确保用户只能访问其权限范围内的功能。

数据安全:对用户数据进行加密存储、访问控制等措施,保护用户隐私和系统安全。

日志功能:记录关键操作日志,保留操作痕迹。

pandasdb2-2.0-py3-none-any.whl

03-09

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

c语言32个关键字翻译图

04-28

C语言是一种很受欢迎的编程语言,它使用32个关键字来控制程序结构和执行过程。这些关键字不同于普通变量名或函数名,具有特殊的语法意义,因此翻译这些关键字非常重要。下面是这些关键字的翻译图:

自动(auto):用于声明自动变量,通常在函数中使用。

双精度(double):用于声明双精度浮点数型变量。

打破(break):用于中断当前循环或switch语句。

案例(case):用于定义switch语句中的分支。

字符(char):用于声明字符型变量。

连续(continue):用于跳过当前循环的余下部分。

默认(default):用于定义switch语句中的默认分支。

执行(do):用于定义do-while循环。

双次(else):用于定义if语句中执行非if分支的情况。

枚举(enum):用于定义枚举类型。

外部(extern):用于声明外部变量或函数。

浮点(float):用于声明浮点型变量。

为(for):用于定义for循环。

去(goto):用于跳转到程序中某个标号。

如果(if):用于定义条件语句。

整型(int):用于声明整型变量。

长(long):用于声明长整型变量。

登陆(signed):用于声明有符号型变量。

长度(sizeof):用于获取数据类型或变量的长度。

静态(static):用于声明静态变量或函数。

结构(struct):用于定义结构体类型。

开关(switch):用于定义多分支情况下的判断语句。

类型定义(typedef):用于定义自定义数据类型。

联合(union):用于定义联合体类型。

未登陆(unsigned):用于声明无符号型变量。

返回(return):用于从函数中返回值。

短(short):用于声明短整型变量。

如(sizeof):用于获取数据类型或变量的长度。

紧缩(volatile):用于标识变量可能会改变,以便编译器不会将其优化。

当(while):用于定义while循环。

以上就是C语言32个关键字的翻译图,它们在程序中扮演着非常重要的角色,熟练掌握这些关键字,可以使程序的编写更加简洁、清晰和高效。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

he25819

CSDN认证博客专家

CSDN认证企业博客

码龄15年

暂无认证

23

原创

16万+

周排名

175万+

总排名

2万+

访问

等级

620

积分

2

粉丝

24

获赞

3

评论

73

收藏

私信

关注

热门文章

RSA密钥格式解析

14341

BBR安装

2101

java -jar 启动、重启、关闭shell脚本

1445

使用charles抓app包

681

在MySQL中实现Rank高级排名函数

639

分类专栏

转载

15篇

其他

2篇

leetcode

20篇

最新评论

RSA密钥格式解析

MrStevens:

牛,终于看到一篇价值很大的文章

leetcode 116. Populating Next Right Pointers in Each Node 最简单栈解法

不正经的kimol君:

写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

java -jar 启动、重启、关闭shell脚本

logback-spring.xml 完整配置

Linux “/“ 分区扩容

2022年4篇

2021年8篇

2020年26篇

目录

目录

分类专栏

转载

15篇

其他

2篇

leetcode

20篇

目录

评论 1

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

密钥格式梳理-CSDN博客

>

密钥格式梳理-CSDN博客

密钥格式梳理

最新推荐文章于 2024-03-07 23:37:13 发布

CodeStarr

最新推荐文章于 2024-03-07 23:37:13 发布

阅读量2.7k

收藏

3

点赞数

分类专栏:

Cryptography

文章标签:

密码学

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/Ga4ra/article/details/128880321

版权

Cryptography

专栏收录该内容

30 篇文章

0 订阅

订阅专栏

文章目录

各种密钥格式简介DERPyCryptodome源码参考

PEMOpenSSL命令操作参考资料

各种密钥格式简介

两种编码方式:

.der:用ASN.1语法编码的der格式; .pem:用BASE64编码的密钥;

# ASN.1 ------(序列化)------ DER ------(Base64编码)------ PEM

主流密钥文件后缀:

.cer,.cert:Windows证书,存放公钥,没有私钥; .crt:Linux证书,,存放公钥,没有私钥; .key, 一般是私钥

其它格式

.pfx, p12:der格式,存放公钥和加密私钥,主要用于windows平台,浏览器可以使用,

openssl pkcs12 -info -nocerts -in keystore.p12

.X509 证书

openssl x509 -help

.csr,Certificate Signing Request,即证书签名请求文件,把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。.jks,java 密钥库. 同时包含证书和私钥,一般有密码保护。可以由p12转换而来。

keytool -v -list -keystore file.jks

可以将多级证书导入同一个证书文件中,形成一个包含完整证书链的证书

PyCryptodome支持的非对称密钥格式如下

RSA public key:

X.509 certificate (binary or PEM format)X.509 subjectPublicKeyInfo DER SEQUENCE (binary or PEM encoding)PKCS#1 RSAPublicKey DER SEQUENCE (binary or PEM encoding)An OpenSSH line (e.g. the content of ~/.ssh/id_ecdsa, ASCII)

RSA private key:

PKCS#1 RSAPrivateKey DER SEQUENCE (binary or PEM encoding)PKCS#8 PrivateKeyInfo or EncryptedPrivateKeyInfo DER SEQUENCE (binary or PEM encoding)OpenSSH (text format, introduced in OpenSSH 6.5)

DER

ASN.1 defines the following rule sets that govern how data structures that are being sent between computers are encoded and decoded.

Basic Encoding Rules (BER)Canonical Encoding Rules (CER), subsets of BERDistinguished Encoding Rules (DER), subsets of BERPacked Encoding Rules (PER)

CER and DER were developed later as specialized subsets of BER.

PER was developed in response to criticisms about the amount of bandwidth required to transmit data using BER or its variants. PER provides a significant savings.

DER was created to satisfy the requirements of the X.509 specification for secure data transfer.

DER文件后缀通常为 “.der” 和 “.cer”

各个公钥算法文档都会给出密钥的DER格式,如RFC 8017: PKCS #1附录Appendix A部分给出的私钥格式:

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

}

PyCryptodome源码参考

\Crypto\PublicKey\RSA.py

from Crypto.Util.asn1 import DerSequence

#: `Object ID`_ for the RSA encryption algorithm. This OID often indicates

#: a generic RSA key, even when such key will be actually used for digital

#: signatures.

#:

#: .. _`Object ID`: http://www.alvestrand.no/objectid/1.2.840.113549.1.1.1.html

oid = "1.2.840.113549.1.1.1"

def export_key(self, format='PEM', passphrase=None, pkcs=1,

protection=None, randfunc=None):

# ...

# DER format is always used, even in case of PEM, which simply

# encodes it into BASE64.

if self.has_private():

binary_key = DerSequence([0,

self.n,

self.e,

self.d,

self.p,

self.q,

self.d % (self.p-1),

self.d % (self.q-1),

Integer(self.q).inverse(self.p)

]).encode()

if pkcs == 1:

key_type = 'RSA PRIVATE KEY'

if format == 'DER' and passphrase:

raise ValueError("PKCS#1 private key cannot be encrypted")

else: # PKCS#8

from Crypto.IO import PKCS8

if format == 'PEM' and protection is None:

key_type = 'PRIVATE KEY'

binary_key = PKCS8.wrap(binary_key, oid, None)

else:

key_type = 'ENCRYPTED PRIVATE KEY'

if not protection:

protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC'

binary_key = PKCS8.wrap(binary_key, oid,

passphrase, protection)

passphrase = None

else: # if self.has_private():

key_type = "PUBLIC KEY"

binary_key = _create_subject_public_key_info(oid,

DerSequence([self.n,

self.e])

)

if format == 'DER':

return binary_key

if format == 'PEM':

from Crypto.IO import PEM

pem_str = PEM.encode(binary_key, key_type, passphrase, randfunc)

return tobytes(pem_str)

以上封装支持pkcs1和pkcs8两种,pkcs8封装源码如下:

if key_params is None:

key_params = DerNull()

#

# PrivateKeyInfo ::= SEQUENCE {

# version Version,

# privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,

# privateKey PrivateKey,

# attributes [0] IMPLICIT Attributes OPTIONAL

# }

#

pk_info = DerSequence([

0,

DerSequence([

DerObjectId(key_oid),

key_params

]),

DerOctetString(private_key)

])

pk_info_der = pk_info.encode()

if passphrase is None:

return pk_info_der

if not passphrase:

raise ValueError("Empty passphrase")

# Encryption with PBES2

passphrase = tobytes(passphrase)

if protection is None:

protection = 'PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC'

return PBES2.encrypt(pk_info_der, passphrase,

protection, prot_params, randfunc)

PEM

PEM,Privacy Enhanced Mail

以下为OpenSSL接口文档对私钥pem的介绍。

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

Proc-Type: 4,ENCRYPTED

DEK-Info: DES-EDE3-CBC,3F17F5316E2BAC89

...base64 encoded data...

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

The line beginning with Proc-Type contains the version and the protection on the encapsulated data. The line beginning DEK-Info contains two comma separated values: the encryption algorithm name as used by EVP_get_cipherbyname() and an initialization vector used by the cipher encoded as a set of hexadecimal digits. After those two lines is the base64-encoded encrypted data.

文件后缀通常为".pem"、“.cer”、“.crt”、“.key”.

OpenSSL命令操作

环境:ubuntu 20.04

Windows下会有乱码

# 获取baidu证书

openssl s_client -connect baidu.com:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > baidu.crt

head .\baidu.crt -n 20

openssl x509 -in baidu.crt -text -noout

# 转der

openssl x509 -outform der -in baidu.crt -out baidu.der

# 提取公钥

openssl x509 -in baidu.crt -pubkey -noout > baidu.crt

cat baidu.key

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

#MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn67f1NLdKwi96kdzB+/W

#...

参考资料

RSA — PyCryptodome 3.17.0 documentation

Distinguished Encoding Rules - Win32 apps | Microsoft Learn

PEM:

RFC 1421: Privacy Enhancement for Internet Electronic Mail: Part I: Message Encryption and Authentication Procedures (rfc-editor.org) RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management (rfc-editor.org) RFC 1423: Privacy Enhancement for Internet Electronic Mail: Part III: Algorithms, Modes, and Identifiers (rfc-editor.org) RFC 1424: Privacy Enhancement for Internet Electronic Mail: Part IV: Key Certification and Related Services (rfc-editor.org)

/docs/man3.0/man1/openssl-s_client.html

优惠劵

CodeStarr

关注

关注

0

点赞

3

收藏

觉得还不错?

一键收藏

知道了

0

评论

密钥格式梳理

der\pem, crt/cer, x509

复制链接

扫一扫

专栏目录

RSA公私钥各种格式(包括加密)转换以及验签过程

08-18

功能如下:

1、转换各种PEM(XML)格式公私钥,可以根据私钥获取公钥(pkcs8一般java用,xml格式一般C#用)

2、签名数据

3、验签并获取签名前的数据

3、公私钥格式加密或去密(支持大量对称算法,包括淘汰的)

4、生成RSA公私钥对

软件调用OpenSSL相关函数,ui使用Qt5.9(不支持xp),遵循LGPL协议。

支持win7以上的32或64位系统

密钥相关文件格式

极客神殿

10-22

2749

密钥库文件格式【Keystore】格式 : JKS

扩展名 : .jks/.ks

描述 : 【Java Keystore】密钥库的Java实现版本,provider为SUN

特点 : 密钥库和私钥用不同的密码进行保护格式 : JCEKS

扩展名 : .jce

描述 : 【JCE Keystore】密钥库的JCE实现版本,prov

参与评论

您还未登录,请先

登录

后发表或查看评论

SSL中,公钥、私钥、证书(pem、crt、cer、key、csr)的后缀名都是些啥?

HD243608836的博客

10-21

2万+

今天做这么一个事,centos服务器,tomcat8+nginx1.6,现在要在上面运行cas4.0。所以需要配ssl,然后找教程,了解到,需要把tomcat和nginx的ssl都配置好。到这里就晕了,tomcat配ssl需要一个.keystore文件,nginx则需要配一个.crt和一个.key的文件。按照教程使用keytool生成了.keystore文件,然后我需要通过.keystore导出一个.crt文件,但是找了好多教程只是导出.cer文件。

证书格式的相互转换:DER、CRT、CER、PEM

热门推荐

行走的大山

08-19

2万+

参考:

https://blog.csdn.net/xiangguiwang/article/details/76400805;

https://blog.csdn.net/qq_18105691/article/details/83339101;

一、证书和编码

X.509证书,其核心是根据RFC 5280编码或数字签名的数字文档。

二、编码

.PEM格式

.PEM = PEM扩展用于不同类型的...

RSA密钥格式解析 DER-PEM 转换代码

luopandeng的专栏

02-22

7351

环境: ubuntu20.4 内核 5.10.10

RSA是最常见的非对称加密算法,RSA的原理就不做介绍了,主要介绍一下密钥格式,linux 进行密钥转换编程。

要学习RSA编码,首先需要理解RSA密钥的格式。

RSA有公钥,私钥之分,公钥私钥都使用相同的语法格式。

RSA的密钥有两种格式,PEM格式,DER格式

PEM格式

PEM格式包含几种报文头"-----BEGIN PUBLIC KEY-----": PKCS#8 格式公钥"-----BEGIN PRIVATE ...

区块链-密钥的格式

朝歌

05-13

2502

目录:https://blog.csdn.net/qq_40452317/article/details/88541373

私钥格式

一下是常用的一些私钥中使用的三种格式。十六进制和原始的二进制格式用在软件的内部,很少展示给用户看。WIF格式用在钱包之间密钥的输入和输出,也用于代表私钥的二维码(条形码)。

Raw原意是"未加工"。RAW格式的全称是RAW Image Forma...

常见证书密钥格式与标准

salahi的专栏

02-22

1915

作为一个加密开发者,一定要熟悉证书密钥的各种格式、编码与标准。证书密钥后缀推荐

1. x509 证书后缀推荐 .crt

2. pem 密钥后缀推荐 .pem

3. 普通 密钥后缀推荐 .key

PEM 与 DER 格式详解

风神韵

05-05

1万+

本文描述了PEM与DER格式的关系,并详细描述了两者如何转换,最后对PEM和DER的内容进行解析。

关于PEM, DER, CRT, CER,KEY等各类证书与密钥文件后缀的解释

Laurence的技术博客

03-18

2万+

文章目录PEM文件DER文件PEM与DER的相互转换

总得来说这些文件都与X.509证书和密钥文件有关,从文件编码上分,只有两大类:

PEM格式:使用Base64 ASCII进行编码的纯文本格式

DER格式:二机制格式

而CRT, CER,KEY这几种证书和密钥文件,它们都有自己的schema,在存储为物理文件时,既可以是PEM格式,也可以DER格式。

CER:一般用于windows的证书文件格式

CRT:一般用于Linux的证书,包含公钥和主体信息

KEY:一般用于密钥,特别是私钥

打个比方:CE

密钥格式标准PKCS,X.509

诗人不写诗

10-07

2431

一、ASN.1

Abstract Syntax Notation One,抽象语法标记

ASN.1是一种 ISO/ITU-T 标准,用于描述对数据进行表示、编码、传输和解码。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何实现这些数据的具体方式,也不用去管到底是什么样的应用程序。ASN.1是一种标记语言,用于描述数据结构,但不对数据结构进行实现。

二、PKCS

The Public-Key Cryptography Standards,公钥密码学标准

是由美国RSA数据安全公司及其合作伙伴

加密证书格式(DER、CRT、CER、PEM)前世今生

glenshappy的专栏

03-23

2404

实际上,术语X.509证书通常指的是IETF的PKIX证书和X.509 v3证书标准的CRL 文件,即如RFC 5280(通常称为PKIX for Public Key Infrastructure(X.509))中规定的。CER = .crt的替代形式(Microsoft Convention)您可以在微软系统环境下将.crt转换为.cer(.both DER编码的.cer,或base64 [PEM]编码的.cer)。正确的说法是“我有一个DER编码的证书”不是“我有一个DER证书”。

密钥管理系统带来的思考,商业密码改造方案

07-11

以密码机为基础打造一款全新的密钥管理系统(密码服务平台)统一提供密码服务能力,以标准接口为基础,进行多次业务封装,真正为业务提供所需的密码能力,提供一种密改的思路,帮助业务系统梳理商业密码改造的核心...

微信小程序支付简单小结与梳理

03-29

公司最近在做微信小程序,被分配到做支付这一块,现在对这一块做一个简单的总结和梳理。 支付,对于购物来说,可以说是占据了十分重要的一块,毕竟能收到钱才是重点。 当然在开发之前,我们需要有下面这些东西: ...

简单了解小程序+node梳理登陆流程

01-03

如有不对欢迎在评论区指出 1. client: wx.login() wx.login({ success: ([code]) => { ...secret:小程序密钥申请账号时拿到;grant_type:默认值为 authorization_code) // 请求方法 const requ

小程序encryptedData

03-29

根据官方文档,我梳理了大致的解密流程,如下: (此图片来源于网络,如有侵权,请联系删除! ) 小程序客户端调用wx.login,回调里面包含js_code。 然后将js_code发送到服务器A(开发者服务器),服务器A向微信服务器...

Lerx网站管理系统 v2.6.2.zip

07-06

1.代码结构化梳理。 2.修复一些错误和需要改进的地方。 3.增加速度开关。如果你的服务器内存较大,请将配置文件 resourcesApplication_zh_CN.properties 中的lerx.data.query.mod 的值改为1 4.后台增加问答系统...

加密与安全_使用Java代码操作RSA算法生成的密钥对

小工匠

03-05

1206

在数字化时代,网络通信的安全性是必须关注的重要问题之一。非对称加密算法作为现代密码学的重要组成部分,为保护通信的隐私提供了一种可靠的解决方案。非对称加密算法,又称为公钥加密算法,是一种密码学中的重要概念。它与传统的对称加密算法不同,需要一对密钥:公钥和私钥。这对密钥之间存在着特殊的数学关系,但无法通过公钥推导出私钥,从而保证了通信的安全性。

[密码学]入门篇——加密方式

最新发布

Letian的编程混沌域

03-07

2281

密码学 加密方式 相关知识介绍

密码学之椭圆曲线

CCC_B的博客

02-28

598

椭圆曲线是曲线中的一种, x和y坐标满足方程y3a1xya3yx3a2x2a4xa5y3a1​xya3​yx3a2​x2a4​xa5​y3x3axby3x3axb这个方程就是所谓的Weierstrass方程Weierstrass方程Weierstrass方程。

C3 RSA密钥格式转换

06-06

C3平台使用的RSA密钥格式与C#中的标准格式有些不同。在C3平台上,公钥和私钥都是以字符串的形式存储的,并且使用特定的格式进行编码。如果需要在C#代码中使用C3平台上的RSA密钥,就需要将其进行格式转换。

下面是将C3平台上的RSA密钥转换为C#中的标准格式的步骤:

1. 从C3平台上获取公钥和私钥的字符串表示。在C3平台上,可以通过`RSA.getPublicKey()`和`RSA.getPrivateKey()`方法获取公钥和私钥的字符串表示。

2. 将公钥和私钥的字符串表示转换为字节数组。在C#中,可以使用`Convert.FromBase64String()`方法将Base64编码的字符串转换为字节数组。

3. 将字节数组转换为C#中的RSA密钥对象。在C#中,可以使用`RSACryptoServiceProvider.ImportCspBlob()`方法将字节数组转换为RSA密钥对象。

下面是将C3平台上的RSA密钥转换为C#中的标准格式的示例代码:

```csharp

string publicKeyString = "..."; // C3平台上的公钥字符串

string privateKeyString = "..."; // C3平台上的私钥字符串

byte[] publicKeyBytes = Convert.FromBase64String(publicKeyString);

byte[] privateKeyBytes = Convert.FromBase64String(privateKeyString);

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

rsa.ImportCspBlob(publicKeyBytes); // 导入公钥

rsa.ImportCspBlob(privateKeyBytes); // 导入私钥

```

在上面的代码中,`publicKeyString`和`privateKeyString`是C3平台上的公钥和私钥字符串。通过`Convert.FromBase64String()`方法将这两个字符串转换为字节数组,然后使用`RSACryptoServiceProvider.ImportCspBlob()`方法将字节数组转换为RSA密钥对象。转换后,可以使用`rsa`对象进行加密和解密操作。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

CodeStarr

CSDN认证博客专家

CSDN认证企业博客

码龄6年

暂无认证

249

原创

4万+

周排名

144万+

总排名

35万+

访问

等级

4060

积分

155

粉丝

252

获赞

30

评论

809

收藏

私信

关注

热门文章

概率论 各种分布及其期望、方差、分布函数

78818

复变函数第三章-复变函数的积分

9217

复变函数第五章-留数

8339

复变函数第二章-解析函数

7867

HTTPS双向认证

5750

分类专栏

Cryptography

30篇

密码算法

20篇

密码库

4篇

密码分析

1篇

IOT

14篇

IoT开发

2篇

iot漏洞

1篇

Penetration

1篇

web

27篇

漏洞挖掘

2篇

污点分析

2篇

fuzz

2篇

bin

41篇

re

14篇

pwn

12篇

virus

4篇

Linux

26篇

LinuxProgramming

5篇

windows

26篇

windows Kernel

8篇

Dmp分析

1篇

开发

6篇

C/C++

35篇

汇编

8篇

java

10篇

python

2篇

设计模式

3篇

算法

5篇

CTF

4篇

杂项

21篇

ATT&CK

2篇

最新评论

概率论 各种分布及其期望、方差、分布函数

YXDHJL:

泊松分布的显示,出问题了

QilingLab练习

CodeStarr:

lab网站的提示

LAZY PEOPLE ALERT

QilingLab has been developed with the aim of learning how to use Qiling by showing some use-cases.

That said all the challenges could be easily solved by just overwriting the checker but you know that’s cheating

QilingLab练习

@尘埃落定:

请教一下,lab3不可以直接在对应地址写内容吗

TLSv1.2

CSDN-Ada助手:

恭喜你,获得了 2023 博客之星评选的入围资格,请看这个帖子 (https://bbs.csdn.net/topics/614962259?utmsource=blogger_star_comment)。 请在这里提供反馈: https://blogdev.blog.csdn.net/article/details/129986459?utmsource=blogger_star_comment。

QEMU System环境

annEleven:

上面的mips内核文件和磁盘文件 作者能发个压缩包吗 链接访问404

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

TLSv1.2

祖冲之序列密码

随机数生成器

2023年22篇

2022年71篇

2021年10篇

2020年22篇

2019年108篇

2018年11篇

2017年12篇

目录

目录

分类专栏

Cryptography

30篇

密码算法

20篇

密码库

4篇

密码分析

1篇

IOT

14篇

IoT开发

2篇

iot漏洞

1篇

Penetration

1篇

web

27篇

漏洞挖掘

2篇

污点分析

2篇

fuzz

2篇

bin

41篇

re

14篇

pwn

12篇

virus

4篇

Linux

26篇

LinuxProgramming

5篇

windows

26篇

windows Kernel

8篇

Dmp分析

1篇

开发

6篇

C/C++

35篇

汇编

8篇

java

10篇

python

2篇

设计模式

3篇

算法

5篇

CTF

4篇

杂项

21篇

ATT&CK

2篇

目录

评论

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

SSL中,公钥、私钥、证书的后缀名都是些啥? - 知乎

SSL中,公钥、私钥、证书的后缀名都是些啥? - 知乎首页知乎知学堂发现等你来答​切换模式登录/注册技术SSLSSL 证书NginxApache TomcatSSL中,公钥、私钥、证书的后缀名都是些啥?今天做这么一个事, centos服务器,tomcat8+nginx1.6,现在要在上面运行cas4.0。 所以需要配ssl, 然后找教程,了解到,需要…显示全部 ​关注者361被浏览363,878关注问题​写回答​邀请回答​好问题 7​添加评论​分享​18 个回答默认排序刘长元尊贵的Starbucks会员​ 关注纯粹个人理解,因为SSL本身确实比较复杂,欢迎纠正。我把SSL系统比喻为工商局系统。首先有SSL就有CA,certificate authority。证书局,用于制作、认证证书的第三方机构,我们假设营业执照非常难制作,就像身份证一样,需要有制证公司来提供,并且提供技术帮助工商局验证执照的真伪。然后CA是可以有多个的,也就是可以有多个制证公司,但工商局就只有一个,它来说那个制证公司是可信的,那些是假的,需要打击。在SSL的世界中,微软、Google和Mozilla扮演了一部分这个角色。也就是说,IE、Chrome、Firefox中内置有一些CA,经过这些CA颁发,验证过的证书都是可以信的,否则就会提示你不安全。这也是为什么前几天Chrome决定屏蔽CNNIC的CA时,CNNIC那么遗憾了。也因为内置的CA是相对固定的,所以当你决定要新建网站时,就需要购买这些内置CA颁发的证书来让用户看到你的域名前面是绿色的,而不是红色。而这个最大的卖证书的公司就是VeriSign如果你听说过的话,当然它被卖给了Symantec,这家伙不只出Ghost,还是个卖证书的公司。要开店的老板去申请营业执照的时候是需要交他的身份证的,然后办出来的营业执照上也会有他的照片和名字。身份证相当于私钥,营业执照就是证书,Ceritficate,.cer文件。然后关于私钥和公钥如何解释我没想好,而它们在数据加密层面,数据的流向是这样的。消息-->[公钥]-->加密后的信息-->[私钥]-->消息公钥是可以随便扔给谁的,他把消息加了密传给我。对了,可以这样理解,我有一个箱子,一把锁和一把钥匙,我把箱子和开着的锁给别人,他写了信放箱子里,锁上,然后传递回我手上的途中谁都是打不开箱子的,只有我可以用原来的钥匙打开,这就是SSL,公钥,私钥传递加密消息的方式。这里的密钥就是key文件。于是我们就有了.cer和.key文件。接下来说keystore不同的语言、工具序列SSL相关文件的格式和扩展名是不一样的。其中Java系喜欢用keystore, truststore来干活,你看它的名字,Store,仓库,它里面存放着key和信任的CA,key和CA可以有多个。这里的truststore就像你自己电脑的证书管理器一样,如果你打开Chrome的设置,找到HTTP SSL,就可以看到里面有很多CA,truststore就是干这个活儿的,它也里面也是存一个或多个CA让Tomcat或Java程序来调用。而keystore就是用来存密钥文件的,可以存放多个。然后是PEM,它是由RFC1421至1424定义的一种数据格式。其实前面的.cert和.key文件都是PEM格式的,只不过在有些系统中(比如Windows)会根据扩展名不同而做不同的事。所以当你看到.pem文件时,它里面的内容可能是certificate也可能是key,也可能两个都有,要看具体情况。可以通过openssl查看。RFC1421的第一节是这样说的1. Executive Summary

This document defines message encryption and authentication

procedures, in order to provide privacy-enhanced mail (PEM) services

for electronic mail transfer in the Internet. It is intended to

become one member of a related set of four RFCs. The procedures

defined in the current document are intended to be compatible with a

wide range of key management approaches, including both symmetric

(secret-key) and asymmetric (public-key) approaches for encryption of

data encrypting keys. Use of symmetric cryptography for message text

encryption and/or integrity check computation is anticipated. RFC1422 specifies supporting key management mechanisms based on the use

of public-key certificates. RFC 1423 specifies algorithms, modes,

and associated identifiers relevant to the current RFC and to RFC1422. RFC 1424 provides details of paper and electronic formats and

procedures for the key management infrastructure being established in

support of these services.

本文档定义了Internet中消息加密和身份认证的流程,它用于为电子邮件传输提供增强的私密邮件服务(PEM)。它是4个相关RFC组中的一个,当前文档中定义的流程打算与各种密钥管理方法兼容,包含对称和不对称数据加密协议。使用对称方式来加密文本消息和完整性检查是可以预期的。RFC1422描述了基于公钥证书和密钥管理机制,RFC1423描述了算法,模式和与RFC1421/1422相关的身份认证的内容,RFC1424提供了详尽的纸制/电子格式和流程,来描述如何构建支持这些协议的密钥管理基础设施。

Privacy enhancement services (confidentiality, authentication,

message integrity assurance, and non-repudiation of origin) are

offered through the use of end-to-end cryptography between originator

and recipient processes at or above the User Agent level. No special

processing requirements are imposed on the Message Transfer System at

endpoints or at intermediate relay sites. This approach allows

privacy enhancement facilities to be incorporated selectively on a

site-by-site or user-by-user basis without impact on other Internet

entities. Interoperability among heterogeneous components and mail

transport facilities is supported.

The current specification's scope is confined to PEM processing

procedures for the RFC-822 textual mail environment, and defines the

Content-Domain indicator value "RFC822" to signify this usage.

Follow-on work in integration of PEM capabilities with other

messaging environments (e.g., MIME) is anticipated and will be

addressed in separate and/or successor documents, at which point

additional Content-Domain indicator values will be defined.

至于CAS4.0这个东西,网上一堆的教程,中文的、英文的,先自己做吧,遇到问题时把你的操作过程,在什么步骤遇到什么问题,出现什么错误,你怎么理解都写出来,成长比你成功部署一个CAS要大多了。最后,看到一篇文章写的不错,在这里翻译一部分。What is SSL and what are Certificates?The Secure Socket Layer protocol was created by Netscape to ensure secure transactions between web servers and browsers. The protocol uses a third party, a Certificate Authority (CA), to identify one end or both end of the transactions. This is in short how it works.A browser requests a secure page (usually https://).The web server sends its public key with its certificate.The browser checks that the certificate was issued by a trusted party (usually a trusted root CA), that the certificate is still valid and that the certificate is related to the site contacted.The browser then uses the public key, to encrypt a random symmetric encryption key and sends it to the server with the encrypted URL required as well as other encrypted http data.The web server decrypts the symmetric encryption key using its private key and uses the symmetric key to decrypt the URL and http data.The web server sends back the requested html document and http data encrypted with the symmetric key.The browser decrypts the http data and html document using the symmetric key and displays the information.安全套接层协议是由Netscape创建的,它用来保证在WEB服务器和浏览器间的数据被安全传输。协议使用一个第三方的证书局(CA)来验证传输的一方或双方的身份。下面是简单的描述它如何工作:浏览器请求一个安全的页面(通过以https://开头)WEB服务器返回它的公钥和证书浏览检查证书是由可信的机构颁发的(通过是可信的根CA),证书仍然有效并且证书与被访问的网站相关浏览器使用公钥来加密一个随机的对称密钥,加上加密后的URL和其它加密后的http数据一起发回至服务器。WEB服务器使用私钥解密对称密钥,并用它来解密在浏览器上加密了的URL和http数据WEB服务器使用对称密钥加密请求的HTML文档和http数据并发回至浏览器浏览器使用对称密钥解密HTML文档和http数据并展示给用户编辑于 2015-04-17 14:27​赞同 135​​16 条评论​分享​收藏​喜欢收起​依云生亦非吾愿,死亦非吾愿。​ 关注Linux 下的工具们通常使用 base64 编码的文本格式,相关常用后缀如下:* 证书:.crt, .pem* 私钥:.key* 证书请求:.csr.cer 好像是二进制的证书。当然你也可以把证书和 key 放到同一个文件里边。这时候扩展名通常叫 .pem。Java 的 keystore 什么的都是二进制的,好像是自有格式。其实在类 UNIX 系统上,关注文件名后缀的程序并不多的。而证书、密钥都是有明显的标识的,所以相关软件(如 openssl)可以处理,而不管你用的什么扩展名。当然乱用扩展名自己识别不便,桌面环境也不能将扩展名与默认操作、图标关联起来。如果不知道一个文件是个啥,可以使用 file 命令识别试试。有经验的也可以直接拿文本编辑器打开看看。编辑于 2015-04-16 23:18​赞同 54​​5 条评论​分享​收藏​喜欢

RSA加密算法的公钥和私钥如何存储?-腾讯云开发者社区

密算法的公钥和私钥如何存储?-腾讯云开发者社区腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动技术百科搜索技术百科搜索技术百科搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网技术百科首页 >RSA加密算法 >RSA加密算法的公钥和私钥如何存储?RSA加密算法的公钥和私钥如何存储?修改于 2023-07-26 02:33:55718词条归属:RSA加密算法RSA加密算法的公钥和私钥可以以多种方式进行存储,以下是几种常见的方式: PEM格式PEM格式是一种常见的密钥存储格式,公钥和私钥可以分别存储在两个不同的PEM文件中,也可以将它们存储在同一个PEM文件中,其中,公钥的PEM文件通常以“.pub”为后缀,私钥的PEM文件通常以“.pem”为后缀。 DER格式DER格式是一种二进制格式,公钥和私钥可以分别存储在两个不同的DER文件中,也可以将它们存储在同一个DER文件中。 PKCS#12格式PKCS#12是一种常见的安全存储格式,可以将公钥和私钥存储在同一个文件中,并使用密码进行加密保护。 数据库存储公钥和私钥也可以存储在数据库中,通常会对私钥进行加密保护,以保证安全性。 相关文章RSA的公钥私钥微信数据加密服务非对称加密使用的是RSA算法,所谓的非对称,指的是,加密时使用的秘钥和解密时使用的秘钥是不一样的。也就是说RSA有一对秘钥,其中一个是公钥,另一个是私钥,一个用于加密,一个用于解密。赵哥窟2022-04-022K0RSA登录加密_rsa私钥加密公钥解密javahttps网络安全网站:aHR0cHM6Ly9iZWlqaW5nLnR1aXR1aTk5LmNvbS9kZW5nbHUuaHRtbA==全栈程序员站长2022-10-029.4K0RSA公钥加密私钥解密实例其他 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/79966871 DannyHoo2018-09-133.9K0JAVA 通过RSA获取公钥私钥工具类javapublic class RSAUtil {

//生成秘钥对

public static KeyPair getKeyPair() throws Exception {

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

keyPairGenerator.initialize(1024);

KeyPair keyPair = keyPairGenera一诺千金2020-04-303.1K0如何用私钥公钥加密ssh1、密钥对,在非对称加密技术中,有两种密钥,分为私钥和公钥,私钥是密钥对所有者持有,不可公布,公钥是密钥对持有者公布给他人的。用户84181972021-12-231.9K0点击加载更多词条知识树 8个知识点更多RSA加密算法的原理是什么?RSA加密算法的安全性如何?RSA加密算法的优点是什么?RSA加密算法的缺点是什么?RSA加密算法的公钥和私钥如何存储?RSA加密算法的公钥和私钥如何更新?RSA加密算法的加密强度如何评估?RSA加密算法的应用场景有哪些?社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 |  京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归

RSA密钥格式 | flyingice.github.io

RSA密钥格式 | flyingice.github.io

flyingice.github.io

View the Project on GitHub

View On GitHub

SSH几乎天天都在用,但是我从来没想过密钥到底是如何存储的,刚好这几天倒腾GPG密钥的时候碰到点配置问题,于是把和RSA密钥相关的东西整理了一下。

首先ssh-keygen和openssl都可以用来生成密钥对,ssh-keygen背后也是通过调用OpenSSL库来工作的,所以下面的demo都以openssl CLI为例(环境为MacOS 10.15.5 + LibreSSL 2.8.3)。但是ssh-keygen和openssl生成的公钥格式在默认情况下是不同的,后文具体说明。

如何判断私钥是否被加密

先拿openssl生成一个2048位的未加密私钥,再另外建一个加密过的私钥,对应passphrase是12345 。

> openssl genrsa -out key.clear 2048

Generating RSA private key, 2048 bit long modulus

............+++

.......................................................................................................+++

e is 65537 (0x10001)

> cat key.clear

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

...

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

> openssl genrsa -aes256 -out key.encrypted -passout pass:12345 2048

Generating RSA private key, 2048 bit long modulus

...........+++

....................................................................................+++

e is 65537 (0x10001)

> cat key.encrypted

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

Proc-Type: 4,ENCRYPTED

DEK-Info: AES-256-CBC,7290859FA04F937A74CD4C1540049234

...

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

第二个openssl genrsa命令中的-aes256指定了用于加密私钥的对称加密算法,具体密钥由KDF基于passphrase生成。对比一下输出文件,可以看到经过加密的版本多了两行文件头,其中AES-256-CBC是我们刚才在命令行指定的对称加密算法,之后紧接的是一串hex编码的IV,它在CBC模式下加密第一个数据块时使用。CBC模式保证了在不同位置出现的相同数据能生成不同的密文,从而提高了安全性。

RSA私钥是什么格式

RSA私钥通常用PKCS#1或者PKCS#8格式存储。信息以ASN.1数据结构为载体,DER序列化成二进制后用base64编码。ASN.1有些类似json和protobuf,支持string和integer等数据类型,同时也能多层嵌套形成树形结构。openssl有专门的工具包asn1parse来解析ASN.1数据(如下所示)。

> openssl rsa -in key.encrypted -passin pass:12345 -out key.decrypted

> openssl asn1parse -in key.decrypted

0:d=0 hl=4 l=1188 cons: SEQUENCE

4:d=1 hl=2 l= 1 prim: INTEGER :00

7:d=1 hl=4 l= 257 prim: INTEGER :......

268:d=1 hl=2 l= 3 prim: INTEGER :010001

273:d=1 hl=4 l= 257 prim: INTEGER :......

534:d=1 hl=3 l= 129 prim: INTEGER :......

666:d=1 hl=3 l= 129 prim: INTEGER :......

798:d=1 hl=3 l= 129 prim: INTEGER :......

930:d=1 hl=3 l= 128 prim: INTEGER :......

1061:d=1 hl=3 l= 128 prim: INTEGER :......

以上结果略去了大部分integer值。前四个整数依次是版本号,e(public exponent),模数n以及d(private exponent)。这里顺便回顾一下生成RSA密钥的原理:

1)任意取两个超大质数p和q,求得n=p * q,z=(p-1) * (q-1)。

2)取一个小于n且与z互质的数,记作e。这里的e就是public exponent,数学上要求和z互质就行,实际使用的RSA算法里面e默认取的定值65537,换算成hex就是上面看到的010001。我们甚至可以在用openssl genrsa生成私钥的时候用开启-3这个选项来指定e值为3 。

3)找一个自然数d,使得(e * d) mod n = 1 ,这个符合条件的d就是private exponent。

于是计算所得的(n, e)就是公钥,对应的(n, d)就是私钥。所以无论是私钥还是公钥,它其实并不是一个数,而是一对数。假设明文为x,那么加密就是计算x的e次幂对n取模;记得到的密文为y,解密就是计算y的d次幂对n取模。

能否由RSA私钥导出对应公钥

从上面asn1parse解析私钥的结果可以看出,私钥文件是包含对应的公钥信息的,n、e和d这三个重要整数都直接被记录,所以openssl工具可以直接由私钥导出公钥:

> openssl rsa -in key.encrypted -out pubkey -passin pass:12345 -pubout

> cat pubkey

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

...

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

私钥能用其它格式存储吗

上面例子中的RSA私钥是用PKCS#1格式保存的,除此之外的常用格式还有PKCS#8,它可以简单理解成PKCS#1的升级版。PKCS#1只能用来保存RSA算法生成的密钥,而PKCS#8规范可以支持其它算法所生成的密钥。openssl pkcs8工具可以完成两种格式的转换。

> openssl pkcs8 -in key.encrypted -out key.encrypted.pkcs8 -passin pass:12345 -passout pass:12345 -topk8

> cat key.encrypted.pkcs8

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

...

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

可以看到,PKCS#8格式的私钥即使被加密过,文件中也没有出现PKCS#1中Proc-Type和DEK-Info这两行header,只是文件头尾多了ENCRYPTED字样。

再拿asn1parse解析一下内容:

> openssl asn1parse -in key.encrypted.pkcs8

0:d=0 hl=4 l=1257 cons: SEQUENCE

4:d=1 hl=2 l= 27 cons: SEQUENCE

6:d=2 hl=2 l= 9 prim: OBJECT :pbeWithMD5AndDES-CBC

17:d=2 hl=2 l= 14 cons: SEQUENCE

19:d=3 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:4E1AF1084A2B8985

29:d=3 hl=2 l= 2 prim: INTEGER :0800

33:d=1 hl=4 l=1224 prim: OCTET STRING [HEX DUMP]:...

PKCS#8中是直接将算法ID存在ASN.1中的,而PKCS#1是通过—–BEGIN RSA PRIVATE KEY—–来说明该文件是一个RSA密钥的。于是在用私钥去解密数据的时候,需要先解析PKCS#8文件获得对应的加密算法。可以想象,如果将来需要为新加密算法提供支持,为它分配一个新ID即可,私钥文件格式本身保持不变,所以PKCS#8比PKCS#1格式更加灵活。

ssh-keygen生成的公钥格式为什么和OpenSSL生成的不大一样

ssh-keygen生成的公钥是默认的OpenSSH格式,这是一个私有格式。

> cat id_rsa.pub

ssh-rsa [...] user@MacBookPro

内容被空格分成三段,从左到右依次是算法名称,公钥以及备注。公钥本身是按照长度加数据的方式编码的,长度用一个32位定长的整型表示,数据是变长。长度和数据都是以对应的hex string来保存的,最后整体用base64编码。

> cat id_rsa.pub | cut -d ' ' -f2 | base64 -d | hexdump

0000000 00 00 00 07 73 73 68 2d 72 73 61 00 00 00 03 01

0000010 00 01 00 00 02 01 00 c8 70 7e b9 40 62 3c df c2

0000020 4e f9 02 e1 53 9f f3 aa 7d 6f fb 62 ec 35 dc 4f

...

00 00 00 07是后面紧接的字符串“ssh-rsa”长度,73 73 68 2d 72 73 61是“ssh-rsa”的ASCII值,没错,“ssh-rsa”又被重复编码了一次;00 00 00 03是下一段整数的长度,01 00 01是不是很熟悉?对,它就是e值65537的hex编码,其余部分就是模数n的长度和值了。上面的结果用肉眼大致能看,这里我用python写了一个简单的解析器可以更直观地呈现结果:

> python openssh_pubkey_parser.py -i id_rsa.pub

Algorithm: ssh-rsa

Exponent: 65537

Modulus: length=513 bytes

00 c8 70 7e b9 40 62 3c df c2 4e f9 02 e1 53 9f

f3 aa 7d 6f fb 62 ec 35 dc 4f 8e fd 62 3b aa b9

...

这本应该是一个4096位的公钥,也就是512个字节,但是结果显示模数n的长度是513个字节。原因是最前面用00填充了一个字节,目的是为了避免n被解析成一个负整数。

如何将OpenSSH格式的公钥转换为PKCS格式

ssh-keygen直接支持这种转换,运行命令:

ssh-keygen -e -f id_rsa.pub -m pem > newkey.pub

Hosted on GitHub Pages — Theme by orderedlist

版权声明:本文由比特派app钱包下载地址发布,如需转载请注明出处。

本文链接:https://www.siyuewuyu.com/article/363.html