PEM
Privacy Enhanced Mail (PEM)
RFC 7468 Textual Encodings of PKIX, PKCS, and CMS Structures
RFC 1421 Privacy-Enhanced Mail (PEM)
メールを暗号化したり署名したりの古い仕様、エンコード方式のみ残っている感じか
X.509のv1くらいを使っていた
-----BEGIN type-----
-----END type-----
ハイフンは5文字ずつ
今は主にASN.1のBER,CER,DER形式をテキスト化するために使われたり table:type
ヘッダ 種類 暗号 拡張子例
RSA PRIVATE KEY PKCS #1 RFC 8017 A.1.2 無 KEY OpenSSL 独自 PKCS #5 PBES1+PBKDF1改 有 KEY EC PRIVATE KEY OpenSSL ECDSA traditional RFC 5915 3.? 有/無 KEY
PRIVATE KEY PKCS #8 OID付き RSA, ECDSA, EdDSAなど RFC 5208 5. PrivateKeyInfo RFC 5958 2. 無 KEY ENCRYPTED PRIVATE KEY PKCS #8 PKCS #5 PBES2+PBKDF2, RSAなど RFC 5208 6. EncryptedPrivateKeyInfo RFC 5958 3. 有 KEY PUBLIC KEY PKCS #1 RSA, ECDSA, EdDSAなどの公開鍵 RFC 8017 A.1.1 ? 無 PUB CERTIFICATE REQUEST PKCS #10 X.509 公開鍵署名要求 RFC 4211 3 ? 無 CSR CERTIFICATE X.509 証明書 無 CER CRT
OPENSSH PRIVATE KEY OpenSSH 公開鍵+暗号秘密鍵 (非ASN.1) 有/無 無
SSH2 PUBLIC KEY RFC 4716 SSH2 公開鍵
階層構造
大抵のRSA鍵形式、X.509関連ファイルはASN.1という形式に従ってデータ化されている。
よく出てくるのはPEMとDER、この2つは別の階層で、PEMの中にもDERが入っているといえる。
ではどう比較すればいいのかというとバイナリ形式とテキスト形式のPEM形式、でいいように思う。
PEMはBASE64で符号化されてヘッダ、フッタを付与した形式。旧形式では暗号化もPEMの範囲で行える。
PRIVATE KEY と ENCRYPTED PRIVATE KEY は PKCS #8 の秘密鍵保存形式。どの鍵の種類なのかという情報が追加されている。ENCRYPTED PRIVATE KEYは、PRIVATE KEYをPKCS #5 のPBES2で暗号化したもの、型の情報はPKCS #8 PEM テキスト化
暗号化(PBKDF1改)
ASN.1 (DER符号化)
RSA鍵
PrivateKeyInfo
version 0
AlgorithmIdentifier
algorithm 鍵の種別(RSA,ECDSAなど)
privateKey 鍵 (中でASN.1 DER符号化 OCTETSTRING)
EncryptedPrivateKeyInfo (暗号化する場合)
AlgorithmIdentifier
PBES2 OID
PBES2 情報
KDF情報 PBKDF2 パスワードの暗号 key に使用
ブロック暗号情報 (aes256-cbc-pad など)
CBCなどの iv
PrivateKeyInfo 形式をASN.1 DERで符号化、PBES2で暗号化したもの OCTETSTRING
PEM
PKCS #1 バイナリは鍵そのもので暗号で保護する機能はない PEM (PKCS #1 テキスト形式の場合) または PKCS #8 でパスワード保護が可能 RSA PRIVATE KEY は PKCS #5 形式と呼ばれていることがある。暗号化されていないものはPKCS #1 の素なのだけど PKCS #5 のPBKDF1とPBES1を改変したもので暗号化されているのでそう呼ばれるのかどうか。 Proc-Type: 4,ENCRYPTED
最近までRSAプライベート鍵の暗号化で利用されていた形式 PKCS #5 PBKDF1, PBES1を拡張した暗号、中は PKCS #1 形式など素の形式 ストレッチ回数が少ないので新規では作らない方がいいかも
code:ヘッダ例
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,A1234567890123456789...
KEY と IV を抽出する方法
入力
ハッシュアルゴリズム OpenSSL は MD5固定
password: 手入力など
IV: DEK-Info の後ろ側
c: iteration count OpenSSLは 1固定
dkLen 出力サイズ 16, 24, 32 (128/8, 192/8, 256/8)
出力
key AESなどの鍵 128bit ,192bit, 256bit など
Proc-Type: 4,ENCRYPTED のPBKDF1改 鍵導出関数
Proc-Type が 4,ENCRYPTED の場合の処理
DEK-Info からアルゴリズムとIV を抽出する
PBKDF1ではハッシュ長以上にできないので拡張されている
DES系のアルゴリズムではIVが64bitで何も気にしなくてよかったが、AES系ではIVが128bitになっているのでsaltをIVの半分の64bitにする処理が入る
TripleDES, AESが使えるのでPBES1でもない感じになっている
Proc-Type: 3,ENCRYPTED
未 古そうな形式
PKCS8
-----BEGIN PRIVATE KEY-----
PBES2
PKCS #8 形式の鍵の暗号化で新しい形式 PBKDF2 などでKEYを生成する パラメータに暗号方式の付与あり。
デフォルトストレッチ数は2000回くらい
鍵の共通形式 PKCS #8 で PBES2で暗号化 RSA鍵のみ暗号対応? RSA以外の鍵の保護はPKCS #8 または PKCS #12 を使う? X.509 は証明書 (公開鍵 + 所有者情報の署名付き)
RFC 7468 Textual Encodings of PKIX, PKCS, and CMS Structures
RFC 1421 Privacy Enhancement for Internet Electonic Mail: Part I: Message Encrryption and Authentication Procedures RFC 1422 Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management RFC 1423 Privacy Enhancement for Internet Electronic Mail: Part III: Algorithms, Modes, and Identifiers DES-CBC などの暗号化方法
RFC 1424 Privacy Enhancement for Internet Electronic Mail: Part IV: Key Certification and Related Services
RFC 1113 Privacy Enhancement for Internet Electronic Mail
RFC 1114