密鑰存儲格式標准
密鑰的存儲需要標准來規范,比如存儲字段的格式,包含哪些內容。比如對於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
}