ASN.1でRSAなどの鍵を保存する形式 OIDが付与されている RFC 5958 Asymmetric Key Packages
RFC 5959 Algorithms for Asymmetric Key Package Content Type
秘密鍵 (Private Key) の保存から公開鍵を含むことができる形式に変更された
参照 (RFC 2898 PKCS #5 v2.0 から変更 PKCS #5 の最新は RFC 8018) RFC 5911 New ASN.1 Modules for Cryptographic Message Syntax (CMS) and S/MIME
RFC 5912 New ASN.1 Modules for the Public Key Infrastructure Using X.509 (PKIX)
RFC 5208 Public-Key Cryptography Standards (PKCS) #8: Private-Key Information Syntax Specification Version 1.2 code:OneAsymmetricKey
AsymmetricKeyPackage ::= SEQUENCE SIZE (1..MAX) Of OneAsymmetricKey
OneAsymmetricKey ::= SEQUENCE {
version Version,
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
privateKey PrivateKey,
attributes 0 Attributes OPTIONAL, ...,
2: publicKey 1 PublicKey OPTIONAL , ...
}
PrivateKeyInfo ::= OneAsymmetricKey
Version ::= INTEGER { v1(0), v2(1) } (v1, ..., v2)
PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
{ PUBLIC-KEY,
{ PrivateKeyAlgorithms } }
PrivateKey ::= OCTET STRING
PublicKey ::= BIT STRING
AsymmetricKeyPackage として一覧をSEQUENCE で保存できるようだ
公開鍵(publicKey)と私有鍵(privateKey)はOCTET STRING とBIT STRINGで区別されているが、並び順とタグでも区別したほうがいいだろう。
code:EncryptedPrivateKeyInfo
EncryptedPrivateKeyInfo ::= SEQUENCE {
encryptionAlgorithm EncryptionAlgorithmIdentifier,
encryptedData EncryptedData }
EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
{ CONTENT-ENCRYPTION,
{ KeyEncryptionAlgorithms } }
EncryptedData ::= OCTET STRING
暗号化する場合、 EncryptedPrivateKeyInfo に PrivateKeyInfo をASN.1 BER または DER で EncryptedData として格納する
PUBLIC-KEY, CONTENT-ENCRYPTION などはclassで RFC 5911 にあるようだ
SoftLibASN1でXMLっぽく書き出して型などを足してみた例 (XERではない 鍵は新規生成で未使用のもの)
code:EncryptedPrivateKeyInfo XML
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SEQUENCE>
<SEQUENCE type="EncryptionAlgorithmIdentifier" name="encryptionAlgorithm">
<OBJECTIDENTIFIER name="algorithm" short="id-PBES2">1.2.840.113549.1.5.13</OBJECTIDENTIFIER>
<SEQUENCE type="PBES2-params" name="parameters">
<SEQUENCE name="keyDerivationFunc" type="PBES2-KDFs,AlgorithmIdentifier">
<OBJECTIDENTIFIER name="algorithm" short="id-PBKDF2">1.2.840.113549.1.5.12</OBJECTIDENTIFIER>
<SEQUENCE type="PBKDF2-params" name="parameters">
<OCTETSTRING>pKC4rdTapqslzz1EtjuCBg==</OCTETSTRING>
<INTEGER>2048</INTEGER>
<SEQUENCE type="AlgorithmIdeitifier">
<OBJECTIDENTIFIER short="id-hmacWithSHA256">1.2.840.113549.2.9</OBJECTIDENTIFIER>
<NULL/>
</SEQUENCE>
</SEQUENCE>
</SEQUENCE>
<SEQUENCE name="encrytionScheme" type="AlogrithmIdentifier">
<OBJECTIDENTIFIER name="algorithm" short="aes256-CBC-PAD">2.16.840.1.101.3.4.1.42</OBJECTIDENTIFIER>
<OCTETSTRING name="parameters">DzfbpLQiCuS8WLoZRGnWug==</OCTETSTRING>
</SEQUENCE>
</SEQUENCE>
</SEQUENCE>
<OCTETSTRING name="encryptedData">YiRsfS7bv4PQYuD1Z4LwfWdCIME6NNi73GEiD4kNKR9jgjYXdq6sUZcZpZwoj3E0/mgFHJI1HZc107ybm2jLrRZmbvP8Sz0bs0LUVFTrDwBWNnN2HQ8AF6rfQnJjsH9w1jg9LTZKz68SoUvKYEJU0Uu0mDmR3/2VNYAJaAno3dY663LiwziWrCGbAM50QXCx</OCTETSTRING>
</SEQUENCE>
PBES2のパラメータ内にPBKDF2のパラメータ( salt, iterationCount, hmac AlgorithmIdentifierr)と暗号種別、salt (IV)、本体はencryptedData