"BEGIN RSA PRIVATE KEY"和"BEGIN PRIVATE KEY"之间的差异

mon*_*nim 128 openssl rsa pem private-key

嗨,我正在编写一个程序,从一个.pem文件导入私钥,并创建一个私钥对象,以便以后使用它.我遇到的问题是一些pem文件头开头

-----BEGIN PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

而其他人开始

-----BEGIN RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

通过我的搜索我知道第一个PKCS#8格式化,但我不知道另一个格式是什么格式.

Jas*_*n C 155

请参阅https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem(搜索"BEGIN RSA PRIVATE KEY"页面)(后续存档链接,以防万一).

BEGIN RSA PRIVATE KEY是PKCS#1,只是一个RSA密钥.它本质上只是PKCS#8的关键对象,但前面没有版本或算法标识符.BEGIN PRIVATE KEY是PKCS#8并指示密钥类型包含在密钥数据本身中.从链接:

未加密的PKCS#8编码数据以标签开头和结尾:

-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

在base64编码数据中,存在以下DER结构:

PrivateKeyInfo ::= SEQUENCE {
  version         Version,
  algorithm       AlgorithmIdentifier,
  PrivateKey      BIT STRING
}

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}
Run Code Online (Sandbox Code Playgroud)

因此,对于RSA私钥,OID是1.2.840.113549.1.1.1,并且有一个RSAPrivateKey作为PrivateKey密钥数据bitstring.

相反BEGIN RSA PRIVATE KEY,它始终指定RSA密钥,因此不包括密钥类型OID.BEGIN RSA PRIVATE KEYPKCS#1:

RSA私钥文件(PKCS#1)

RSA私钥PEM文件特定于RSA密钥.

它以标签开头和结尾:

-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)

在base64编码数据中,存在以下DER结构:

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}
Run Code Online (Sandbox Code Playgroud)

  • OpenSSL 3x 已出现在 Ubuntu 22.04 中。要获取 PKCS#1 密钥,您现在需要执行 `openssl genrsa --traditional 2048` (6认同)
  • @ZZCoder,您能否提供一些关于如何生成密钥并测试性能的详细信息?`openssl genpkey -algorithm RSA -out key.pem`生成包含CRT参数的PKCS#8密钥. (5认同)
  • 要生成*PKCS#1*键,可以使用`openssl genrsa`命令.使用`openssl req`生成私钥和crt将最终得到*PKCS#8*密钥.`genpkey`手册指出`鼓励使用genpkey程序而不是算法特定的实用程序,因为可以使用额外的算法选项和ENGINE提供的算法.但是有些软件(`mysql`)只能使用*PKCS#1*密钥.可以使用`openssl rsa -in key.pem -out key.pem`将*PKCS#8*转换为*PKCS#1*.转换另一种方式可以使用`openssl pkey -in key.pem -out key.pem`来完成. (4认同)

vis*_*ath 21

看看<openssl/pem.h>.它提供了可能的BEGIN标记.

复制以上链接中的内容以供快速参考:

#define PEM_STRING_X509_OLD "X509 CERTIFICATE"
#define PEM_STRING_X509     "CERTIFICATE"
#define PEM_STRING_X509_PAIR    "CERTIFICATE PAIR"
#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE"
#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST"
#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST"
#define PEM_STRING_X509_CRL "X509 CRL"
#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY"
#define PEM_STRING_PUBLIC   "PUBLIC KEY"
#define PEM_STRING_RSA      "RSA PRIVATE KEY"
#define PEM_STRING_RSA_PUBLIC   "RSA PUBLIC KEY"
#define PEM_STRING_DSA      "DSA PRIVATE KEY"
#define PEM_STRING_DSA_PUBLIC   "DSA PUBLIC KEY"
#define PEM_STRING_PKCS7    "PKCS7"
#define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA"
#define PEM_STRING_PKCS8    "ENCRYPTED PRIVATE KEY"
#define PEM_STRING_PKCS8INF "PRIVATE KEY"
#define PEM_STRING_DHPARAMS "DH PARAMETERS"
#define PEM_STRING_DHXPARAMS    "X9.42 DH PARAMETERS"
#define PEM_STRING_SSL_SESSION  "SSL SESSION PARAMETERS"
#define PEM_STRING_DSAPARAMS    "DSA PARAMETERS"
#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY"
#define PEM_STRING_ECPARAMETERS "EC PARAMETERS"
#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY"
#define PEM_STRING_PARAMETERS   "PARAMETERS"
#define PEM_STRING_CMS      "CMS"
Run Code Online (Sandbox Code Playgroud)