Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Openssl 区别于;“开始RSA私钥”;及;“开始私钥”;_Openssl_Rsa_Private Key_Pem - Fatal编程技术网

Openssl 区别于;“开始RSA私钥”;及;“开始私钥”;

Openssl 区别于;“开始RSA私钥”;及;“开始私钥”;,openssl,rsa,private-key,pem,Openssl,Rsa,Private Key,Pem,您好,我正在编写一个程序,从.pem文件导入私钥,并创建一个私钥对象供以后使用。。 我面临的问题是一些pem文件头以 -----BEGIN PRIVATE KEY----- 而其他人则是从 -----BEGIN RSA PRIVATE KEY----- 通过我的搜索,我知道第一个是PKCS#8格式的,但我不知道另一个属于什么格式。请参见(在页面中搜索“BEGIN RSA私钥”)(为后代,以防万一) BEGIN RSA私钥是PKCS#1,只是一个RSA密钥。它本质上只是PKCS#8中的关键对象

您好,我正在编写一个程序,从
.pem
文件导入私钥,并创建一个私钥对象供以后使用。。 我面临的问题是一些
pem
文件头以

-----BEGIN PRIVATE KEY-----
而其他人则是从

-----BEGIN RSA PRIVATE KEY-----
通过我的搜索,我知道第一个是
PKCS#8
格式的,但我不知道另一个属于什么格式。

请参见(在页面中搜索“BEGIN RSA私钥”)(为后代,以防万一)

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

未加密的PKCS#8编码数据以标记开始和结束:

-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----
在base64编码数据中,存在以下DER结构:

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

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}
RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}
因此,对于RSA私钥,OID是1.2.840.113549.1.1.1,并且有一个RSAPrivateKey作为PrivateKey数据位字符串

与“开始RSA私钥”相反,它总是指定RSA密钥,因此不包括密钥类型OID
BEGIN RSA私钥
is
PKCS#1

RSA私钥文件

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

它以标签开始和结束:

-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----
在base64编码数据中,存在以下DER结构:

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

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}
RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}
看一看。它提供了可能的开始标记

从上述链接复制内容以供快速参考:

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

那么,除了这两种格式之外,还有其他格式吗?如果有,我如何从标题中确定?我想sonic的答案中给出的任何私钥标签都是公平的。对于RSA密钥,PKCS#1包含CRT参数,PKCS#8不包含。您可以通过查看尺寸来确认这一点。PKCS#8更小,即使添加了更多的标题。如果您关心性能,请使用PKCS#1。我的测试显示速度快了3倍。@ZZCoder,您能提供一些关于如何生成密钥和测试性能的详细信息吗
openssl genpkey-算法RSA-out key.pem
生成包含CRT参数的PKCS#8密钥。要生成PKCS#1密钥,可以使用
openssl genrsa
命令。使用
openssl-req
生成私钥和crt将得到一个PKCS#8密钥。
genpkey
手册规定了
鼓励使用genpkey程序而不是特定于算法的实用程序,因为可以使用额外的算法选项和引擎提供的算法。
。但是一些软件(
mysql
)只能使用PKCS#1键。可以使用
openssl rsa-in-key.pem-out-key.pem
完成从PKCS#8到PKCS#1的转换。通过
opensslpkey-in-key.pem-out-key.pem
可以实现另一种方式的转换。