4<- 目次 ->6


5. HMAC と擬似乱数関数 English

(準備中)

TLS レコード層とハンドシェイク層における多くの処理において、鍵付き MAC が必要である。鍵付き MAC とは、秘密情報によって保護された、あるデータの セキュアなダイジェストのことである。この秘密情報の知識なしに、MAC を偽造することは不可能である。この鍵付き MAC 処理において使用される構造は、HMAC [HMAC] として知られているものである。

HMAC は、さまざまなハッシュアルゴリズムと組み合わせることができる。TLS では、MD5 と SHA-1 の 2 つの異なるアルゴリズムのハンドシェイクで HMAC が使用され、それぞれ HMAC_MD5 (secret, data) と HMAC_SHA (secret, data) と表記する。暗号スイートを使用してさらなるハッシュアルゴリズムを定義し、そのアルゴリズムを使用してレコードデータを保護することができるが、プロトコルの本バージョンにでは、MD5 と SHA-1 をハンドシェイク処理の説明に直に記述する。

さらに、鍵生成または鍵検証のために、secret(秘密情報)を拡張してデータブロックとするための構造体が必要である。これを行う擬似乱数関数 (PRF: pseudo-random function) は、secret、seed および識別するための label を入力として受け取り、任意長のデータを出力する。

PRF をできるだけセキュアにするために、PRF では 2 つのハッシュアルゴリズムを使用する。一方がセキュアであれば PRF がセキュアであると保証されるという方法が用いられている。

ここでは、まず、データ拡張関数である P_hash (secret, data)を定義する。これは 1つのハッシュ関数を使用し、secret と seed を拡張して、任意長のデータを出力する。

P_hash(secret, seed) = HMAC_hash(secret, A(1) + seed) +
HMAC_hash(secret, A(2) + seed) +
HMAC_hash(secret, A(3) + seed) + ...

ここで、 + は連鎖を意味する。

A() は次のように定義される。

A(0) = seed
A(i) = HMAC_hash(secret, A(i-1))

P_hash は、必要な長さのデータを生成するまで計算を繰り返すことができる。例えば、P_SHA-1 を使用して 64 バイトのデータを作成する場合、ハッシュを 4回 (A(4)まで)繰り返し、80 バイトの出力データを得た後、最後の繰り返し計算における出力の最後の 16バイトのデータを切り捨て、残りの 64 バイトを出力データとする。

TLS における PRF では、secret(秘密情報)を 2つに分割し、その 1つを P_MD5 を使用したデータ生成に使用し、もう 1つを P_SHA-1 を使用したデータ生成に使用する。そしてそれらの 2つの拡張関数の出力に対して排他的 OR 処理を行う。

S1 と S2 は、secret(秘密情報)を 2つに分割したものであり、それぞれは同じ長さを持つ。 S1 は secret(秘密情報)の前半、S2 は後半である。それらのバイト数は、secret(秘密情報)全体の長さを 2で割った値を繰り上げることによって作成される。したがって、もし元の secret(秘密情報)のバイト数が奇数ならば、S1 の最後のバイトは S2 の最初のバイトと同じものになる。

L_S = secretのバイト長
L_S1 = L_S2 = ceil(L_S / 2);

secret(秘密情報)は、上記のように 2つに分割され(ここでは 1つの共有バイトがある可能性がある)、S1 が前半の L_S1バイト部分、S2 は後半の L_S2 バイト部分とされる。

PRFは、2つの擬似乱数ストリームを排他的 OR することによりミックスした結果として定義される。

PRF(secret, label, seed) = P_MD5(S1, label + seed) XOR
P_SHA-1(S2, label + seed);

ここで、label は ASCII 文字列である。Label は、そのバイト長を示すデータや NULL文字などの終端記号がない形式である。例えば、label "slithy toves"は、以下のバイト列をハッシュすることによって処理される。

73 6C 69 74 68 79 20 74 6F 76 65 73

MD5 は 16 バイトの出力、SHA-1 は 20 バイトの出力を行うため、それらの内部的な繰り返し処理回数は一致しないことに注意する必要がある。80バイトの出力を生成するためには、P_MD5 では A(5) まで繰り返し、P_SHA-1 では A(4) まで繰り返しを行う。


4<- 目次 ->6