Top PageSecurity TopAlgorithmKey Management

パスワードによる鍵管理手法

CMSでサポートされるパスワードによる鍵管理手法について示す。

鍵導出アルゴリズムは、パスワードを鍵暗号化用の鍵(KEK)に変換する為に使われる。
鍵暗号アルゴリズムにより、導出した鍵暗号化用の鍵(KEK)でコンテンツ暗号化用の鍵(CEK)が暗号化される。

鍵導出アルゴリズム(Key Derivation Algorithm)

これらのアルゴリズムは、パスワードを鍵暗号化鍵(KEK)に変換する為に使われる。
習慣的な手法は、PBKDF2 [RFC2898]を含まなければならない。

KeyDerivationAlgorithmIdentifier ::= AlgorithmIdentifier

CMSでサポートされる鍵導出関数"PBKDF2"について示す。

PBKDF2

PBKDF2
1.2.840.113549.1.5.12

PBKDF2の詳細は、"RFC 2898 [PKCS#5]"を参照。
関連する多くのパラメータは、ユーザーが適用したパスワードから鍵暗号用の鍵を得る為に使われる。

parameters ::= SEQUENCE {
  salt CHOICE {
    specified OCTET STRING,
    otherSource AlgorithmIdentifier },
  iterationCount INTEGER (1..MAX),
  keyLength INTEGER (1..MAX) OPTIONAL,
  prf AlgorithmIdentifier DEFAULT { 
    algorithm hMAC-SHA1,
    parameters NULL } }
PBKDF2のパラメータについて
フィールド名 内容
salt 暗号学的擬似乱数関数(hMAC等)に入力するソルト
iterationCount 繰り返し回数
keyLength 鍵暗号化鍵(KEK)のサイズ[Byte]
prf 使用する暗号学的擬似乱数関数(hMAC等)のoid。省略時は、hMAC-SHA1となる。

鍵暗号化アルゴリズム(Key Encryption Algorithms)

これらのアルゴリズムは、得られた鍵暗号化鍵(KEK)を使って、コンテンツ暗号化鍵(CEK)を暗号化する為に使われる。
習慣的な手法は、"id-alg-PWRI-KEK"鍵ラップアルゴリズムを使用しなければならない。

id-alg-PWRI-KEK

id-alg-PWRI-KEK
1.2.840.113549.1.9.16.3.9

このアルゴリズムのパラメータフィールドは、鍵ラップアルゴリズムで使った鍵暗号化アルゴリズムが含まれる。
鍵暗号化鍵(KEK)の暗号化アルゴリズムと同一のアルゴリズムである必要はない。
とはいえ、異なるアルゴリズムが使用する場合に同等以上のセキュリティとなる事を確実にするよう、注意するべきである。
(例えば、RC2/40鍵でラッピングしたTriple-DES鍵は、暗号強度で厳密なインピーダンス不整合を導く。)

習慣的な手法は、Triple-DES CBC及び、その他のアルゴリズム、 例えばAES, CAST-128, RC5, IDEA, Skipjack, Blowfish及び 要求された暗号モード等を含む。
ブロック暗号のOFBモード及びECBモードや、RC4等のいかなるKSG (keystream generator)暗号を使用しないべきである。

parameters ::= AlgorithmIdentifier

Key Wrap のプロセス

まず、コンテンツ暗号化鍵(CEK)を、以下の通り整形する。

  1. コンテンツ暗号化鍵(CEK)のバイト数の、1バイトのカウント値。
  2. コンテンツ暗号化鍵(CEK)の最初の3バイトのビット単位の補数を含むチェック値。
  3. コンテンツ暗号化鍵(CEK)
  4. ランダムパディングで、整形したコンテンツ用暗号化鍵が鍵暗号化アルゴリズムのブロック長の倍数になるようにする。
    パディングデータは暗号論敵強度を持たないが、予測不可能性は助ける。
    常に知られたデータ長であるので、PKCS#5パディングは使わないように注意する。

つまり、この並びの構造になる。
SS … コンテンツ暗号化鍵(CEK) バイトのカウント値
CC … チェック値
XX … コンテンツ暗号化鍵(CEK)
PP … パディング (要求された場合)

SSCCXX XX XX ... XXPP PP ... PP

次に、この整形したコンテンツ用暗号鍵(CEK)を、2回暗号化を実施する。
このとき、parametersで指定された暗号アルゴリズムを用い、 2回目の暗号化においては初期化ベクタIVはリセットせず、そのまま使う。
尚、設定する暗号鍵は、鍵導出関数でパスワードから導き出した暗号鍵を用いる。

