【问题标题】:Differences between "BEGIN RSA PRIVATE KEY" and "BEGIN PRIVATE KEY"“BEGIN RSA PRIVATE KEY”和“BEGIN PRIVATE KEY”的区别
【发布时间】:2013-12-02 15:17:38
【问题描述】:

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

开头
-----BEGIN PRIVATE KEY-----

而其他人则以

-----BEGIN RSA PRIVATE KEY-----

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

【问题讨论】:

    标签: openssl rsa private-key pem


    【解决方案1】:

    请参阅https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem(在页面上搜索“BEGIN RSA PRIVATE KEY”)(archive link 以防万一)。

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

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

    PrivateKeyInfo ::= SEQUENCE {
      version         Version,
      algorithm       AlgorithmIdentifier,
      PrivateKey      BIT STRING
    }
    
    AlgorithmIdentifier ::= SEQUENCE {
      algorithm       OBJECT IDENTIFIER,
      parameters      ANY DEFINED BY algorithm OPTIONAL
    }
    

    所以对于 RSA 私钥,OID 是 1.2.840.113549.1.1.1 并且有一个 RSAPrivateKey 作为 PrivateKey 密钥数据位串。

    BEGIN RSA PRIVATE KEY 不同,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-----
    

    在 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 (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
    }
    

    【讨论】:

    • 那么,除了这两种格式之外,是否还有其他格式,如果有,我如何从标题中确定它?
    • 我想 sonic 的答案中给出的任何私钥标签都是公平的游戏。
    • 对于 RSA 密钥,PKCS#1 包含 CRT 参数,PKCS#8 不包含。您可以通过查看尺寸来确认这一点。即使添加了更多标头,PKCS#8 也更小。如果您关心性能,请使用 PKCS#1。我的测试显示快了 3 倍。
    • @ZZCoder,您能否提供一些有关您如何生成密钥和测试性能的详细信息? openssl genpkey -algorithm RSA -out key.pem 生成包含 CRT 参数的 PKCS#8 密钥。
    • 要生成 PKCS#1 密钥,可以使用openssl genrsa 命令。使用openssl req 生成私钥和crt 最终会得到一个PKCS#8 密钥。 genpkey 手册声明 The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.。但是某些软件 (mysql) 只能使用 PKCS#1 密钥。从 PKCS#8PKCS#1 的转换可以通过 openssl rsa -in key.pem -out key.pem 完成。可以使用openssl pkey -in key.pem -out key.pem 完成其他方式的转换。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 2014-12-05
      • 2021-06-08
      • 2013-08-05
      • 1970-01-01
      • 2020-09-22
      • 2013-09-06
      相关资源
      最近更新 更多