都立工業高等専門学校(現、東京都立産業技術高等専門学校)を卒業、
機械工学が専攻だった癖に論理回路やオーディオ関係の技術者らしい。
趣味として、音楽関係のフリーソフト開発や、DTM・チップチューン活動をしたり、
オーケストラや吹奏楽団でオーボエを吹いてる人。
上のアドレスの『@』と『nifty』の間に『spa.』を追加して下さい。
画像で記載されているアドレスでも届きますが、スパム防止のフィルターを多数導入しています。
本ホームページはリンクフリーです。
リンクは、トップページ
"http://shaw.la.coocan.jp/"
にお願いいたします。
Top Page\ Security Top\ Algorithm\ Key Management\
CMSでサポートされるパスワードによる鍵管理手法について示す。
鍵導出アルゴリズムは、パスワードを鍵暗号化用の鍵(KEK)に変換する為に使われる。
鍵暗号アルゴリズムにより、導出した鍵暗号化用の鍵(KEK)でコンテンツ暗号化用の鍵(CEK)が暗号化される。
これらのアルゴリズムは、パスワードを鍵暗号化鍵(KEK)に変換する為に使われる。
習慣的な手法は、PBKDF2 [RFC2898]を含まなければならない。
KeyDerivationAlgorithmIdentifier ::= AlgorithmIdentifier
CMSでサポートされる鍵導出関数"PBKDF2"について示す。
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 } }
フィールド名 | 内容 |
---|---|
salt | 暗号学的擬似乱数関数(hMAC等)に入力するソルト |
iterationCount | 繰り返し回数 |
keyLength | 鍵暗号化鍵(KEK)のサイズ[Byte] |
prf | 使用する暗号学的擬似乱数関数(hMAC等)のoid。省略時は、hMAC-SHA1となる。 |
これらのアルゴリズムは、得られた鍵暗号化鍵(KEK)を使って、コンテンツ暗号化鍵(CEK)を暗号化する為に使われる。
習慣的な手法は、"id-alg-PWRI-KEK"鍵ラップアルゴリズムを使用しなければならない。
このアルゴリズムのパラメータフィールドは、鍵ラップアルゴリズムで使った鍵暗号化アルゴリズムが含まれる。
鍵暗号化鍵(KEK)の暗号化アルゴリズムと同一のアルゴリズムである必要はない。
とはいえ、異なるアルゴリズムが使用する場合に同等以上のセキュリティとなる事を確実にするよう、注意するべきである。
(例えば、RC2/40鍵でラッピングしたTriple-DES鍵は、暗号強度で厳密なインピーダンス不整合を導く。)
習慣的な手法は、Triple-DES CBC及び、その他のアルゴリズム、
例えばAES, CAST-128, RC5, IDEA, Skipjack, Blowfish及び
要求された暗号モード等を含む。
ブロック暗号のOFBモード及びECBモードや、RC4等のいかなるKSG (keystream generator)暗号を使用しないべきである。
parameters ::= AlgorithmIdentifier
まず、コンテンツ暗号化鍵(CEK)を、以下の通り整形する。
つまり、この並びの構造になる。
SS … コンテンツ暗号化鍵(CEK) バイトのカウント値
CC … チェック値
XX … コンテンツ暗号化鍵(CEK)
PP … パディング (要求された場合)
SS | CC | XX XX XX ... XX | PP PP ... PP |
次に、この整形したコンテンツ用暗号鍵(CEK)を、2回暗号化を実施する。
このとき、parametersで指定された暗号アルゴリズムを用い、
2回目の暗号化においては初期化ベクタIVはリセットせず、そのまま使う。
尚、設定する暗号鍵は、鍵導出関数でパスワードから導き出した暗号鍵を用いる。
暗号化されたデータブロック数をnとする。
この例では、以下の条件における例を示す。
暗号鍵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 |
初期化ベクタIV | EF 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 : }