RSA密钥格式详解与模数指数解析
在加密的世界里,密钥的生成与格式是至关重要的。要创建一个RSA私钥,你可以使用以下命令:
openssl genrsa -out private.pem 2048
这条命令会生成一个2048位的RSA私钥,默认格式为PKCS#8。你可以通过查看文件内容来验证:
cat private.pem
你会看到:
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqh...
...
-----END PRIVATE KEY-----
如果是PKCS#1格式,头部则会是:
-----BEGIN RSA PRIVATE KEY-----
MIIBIjANBgkqhkiG9w0...
...
-----END RSA PRIVATE KEY-----
格式转换的微妙之处
密钥格式可以在PKCS#1和PKCS#8之间进行转换。PKCS#1格式专用于RSA密钥,而PKCS#8是一个通用的私钥格式,能够包含任何类型的私钥。转换命令如下:
openssl pkcs8 -topk8 -inform PEM -in private_pkcs1.pem -outform PEM -nocrypt -out private_pkcs8.pem
OpenSSL版本的影响
不同版本的OpenSSL在从PKCS#1转换到PKCS#8时,结果可能会有所不同。例如:
-
OpenSSL 1.1.1a 20 Nov 2018
-----BEGIN RSA PRIVATE KEY----- pkcs1私钥内容 -----END RSA PRIVATE KEY-----
在这个版本中,转换前后的PKCS#1私钥与其来源的PKCS#8私钥在格式和内容上都有所不同。
-
OpenSSL 3.0.14 4 Jun 2024
-----BEGIN PRIVATE KEY----- pkcs1私钥内容(和pkcs8私钥内容一模一样) -----END PRIVATE KEY-----
在这个版本中,转换后的PKCS#1私钥与其来源的PKCS#8私钥在格式和内容上完全一致。这表明该版本的OpenSSL生成的私钥遵循PKCS#8格式标准。
-
影响只针对私钥,公钥的转换结果具有明显差异的
PKCS#1公钥
openssl rsa -in private.pem -RSAPublicKey_out -out pkcs1_public.pem
-----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEAjYX5jxB80S... ... -----END RSA PUBLIC KEY-----
PKCS#8公钥
openssl rsa -in private.pem -pubout -out pkcs8_public.pem
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEF... ... -----END PUBLIC KEY-----
ASN.1详解
ASN.1(Abstract Syntax Notation One)是一种用于描述数据结构的标准语言,广泛应用于加密领域。它不仅仅是描述,还包括编码规则和传输语法。
RSA密钥使用的ASN.1结构
基本类型的多样性
-
简单类型
- INTEGER: 整数
- BOOLEAN: 布尔值
- OCTET STRING: 字节串
- PrintableString: 可打印字符串
- UTCTime: UTC时间
-
结构类型
- SEQUENCE: 有序集合
- SET: 无序集合
- CHOICE: 选择
-
标签类型
- [0] IMPLICIT: 隐式标签
- [1] EXPLICIT: 显式标签
编码规则的复杂性
ASN.1有多种编码规则:
-
BER (Basic Encoding Rules)
- 最基本的编码规则,结果不唯一。
-
DER (Distinguished Encoding Rules)
- BER的子集,结果唯一,常用于密码学。
-
PER (Packed Encoding Rules)
- 更紧凑的编码,用于通信协议。
TLV结构的精妙
TLV(Tag, Length, Value)结构是ASN.1编码的核心。
DER编码采用TLV(Type-Length-Value)结构:
- Type(标签): 表示数据类型
- Length(长度): 表示数据长度
- Value(值): 表示数据内容
实际应用的多样性
-
密钥转换
PKCS#1公钥转换为DER编码
openssl rsa -pubin -in public_pkcs1.pem -outform DER -out public_pkcs1.der
使用DER编码的PKCS#1公钥解析
openssl rsa -pubin -in public_pkcs1.der -inform DER -text -noout
-
RSA公钥结构
RSA 公钥使用 ASN.1 类型 RSAPublicKey 表示:
RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER -- e }
-
RSA公钥的DER编码:
30 82 01 22 # SEQUENCE, 长度 290 字节 30 0D # SEQUENCE, 长度 13 字节 (算法标识) 06 09 # OBJECT IDENTIFIER, 长度 9 字节 2A 86 48 86 F7 0D 01 01 01 # rsaEncryption (1.2.840.113549.1.1.1) 05 00 # NULL 03 82 01 0F # BIT STRING, 长度 271 字节 00 # 填充位数 (0) 30 82 01 0A # SEQUENCE, 长度 266 字节 (RSAPublicKey) 02 82 01 01 # INTEGER, 长度 257 字节 00 8F 45 C7 83 D6 9C 18... # 模数 (n) 02 03 # INTEGER, 长度 3 字节 01 00 01 # 公钥指数 (e) = 65537
-
公钥解析
openssl rsa -pubin -in public_pkcs1.der -inform DER -text -noout
Public-Key: (2048 bit) Modulus: 00:8f:45:c7:83:d6:9c:18:84:19:b7:ec:f4:fb:87: 7e:be:af:94:fb:f1:be:94:60:2c:13:e5:f7:09:d7: 6e:1c:81:ce:38:15:16:f3:01:e9:32:db:d0:c1:ef: 70:24:eb:4c:43:28:93:1e:79:9a:a2:f5:18:d6:ea: 3a:18:00:d2:7d:ed:bd:c8:5f:da:fe:1d:53:67:5a: 42:71:95:65:2b:bb:d7:04:4d:2a:54:71:63:ec:c9: f5:01:f4:f0:9a:74:89:66:e9:0b:21:b5:13:f6:38: 5c:ad:fd:60:ff:ee:fe:68:62:55:dc:94:59:54:05: ab:f1:91:2c:32:5f:76:1c:06:93:c3:48:0e:a2:88: e8:61:24:ed:7d:64:7a:f2:39:36:ac:9c:3f:82:3e: 5e:65:d0:50:3f:76:00:19:dd:d2:30:31:fc:dd:8a: 50:67:e4:75:27:1c:e2:91:30:f9:9f:d8:e9:4d:f7: cd:37:e2:c5:b5:5d:ae:65:47:b4:25:13:f9:8d:d5: 02:60:0d:47:b0:e0:9b:37:6a:b5:55:4b:a1:52:24: 77:c9:45:54:23:51:c3:f7:1c:b9:a6:83:d4:e2:44: 70:04:87:19:dc:32:25:44:fe:5a:3c:7d:44:70:68: 08:59:a9:85:f1:1f:73:36:4f:1d:de:5b:f5:bb:70: 64:c1 Exponent: 65537 (0x10001)
-
-
PKCS#1 RSA私钥结构
RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q exponent1 INTEGER, -- d mod (p-1) exponent2 INTEGER, -- d mod (q-1) coefficient INTEGER -- (inverse of q) mod p }
-
密钥转换
openssl rsa -in private.pem -outform DER -out private_pkcs1.der
-
RSA私钥的DER编码
30 82 04 BD # SEQUENCE, 长度 1213 字节 02 01 # INTEGER, 长度 1 字节 00 # 版本号 = 0 30 0D # SEQUENCE, 长度 13 字节 06 09 # OBJECT IDENTIFIER, 长度 9 字节 2A 86 48 86 F7 0D 01 01 01 # RSA算法标识符 (1.2.840.113549.1.1.1) 05 00 # NULL 04 82 04 A7 # OCTET STRING, 长度 1191 字节 30 82 04 A3 # SEQUENCE, 长度 1187 字节 (RSAPrivateKey) 02 01 # INTEGER, 长度 1 字节 00 # 版本号 = 0 02 82 01 01 # INTEGER, 长度 257 字节 00 8F 45...# 模数 (n) 02 03 # INTEGER, 长度 3 字节 01 00 01 # 公钥指数 (e) = 65537 02 82 01 00 # INTEGER, 长度 256 字节 42 9D... # 私钥指数 (d) 02 81 81 # INTEGER, 长度 129 字节 00 C1 71...# 第一个质数 (p) 02 81 81 # INTEGER, 长度 129 字节 00 BD B2...# 第二个质数 (q) 02 81 80 # INTEGER, 长度 128 字节 53 A7... # 第一个CRT指数 (d mod (p-1)) 02 81 80 # INTEGER, 长度 128 字节 92 00... # 第二个CRT指数 (d mod (q-1)) 02 81 81 # INTEGER, 长度 129 字节 00 AD 88...# CRT系数 (q^-1 mod p)
-
密钥解析
openssl rsa -in private_pkcs1.der -inform DER -text -noout
Private-Key: (2048 bit, 2 primes) modulus: 00:8f:45:c7:83:d6:9c:18:84:19:b7:ec:f4:fb:87: 7e:be:af:94:fb:f1:be:94:60:2c:13:e5:f7:09:d7: 6e:1c:81:ce:38:15:16:f3:01:e9:32:db:d0:c1:ef: 70:24:eb:4c:43:28:93:1e:79:9a:a2:f5:18:d6:ea: 3a:18:00:d2:7d:ed:bd:c8:5f:da:fe:1d:53:67:5a: 42:71:95:65:2b:bb:d7:04:4d:2a:54:71:63:ec:c9: f5:01:f4:f0:9a:74:89:66:e9:0b:21:b5:13:f6:38: 5c:ad:fd:60:ff:ee:fe:68:62:55:dc:94:59:54:05: ab:f1:91:2c:32:5f:76:1c:06:93:c3:48:0e:a2:88: e8:61:24:ed:7d:64:7a:f2:39:36:ac:9c:3f:82:3e: 5e:65:d0:50:3f:76:00:19:dd:d2:30:31:fc:dd:8a: 50:67:e4:75:27:1c:e2:91:30:f9:9f:d8:e9:4d:f7: cd:37:e2:c5:b5:5d:ae:65:47:b4:25:13:f9:8d:d5: 02:60:0d:47:b0:e0:9b:37:6a:b5:55:4b:a1:52:24: 77:c9:45:54:23:51:c3:f7:1c:b9:a6:83:d4:e2:44: 70:04:87:19:dc:32:25:44:fe:5a:3c:7d:44:70:68: 08:59:a9:85:f1:1f:73:36:4f:1d:de:5b:f5:bb:70: 64:c1 publicExponent: 65537 (0x10001) privateExponent: 15:9d:42:57:3a:66:3c:30:99:ac:ac:bb:dc:c2:79: 35:8d:49:9d:a4:bf:ca:a4:a3:a1:b0:dc:cf:08:48: 1d:56:db:e4:8c:11:f5:41:41:8c:21:ab:61:c6:9c: 95:85:45:f1:0f:ca:fa:1b:00:60:3b:37:af:1c:90: fd:14:0a:ad:62:d3:71:ca:3c:40:7f:ee:18:36:7e: b5:a2:03:2c:50:df:44:4f:db:e5:f7:61:4a:d4:c0: f8:b5:9a:22:c3:18:03:85:7e:df:6b:f1:02:01:48: c2:1a:ea:aa:51:c4:e1:bc:8c:15:85:ef:e0:04:27: 07:7f:8e:3a:5f:3a:73:49:b4:f1:7e:af:f1:90:a7: 4d:f3:cf:48:e5:f5:be:6b:7c:47:46:88:59:28:8d: 99:25:0b:69:65:aa:44:21:90:49:d6:b1:5d:15:1e: 17:af:cb:ec:54:85:88:be:c2:cc:b8:08:f7:d0:38: b4:3d:06:f3:f8:00:e8:79:32:9e:9d:45:c6:2e:08: 8c:76:64:60:c2:59:76:fd:5e:4c:aa:b6:77:2f:58: 87:76:72:83:c3:25:36:2a:02:d0:8e:98:50:c8:33: 25:8e:65:be:9c:da:5d:93:eb:e7:43:66:89:e8:85: 77:03:6d:be:0f:05:45:c4:92:41:62:b4:65:27
-