RSA私钥的PKCS#1和PKCS#8格式

use*_*ful 11 cryptography rsa pki pkcs#8 pkcs#1

有人可以帮助我理解RSA密钥是如何以这些格式存储的吗?我想知道PKCS格式与编码(DER,PEM)之间的区别.根据我的理解,PEM更具人性化.密钥/证书的PEM/DER类似于字符的UTF-8/16吗?DER/PEM有什么意义?对不起有太多问题,但厌倦了谷歌搜索和得到模糊的答案.谢谢.

dav*_*085 35

(扩展超出我认为适合编辑.)

PKCS1有几个版本,如rfcs 2313 2437 3447和8017,主要是关于使用RSA算法进行加密,包括加密解密签名和验证.但由于加密通常用于系统或至少程序之间,因此为密钥提供定义的,可互操作的格式很方便,而PKCS1在附录A.1中为RSA公钥和私钥定义了相当小的格式.正如Luke暗示的那样,它使用常规编码为DER的ASN.1,这是一种可互操作地编码几乎任何类型数据的标准.

另一方面,作为rfc5208提供的PKCS8是用于处理所有算法的私钥的标准,而不仅仅是RSA.它还使用ASN.1 DER,并简单地组合一个AlgorithmIdentifier由X.509定义的ASN.1结构(第一个),这个结构并不奇怪地识别算法,OCTET STRING其中包含一个以某种方式表示的密钥.算法.对于算法RSA,由包含OID(表示rsaEncryption)的AlgorithmIdentifier标识,OCTET STRING包含PKCS1私钥编码.PKCS8还允许添加任意"属性",但很少使用.(例如,无法将.jks转换为.pkcs12:多余的私钥)

PKCS8还提供了使用基于密码的加密来加密私钥的选项(实际上虽然没有明确要求).这很常见,特别是当PKCS8用作PKCS12/PFX的私钥部分时,尽管不是通用的.

由于当今大多数系统需要支持多种算法,并且希望能够在开发时适应新算法,因此PKCS8是私有密钥的首选,而X.509为公共密钥定义的类似的任何算法方案.虽然PKCS12/PFX通常优于两者.

这些都与证书或其他PKI对象(如CSR,CRL,OCSP,SCT等)无关.这些对象由其他标准定义,包括PKCS系列的其他一些成员 - 尽管它们可能使用这些标识所定义的密钥.标准.

像Luke所说的PEM格式是一种格式化或(超级)编码,(几乎任何)二进制/ DER数据的方式,更方便.它起源于20世纪90年代的安全电子邮件尝试,名为Privacy-Enhanced Mail,因此是PEM.在那些日子里,电子邮件系统通常只能传输或至少可靠地传输具有有限字符集的可打印文本,并且通常只有有限的行长度,因此PEM将二进制数据编码为base64,行长度为64. PEM方案本身不是很成功并已被PGP和S/MIME等其他人取代,但仍然使用它定义的格式.如今,电子邮件系统通常可以传输二进制数据,但正如Luke所说,复制粘贴通常只能处理显示的字符,因此PEM仍然有用,而且人类更容易识别.

更确切地说,PEM编码一些数据,例如但不限于PKCS1或PKCS8密钥证书,CSR等,如下所示:

  • 一行由5个连字符组成,单词BEGIN,一个或几个(以空格分隔的)单词定义数据类型,以及5个连字符

  • 一个可选的(和罕见的)rfc822样式的标题,以空行终止

  • base64的数据,分成64个字符的行(除了最后一个); 一些程序使用(稍微更新)的MIME限制为76个字符

  • 像BEGIN行一样但是用END代替

有些读者检查/强制行长度和END行,有些则没有,所以如果你弄错了,你可能会创建有时工作但有时不工作的文件,这对调试来说很烦人.

因此,例如PEM中的PKCS1私钥(未加密)看起来像:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCjcGqTkOq0CR3rTx0ZSQSIdTrDrFAYl29611xN8aVgMQIWtDB/
lD0W5TpKPuU9iaiG/sSn/VYt6EzN7Sr332jj7cyl2WrrHI6ujRswNy4HojMuqtfa
b5FFDpRmCuvl35fge18OvoQTJELhhJ1EvJ5KUeZiuJ3u3YyMnxxXzLuKbQIDAQAB
AoGAPrNDz7TKtaLBvaIuMaMXgBopHyQd3jFKbT/tg2Fu5kYm3PrnmCoQfZYXFKCo
ZUFIS/G1FBVWWGpD/MQ9tbYZkKpwuH+t2rGndMnLXiTC296/s9uix7gsjnT4Naci
5N6EN9pVUBwQmGrYUTHFc58ThtelSiPARX7LSU2ibtJSv8ECQQDWBRrrAYmbCUN7
ra0DFT6SppaDtvvuKtb+mUeKbg0B8U4y4wCIK5GH8EyQSwUWcXnNBO05rlUPbifs
DLv/u82lAkEAw39sTJ0KmJJyaChqvqAJ8guulKlgucQJ0Et9ppZyet9iVwNKX/aW
9UlwGBMQdafQ36nd1QMEA8AbAw4D+hw/KQJBANJbHDUGQtk2hrSmZNoV5HXB9Uiq
7v4N71k5ER8XwgM5yVGs2tX8dMM3RhnBEtQXXs9LW1uJZSOQcv7JGXNnhN0CQBZe
nzrJAWxh3XtznHtBfsHWelyCYRIAj4rpCHCmaGUM6IjCVKFUawOYKp5mmAyObkUZ
f8ue87emJLEdynC1CLkCQHduNjP1hemAGWrd6v8BHhE3kKtcK6KHsPvJR5dOfzbd
HAqVePERhISfN6cwZt5p8B3/JUwSR8el66DF7Jm57BM=
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

