RSA 和 pkcs8 之间的区别

use*_*939 2 ssl openssl

openssl pkcs8 -topk8 -inform PEM -outform DER -in server.key -out server.der -nocrypt

openssl rsa -inform PEM -in server.key -outform DER -out server2.der
Run Code Online (Sandbox Code Playgroud)

我想找出为什么 server.der 和 server2.der 是两个不同的文件?RSA不是总是pkcs8吗?

ant*_*nku 6

命令:

openssl rsa -inform PEM -in server.key -outform DER -out server2.der
Run Code Online (Sandbox Code Playgroud)

生成PKCS#1格式的密钥,根据定义,该格式始终为 RSA。PKCS#1 标准专门定义了 RSA 密钥的语法。

命令:

openssl pkcs8 -topk8 -inform PEM -outform DER -in server.key -out server.der -nocrypt
Run Code Online (Sandbox Code Playgroud)

生成PKCS#8格式的密钥。PKCS#8 标准定义了一般存储私钥的语法。PKCS#8 不绑定到特定算法。PKCS#8 可能包含不同算法的私钥。

与 PKCS#1 相比,PKCS#8 是更高级别的抽象。当私钥基于 RSA 并且使用 PKCS#8 来存储私钥时,PKCS#8 包含 PKCS#1 RSA 密钥以及有关它的元数据,例如AlgorithmIdentifier

https://www.rfc-editor.org/rfc/rfc5208#appendix-A

PrivateKeyInfo ::= SEQUENCE {
   version Version,
   privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},
   privateKey PrivateKey,
   attributes [0] Attributes OPTIONAL }
Run Code Online (Sandbox Code Playgroud)

如果您以 PEM 格式而不是 DER 输出两种格式(PKCS#1 和 PKCS#8)的密钥,并且如果它们不是秘密的,您可以使用以下命令自行比较它们: http://lapo.it/asn1js/

您将看到 PKCS#8 只是包装了 PKCS#1 密钥。