密钥存储格式

密钥存储格式标准

密钥的存储需要标准来规范,比如存储字段的格式,包含哪些内容。比如对于ECC私钥来说就需要存储曲线的参数,不然别人拿到私钥怎么知道你是基于哪条椭圆曲线计算呢,除非你们事先约定好用固定的一条椭圆曲线。
The Public-Key Cryptography Standards(PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准。里面跟密钥存储格式有关的主要是下面两个标准。

  • PKCS#1:RSA加密标准。PKCS#1定义了RSA公钥函数的基本格式标准,特别是数字签名。它定义了数字签名如何计算,包括待签名数据和签名本身的格式;它也定义了PSA公/私钥的语法。
  • PKCS#8:私钥信息语法标准。PKCS#8定义了私钥信息语法和加密私钥语法,其中私钥加密使用了PKCS#5标准。

PKCS#8

PKCS#8标准定义了私钥信息语法,支持RSA,ECC等不同的私钥类型。这个标准的正文很短,因为只是总的定义了一个大的框架,并不包含每一种类型的私钥具体是怎么存储的。每一种类型的私钥的存储格式还需要配合专门的标准。

PrivateKeyInfo ::= SEQUENCE {
                        version Version,
                        privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},
                        privateKey PrivateKey,
                        attributes [0] IMPLICIT Attributes OPTIONAL 
                    }
  • version:协议版本号。
  • privateKeyAlgorithm:算法标识。
  • privateKey:私钥数据。
  • attributes:附加属性(可选项)。

RSA密钥存储格式

PKCS#1标准定义了RSA密钥的格式。RSA密钥可以用PKCS#1格式直接存储,也可以先通过PKCS#1格式转换,然后再用PKCS#8格式存储。

RSAPublicKey ::= SEQUENCE {
    modulus           INTEGER,  -- n
    publicExponent    INTEGER   -- e
}

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
}

ECC私钥存储格式

SEC-1标准定义了ECC私钥的格式。

ECPrivateKey ::= SEQUENCE {
    version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
    privateKey OCTET STRING,
    parameters [0] Parameters OPTIONAL,
    publicKey [1] BIT STRING OPTIONAL
}

参考资料

posted @ 2022-03-11 14:18  HachikoT  阅读(852)  评论(0编辑  收藏  举报