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密钥,因此不包括密钥类型OIDBEGIN RSA私钥
isPKCS#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
可以实现另一种方式的转换。