RSA 私钥的 PKCS#1 和 PKCS#8 格式 [关闭]
Posted
技术标签:
【中文标题】RSA 私钥的 PKCS#1 和 PKCS#8 格式 [关闭]【英文标题】:PKCS#1 and PKCS#8 format for RSA private key [closed] 【发布时间】:2018-08-04 03:02:38 【问题描述】:有人可以帮助我了解 RSA 密钥是如何以这些格式存储的吗?我想知道 PKCS 格式与编码(DER,PEM)之间的区别。据我了解,PEM 更具人类可读性。密钥/证书的 PEM/DER 是否类似于字符的 UTF-8/16? DER/PEM 的意义是什么?抱歉问题太多,但受够了谷歌搜索和模糊的答案。谢谢。
【问题讨论】:
查看my older answer to similar question 以获得直观的解释。 【参考方案1】:(扩展超出我认为适合编辑的范围。)
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 的 AlgorithmIdentifier 标识,这意味着 rsaEncryption,OCTET STRING 包含 PKCS1 私钥编码。
PKCS8 还允许添加任意“属性”,但这很少使用。
(例如Unable to convert .jks to .pkcs12: excess private key)
PKCS8 还提供了一个选项来加密私钥,使用基于密码的加密(实际上虽然没有明确要求)。这很常见,尤其是当 PKCS8 用作 PKCS12/PFX 的私钥部分时,尽管不是通用的。
由于当今大多数系统需要支持多种算法,并且希望能够适应新算法的开发,因此首选 PKCS8 用于私钥,而 X.509 定义的类似任意算法方案用于公钥。虽然 PKCS12/PFX 通常比两者都更受欢迎。
这些都与证书或其他 PKI 对象(如 CSR、CRL、OCSP、SCT 等)没有任何关系。这些是由其他标准定义的,包括 PKCS 系列的其他一些成员——尽管它们可能使用 keys 由这些标准定义。
PEM 格式 正如 Luke 所说,它是以更方便的方式格式化或(超级)编码(几乎所有)二进制/DER 数据的一种方式。它源于 1990 年代对名为 Privacy-Enhanced Mail 的安全电子邮件的尝试,因此是 PEM。在那些日子里,电子邮件系统通常只能传输或至少可靠地传输具有有限字符集的可打印文本,并且通常只有有限的行长,因此 PEM 将二进制数据编码为 base64,行长为 64。PEM 方案本身并不是很好成功并已被 PGP 和 S/MIME 等其他格式取代,但仍使用其定义的格式。如今的电子邮件系统通常可以传输二进制数据,但正如 Luke 所说,复制粘贴通常只能处理显示的字符,因此 PEM 仍然有用,而且更易于人类识别。
更准确地说,PEM 对一些数据进行编码,例如但不限于 PKCS1 或 PKCS8 密钥或证书、CSR 等,如:
一行由 5 个连字符、单词 BEGIN、一个或几个(空格分隔)定义数据类型的单词和 5 个连字符组成
一个可选的(和罕见的)rfc822 样式的标题,以空行结束
base64 的数据,分成 64 个字符的行(最后一个除外);一些程序改为使用 76 个字符的(稍新的)MIME 限制
类似于 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-----
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 行中识别出来。没有工具,数据中的实际密钥值不容易读取,尽管只有第三个实际需要秘密信息(用于加密的密码)。
【讨论】:
在 PKCS8 加密私钥中,我读到它通常是 AES-256-CBC 加密的。 IV在哪里?我问,因为我有一个加密密钥,我需要以编程方式解密。 @DevilCode:PKCS8 的(外部)结构在我链接的 RFC 中定义,加密形式通常使用 rfc2898 中定义的 PKCS5,参数语法在附录 A 中。对于 PBES1 方案,IV 是派生的连同 PBKDF1 的密钥;一些 PBES2 方案在附录 B.2 中,您使用的方案 (aes-256-cbc) 是其明显的扩展。但是您实际上并不需要 IV,因为正如我在您之前的 Q ***.com/questions/66286457 中解释的那样,JDK 或 Bouncy 会为您处理它【参考方案2】:PKCS#1 和 PKCS#8(公钥加密标准)是管理特定加密原语、填充等使用的标准。两者都定义了用于存储密钥、证书和其他相关信息的文件格式。
PEM (Privacy-Enhanced Mail) 和 DER (Distinguished Encoding Rules) 更有趣一些。 DER 是密钥和证书等的 ASN.1 编码,您可以在 Google 上搜索到很多信息。私钥和证书使用 DER 编码,可以像这样直接保存。但是,这些文件是二进制文件,无法轻松复制和粘贴,因此许多(如果不是大多数?)实现也接受 PEM 编码文件。 PEM 基本上是 base64 编码的 DER:我们添加一个标头、可选的元数据和 base64 编码的 DER 数据,我们就有了一个 PEM 文件。
【讨论】:
“你可以在 Google 上搜索到很多”是我最喜欢的短语,可以在 *** 问题的已接受答案中找到,该问题现在已成为 Google 的热门搜索结果以上是关于RSA 私钥的 PKCS#1 和 PKCS#8 格式 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章