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

时间:2018-02-24 01:03:47

标签: cryptography rsa pki pkcs#1 pkcs#8

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

1 个答案:

答案 0 :(得分:23)

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

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

另一方面,

PKCS8 可用作rfc5208是处理所有算法私钥的标准,而不仅仅是RSA。它还使用ASN.1 DER,首先简单地组合一个AlgorithmIdentifier,一个由X.509定义的ASN.1结构(第一个),这个结构并不奇怪地识别一个算法,其中包含OCTET STRING根据算法以一种方式表示密钥。对于算法RSA,由包含OID(表示rsaEncryption)的AlgorithmIdentifier标识,OCTET STRING包含PKCS1私钥编码。 PKCS8还允许任意的属性'要添加,但这很少使用。 (例如Unable to convert .jks to .pkcs12: excess private key

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

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

这些都与证书或其他PKI对象(如CSR,CRL,OCSP,SCT等)无关。这些是由其他标准定义的,包括PKCS系列的其他一些成员 - 尽管他们可能会使用<这些标准定义了em> keys 。

PEM格式正如Luke所说,这是一种格式化或(超级)编码,(几乎任何)二进制/ 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行,有些读者不会这样做,所以如果你弄错了,你可能会创建有时有效的文件,有时候也不会,这对于调试来说很烦人。< / p>

因此,例如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-----

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-----

和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-----

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