怎么做网站可以注册的,沈阳网络优化培训,wordpress空间服务商,桐庐县建设局网站1.概述
RFC5958主要定义非对称密钥的封装语法#xff0c;RFC5958用于替代RFC5208。非对称算法会涉及到1对公私钥#xff0c;例如按照RSA算法#xff0c;公钥是n和e#xff0c;私钥是d和n。当需要将公私钥保存到文件时#xff0c;需按照一定的格式保存。本文主要定义公私钥…1.概述
RFC5958主要定义非对称密钥的封装语法RFC5958用于替代RFC5208。非对称算法会涉及到1对公私钥例如按照RSA算法公钥是n和e私钥是d和n。当需要将公私钥保存到文件时需按照一定的格式保存。本文主要定义公私钥保存到文件的语法。目前私钥封装到文件的规范有PKCS#1和PKCS#8其中主流为PKCS#8。公钥封装通常兼容X.509规范。本文基于RSA算法进行简单说明。
2.PKCS#8私钥
2.1私钥格式
在RFC5958中私钥的ASN.1语法如下ASN.1语法可参考之前的文章
OneAsymmetricKey :: SEQUENCE {version Version,privateKeyAlgorithm PrivateAlgorithmIdentifier,privateKey PrivateKeyattributes [0] Attributes OPTIONAL,...,[[2:publickey [1] PublicKey OPTIONAL]],...
}PrivateKeyInfo :: OneAsymmetricKey2.2 参数说明
Version :: INTEGER { v1(0),v2(1)}。Version值为0或者1当值为0时私钥格式遵循RFC5208。RFC5208中对私钥的定义如下
PrivateKeyInfo :: SEQUENCE {version Version,privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,privateKey PrivateKeyattributes [0] IMPLICIT Attributes OPTIONAL
}Version :: INTEGER PrivateKeyAlgorithmIdentifier :: AlgorithmIdentifier PrivateKey :: OCTET STRING Attributes :: SET OF Attributes
在非对称算法为RSA非加密模式时PrivateKeyAlgorithmIdentifier定义在RFC5280定义如下
AlgorithmIdentifier :: SEQUENCE {algorithm OBJECT IDENTIFIER,parameters ANY DEFINED BY algoarithm OPTIONAL
}algorithm的定义在RFC8017 A.1值为pkcs-1 1,parameters的类型为NULL。pkcs-1 1的值在RFC8017 Appendix C
PrivateKey定义在PKCS#1RFC8017 A.1.2 RSA Private Key Syntax定义如下
RSAPrivateKey ::SEQUENCE {version Version,modulus INTEGER, --npublicExponent INTEGER, --eprivateExponent INTEGER, --dprime1 INTEGER, --pprime2 INTEGER, --qexponent1 INTEGER,--d mod (p-1)exponent2 INTEGER,--d mod (q-1)coefficient INTEGER, -- (inverse of q) mod potherPrimeInfos OtherPrimeInfos OPTIONAL
}相关参数含义请查看RSA算法原理。
Attributes等参数为可选值未深入研究。 因此当version为0时私钥格式应如下
PrivateKeyInfo :: SEQUENCE {version Version,privateKeyAlgorithm :: SEQUENCE {algorithm OBJECT IDENTIFIER,parameters ANY DEFINED BY algoarithm OPTIONAL}privateKey :: OCTET STRINGRSAPrivateKey :: SEQUENCE {version Version,modulus INTEGER, --npublicExponent INTEGER, --eprivateExponent INTEGER, --dprime1 INTEGER, --pprime2 INTEGER, --qexponent1 INTEGER,--d mod (p-1)exponent2 INTEGER,--d mod (q-1)coefficient INTEGER, -- (inverse of q) mod potherPrimeInfos OtherPrimeInfos OPTIONAL}attributes [0] IMPLICIT Attributes OPTIONAL
}3.X.509公钥
在RFC5280中对公钥的定义如下
SubjectPublicKeyInfo :: SEQUENCE {algorithm AlgorithmIdentifier,subjectPublicKey BIT STRING
}其中AlgorithmIdentifier和私钥中定义相同见本文2.2章节 subjectPublicKey定义在RFC8017 A.1.1
RSAPublicKey :: SEQUENCE {modulus INTEGER, --npublicExponent INTEGER --e
}4.文件格式说明
原始公私钥和证书文件应以ASN.1进行编码编码后的文件是二进制格式。为便于查看通常会对ASN.1原始编码进行base64并添加头尾信息形成文本存储格式此类文件即为PEM文件通常以.pem、.cer、.key等格式保存。第五章节将详细说明。
5.实践验证
本章主要基于openssl 3.1版本进行实践以验证上述理解是否正确。注意不同版本的openssl生成的公私钥遵循的规范可能有一定差异。尤其是1.X版本
5.1 公钥
我们通过openssl生成公私钥命令如下 openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048 默认生成PKCS#8 PEM格式的私钥如下
该文件是以-----BEGIN PRIVATE KEY-----为头-----END PRIVATE KEY-----结尾中间部分即为PKCS#8私钥的ASN.1原始编码的BASE64后内容。可通过如下步骤进行验证
将中间部分复制到新文件中新文件命名为111.txt
2.对111.txt中的内容进行base64解码后以文本形式打开将是乱码 3.通过如下命令 openssl rsa -in private.pem -outform DER -out private.der 将PEM格式的私钥转换为ASN.1原始编码的DER格式。
4.对比转换后的111.txt文件和通过openssl生成的private.der文件可看到2个文件完全一致。
通过hexview打开private.pem可以看到原始ASN.1编码
为便于后续分析我们使用专业解析工具ASN.1 Editor打开private.pem或者private.der文件以ASN.1编码形式查看如下图关于ASN.1如何理解请阅读上篇文章
在2.1章节总结当version为0时私钥格式为
PrivateKeyInfo :: SEQUENCE {version Version,privateKeyAlgorithm :: SEQUENCE {algorithm OBJECT IDENTIFIER,parameters ANY DEFINED BY algoarithm OPTIONAL}privateKey :: OCTET STRINGRSAPrivateKey :: SEQUENCE {version Version,modulus INTEGER, --npublicExponent INTEGER, --eprivateExponent INTEGER, --dprime1 INTEGER, --pprime2 INTEGER, --qexponent1 INTEGER,--d mod (p-1)exponent2 INTEGER,--d mod (q-1)coefficient INTEGER, -- (inverse of q) mod potherPrimeInfos OtherPrimeInfos OPTIONAL}attributes [0] IMPLICIT Attributes OPTIONAL
}对照解析如下 1.整个文件就是1个SEQUENCE的TLV。T为30指明是个SEQUENCE。L是82 04 BD指明V的长度为0x04BD即1213个字节
2.随后是SEQUENCE的值内容。内容区应包含三个部分1个Version、1个SEQUENCE、1个OCTET STRING其中Version为0如下图符合预期
3.SEQUENCE为privateKeyAlgorithm。包含1个类型为OBJECT IDENTIFIER的algorithm和1个parameters。如下图30为SEQUENCE的T0D为SEQUENCE的L06为algorithm的L09为algorithm的长度algorithm的值为2A 86 48 86 F7 0D 01 01 01共9个字节且值符合2.1章节的分析。parameters为NULL类型
4.OCTET STRING为privateKey即存储的私钥信息。首先是个SEQUENCE包裹内容SEQUENCE中包含9个INTEGERotherPrimeInfos为可选的本次证书里没有该内容。
5.2 公钥
通过openssl命令从私钥中生成公钥命令如下 openssl rsa -pubout -in private.pem -out public.pem 同样适用ASN.1 Editor打开公钥public.pem。可以看到公钥整体有1个SEQUENCESEQUENCE中包含1个SEQUENCE和1个BIT_STRINGBIT_STRING中是1个SEQUENCE符合第3章节的X.509的公钥结构。
具体解读不再赘述。可参考5.1章节对私钥的解读按照相同方式解读。
6.总结
本文在前4个章节主要基于相关RFC文档的解读简单介绍RSA算法的公私钥如何保存到文件中即RFC相关文档定义了公私钥保存的格式随后使用ASN.1编码对相关内容进行编码并按照RFC定义的格式保存到文件中。实际保存到文件中还涉及两种格式1.原始ASN.1编码以二进制文件格式保存到文件中。2.对原始ASN.1进行BASE64编码随后添加一个可文本阅读的头和尾形成pem格式的可阅读文本文件。在第5章节结合OPENSSL实际生成的公私钥进行验证。 本文仅介绍了最简单也是最常见情况下的公私钥存储情况不涉及加密保存的公私钥等场景。若需深入研究可继续阅读本文中罗列的RFC文档。