PKCS8中的相同密钥未加密:

-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKNwapOQ6rQJHetP
HRlJBIh1OsOsUBiXb3rXXE3xpWAxAha0MH+UPRblOko+5T2JqIb+xKf9Vi3oTM3t
KvffaOPtzKXZauscjq6NGzA3LgeiMy6q19pvkUUOlGYK6+Xfl+B7Xw6+hBMkQuGE
nUS8nkpR5mK4ne7djIyfHFfMu4ptAgMBAAECgYA+s0PPtMq1osG9oi4xoxeAGikf
JB3eMUptP+2DYW7mRibc+ueYKhB9lhcUoKhlQUhL8bUUFVZYakP8xD21thmQqnC4
f63asad0ycteJMLb3r+z26LHuCyOdPg1pyLk3oQ32lVQHBCYathRMcVznxOG16VK
I8BFfstJTaJu0lK/wQJBANYFGusBiZsJQ3utrQMVPpKmloO2++4q1v6ZR4puDQHx
TjLjAIgrkYfwTJBLBRZxec0E7TmuVQ9uJ+wMu/+7zaUCQQDDf2xMnQqYknJoKGq+
oAnyC66UqWC5xAnQS32mlnJ632JXA0pf9pb1SXAYExB1p9Dfqd3VAwQDwBsDDgP6
HD8pAkEA0lscNQZC2TaGtKZk2hXkdcH1SKru/g3vWTkRHxfCAznJUaza1fx0wzdG
GcES1Bdez0tbW4llI5By/skZc2eE3QJAFl6fOskBbGHde3Oce0F+wdZ6XIJhEgCP
iukIcKZoZQzoiMJUoVRrA5gqnmaYDI5uRRl/y57zt6YksR3KcLUIuQJAd242M/WF
6YAZat3q/wEeETeQq1wrooew+8lHl05/Nt0cCpV48RGEhJ83pzBm3mnwHf8lTBJH
x6XroMXsmbnsEw==
-----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

和PKCS8加密:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIC3TBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIkErtXjGCalMCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBApOUG3MKrBC/5bDBH/s5VfBIIC
gN5o1aJxvJYbp2oA/quz+BnCFn8ts3wPPOcqarHddy0L/VH3BdqFNbnPZEaDnvDl
kqChRsti4AAeX18ItMeAyNLNFv0J4mfI8Q5E7iEnPp+dTsZqNfVIJe2NGxOS7zp2
oQQIZVgjW0akDehv6ZDN796qDBlMY2g80wbBrzVgMJu/byG9IQQjngUE9QNGwrsj
7lYSprxjfTZOk1aGBD0d/HsmetIJvCeJ2i/5xAiGgZRrSWMC6aN7Zlra3eIvHQTB
aKZ8/0IT3iKSr6FpkEopOQae8biiTEVGw9D339P3qOSs2ChWWF+OV2sEA67w6q5j
pz6Poc5jgq4FOcf06GdcVa4tst2uykNJCW0wHpcUR1Tr9ILLhrZPYBYVQWW53Eee
o4+mqW2YORdG3a/jLHpEjL0Vdg95QNpdZoMv8plotN1MUBLebd05aCe5hJUb/x74
3GTwmRGmKoHOhOO3hhUaMCmZIg1xPlNT3jqxrZDoATBeONbaFP8OOkeucVYHbdUO
Ad7z6J8XuZDoxM0BVrGykEiQL2nAOccdsGoC33C9hjkqgU8G9jWElbynJlVqv+1a
lFHWjX5lB6ueiY/rClpVlLmXGB83OVPlo70FV0B9rhRChyB1IJJRYPFDJHSHJNu+
Pqay8zw82Gh/G+TWH/JCLm5YjX55ZSFMUmvwOLaxyQpmAGNH6dIBTAaSctVA7UrV
jm7m+5T7seiNYNEi19vDJipgr0GbX8+np47VrsJDxsS20wTeA/9ltD0xXwNrEKHd
2Nv/1OaCgnBQHIGULgEn9pT3/vU87bBHYjVdrWoUmqd9zFYtdImQE9u8IKTxTe4R
UPRGHqltz4uOjbD1epkSGe0=
-----END ENCRYPTED PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

可以从BEGIN/END行轻松识别每个文件(或其他数据单元)中的数据类型.没有工具就不容易读取数据中的实际键值,尽管只有第三个实际需要秘密信息(用于加密的密码).


Luk*_*ark 7

PKCS#1和PKCS#8(公共密钥密码学标准)是管理特定密码原语,填充等用途的标准。二者均定义用于存储密钥,证书和其他相关信息的文件格式。

PEM和DER更有趣。DER是密钥,证书等的ASN.1编码,您可以在Google上找到很多有关它的信息。私钥和证书使用DER编码,可以像这样直接保存。但是,这些文件是二进制文件,无法轻松复制和粘贴,因此许多(如果不是大多数?)实现也接受PEM编码文件。PEM基本上是base64编码的DER:我们添加标头,可选的元数据和base64编码的DER数据,然后有一个PEM文件。

  • “你可以在 Google 上搜索很多相关内容”是我最喜欢在 StackOverflow 问题的已接受答案中找到的短语,该问题现在已成为 Google 的热门搜索结果 (4认同)