密钥存储格式
密钥存储格式标准
密钥的存储需要标准来规范,比如存储字段的格式,包含哪些内容。比如对于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
}