PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm AlgorithmIdentifier {{PrivateKeyAlgorithms}},
privateKey PrivateKey,
attributes [0] IMPLICIT Attributes OPTIONAL
}
Version ::= INTEGER {v1(0)} (v1,...)
PrivateKey ::= OCTET STRING
Attributes ::= SET OF Attribute
由上可知,PKCS8私钥结构包含了四个部分:版本号、算法标识、私钥数据、其他属性数据。
版本号version,当前还都是0(也就是v1版本);
算法标识privateKeyAlgorithm,又包括算法ID和私钥参数两部分,不同的算法私钥参数的结构也不同;
私钥数据privateKey,不同的算法私钥数据又有自己不同的结构;
其他属性数据attributes,这是可选项,可以没有。
RSA私钥数据结构
这一部分其实也就是PKCS1标准的私钥结构(PKCS1是专属于RSA的标准)
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
}
Version ::= INTEGER { two-prime(0), multi(1) }
(CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --})
ECC私钥数据结构
这一部分其实也就是SEC1标准的私钥结构(SEC1是专属于ECC的标准)
ECPrivateKey ::= SEQUENCE {
version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
privateKey OCTET STRING,
parameters [0] Parameters OPTIONAL,
publicKey [1] BIT STRING OPTIONAL }