Key Unwrap のプロセス

暗号化されたデータブロック数をnとする。

  1. 先ず、暗号モジュールの初期化ベクタIVを、(n-1)番目のブロックの値に設定し、(n)番目(最終)のブロックを復号する。
  2. 次に、復号した(n)番目(最終)のブロックを初期化ベクタIVにし、1〜(n-1)番目のブロックを復号する。
  3. 暗号モジュールのパラメータどおりの初期化ベクタIVに設定しなおし、1〜(n)番目までの全ブロックを復号する。
  4. 1バイト目が鍵長。2〜4バイト目がチェック地、5バイト目〜がコンテンツ用暗号鍵CEKの平文となる。

PasswordRecipientInfoにおけるコンテンツ用暗号鍵CEKの暗号・格納例

この例では、以下の条件における例を示す。

暗号鍵CEK 8C 62 7C 89 73 23 A2 F8 … (通常は乱数から生成)
パスワード "password"
鍵導出関数 PBKDF2 with HMAC-SHA-1
 salt 12 34 56 78 78 56 34 12 … (通常は乱数から生成)
 繰り返し回数 5            … (推奨は1000回)
鍵暗号化関数 PWRI-KEK
 暗号関数 DES暗号, 暗号利用モードCBC
 初期化ベクタIVEF E5 98 EF 21 B3 3D 6D … (通常は乱数から生成)

まず、鍵導出を行う。
導き出す鍵は鍵暗号化アルゴリズムで用いるので、鍵長はこのアルゴリズムの鍵長とする。
今回は、PWRI-KEK + DES-CBCを用いるので、鍵長dkLenは8[Byte]となる。
KEK = PBKDF2(password="password", salt=12 34 56 78 78 56 34 12, count=5, dkLen=8
   = d1 da a7 86 15 f2 87 e6 … 鍵暗号化鍵KEKになる。

コンテンツ用暗号鍵CEKの整形。
今回は、鍵暗号化に用いる暗号関数にDES-CBCを用いる。
ブロック長は8[Byte]であるため、整形後データは8の整数倍のサイズにならなければならない。
従って、「長さ」、「チェック」、「CEK」を配置し、足りない分はランダムデータによってパディングする。

長さ    :08 … ラップするコンテンツ用暗号鍵CEKの鍵長は8Byte
チェック  :73 9D 83 … (CEKの先頭3Byteの補数)
CEK   :8C 62 7C 89 73 23 A2 F8 … CEK本体
パディング :C4 36 F5 41 … ランダムにパディングする。

整形後データ:08 73 9D 83 8C 62 7C 89 73 23 A2 F8 C4 36 F5 41

できた整形後データを2回暗号化する。 暗号モジュール(今回は、DES-CBC)の設定。
初期化ベクタIV = EF E5 98 EF 21 B3 3D 6D
暗号鍵   Key = d1 da a7 86 15 f2 87 e6

1回目:06 A0 43 86 1E 82 88 E4 8B 59 9E B9 76 10 00 D4
2回目:B8 1B 25 65 EE 37 3C A6 DE DC A2 6A 17 8B 0C 10

"PasswordRecipientInfo"のASN.1エンコード結果

    0 A3   68: [3] {
    2 02    1:   INTEGER 0
    5 A0   26:   [0] {
    7 06    9:     OBJECT IDENTIFIER id-PBKDF2 (1 2 840 113549 1 5 12)
   18 30   13:     SEQUENCE {
   20 04    8:       OCTET STRING
             :         12 34 56 78 78 56 34 12  … salt
   30 02    1:       INTEGER 5  … 繰り返し回数
             :       }
             :     }
   34 30   32:   SEQUENCE {
   36 06   11:     OBJECT IDENTIFIER id-alg-PWRI-KEK
             :         (1 2 840 113549 1 9 16 3 9)
   33 30   17:     SEQUENCE {
   35 06    5:       OBJECT IDENTIFIER des-CBC (1 3 14 3 2 7)
   42 04    8:       OCTET STRING
             :         EF E5 98 EF 21 B3 3D 6D  … 初期化ベクタIV
             :       }
             :     }
   68 04   16:   OCTET STRING
             :     B8 1B 25 65 EE 37 3C A6 DE DC A2 6A 17 8B 0C 10  … 暗号化されたコンテンツ用鍵CEK
             :   }