P_hash値のアルゴリズム
それでは次にP_hash関数の計算アルゴリズムを説明しよう。ちなみにP_hashという表記は一般型の表記であり、使用するハッシュ関数によって、P_MD5とかP_SHA-1といった名前で呼ばれる。また、説明に当たっては分かりやすいよう具体例としてP_MD5を取り上げるが、計算アルゴリズムそのものはSHA-1でも同様である。
図29はP_MD5の計算方法を示したものだ。任意長のシードとシークレットを与えると、必要な長さのP_MD5値を取り出すことができるようになっている。関数内部ではHMAC_MD5関数が多く用いられており、それを多段接続しながらビット列を拡張してゆくようになっている。
この図は上下に2分して見ると把握しやすいだろう。上半分の部分では、シードとシークレットをHMAC_MD5に与え、その結果を再びHMAC_MD5に与えることを繰り返すことで、ある種の乱数系列のようなものを作り出している。これは出力のビット長に一致するか、もしくは超えるまで繰り返す。
例えばHMAC_MD5の出力は16バイトである。それを使って48バイトのマスタシークレットを計算するには、この処理を3回繰り返せばよい(16バイト×3回=48バイト)。また、P_SHA-1の場合には、HMAC_SHA-1の出力が20バイトなので、3回繰り返して60バイトの値を作ることになる。ただし、48バイトを超える部分は、最終的に破棄される。
こうして得られたビット列は、図の下半分でシードと結合された後、シークレットとともに再びHMAC_SHA-1に加えられる。その出力結果を並べていったものがP_MD5の出力結果となるわけだ。なお、HMAC_SHA-1でマスタシークレットを計算した場合のように、必要なビット長より計算結果が長いときは、後続する不要なビットは破棄すればよい。
このようなP_hash関数は、特定のシークレットに基づいて、シードとして与えた情報のビット長を任意長に拡張することができる。PRF関数は、この特性を利用して、シークレット、ラベル、シードの3情報から、任意長のビット列を生成しているのである。
Pマスタシークレットとキーブロックの計算
では、もう少し詳しくマスタシークレットとキーブロックの算出方法を見ておこう。図30にその方法を示す。算出にPRFを使用することは、すでに述べたとおりだ。
マスタシークレットの場合、「シークレット」には図26に示したプリマスタシークレットを、「ラベル」には "master secret" の文字列を、また「シード」にはクライアントランダムにサーバランダムを結合したビット列を与える。このラベルの文字列には、長さ情報や文字列末の0x00を含んではならない。mからtまで、単語を構成する文字だけ13文字だけを与える必要がある。これ以降に登場するラベル文字もすべて同様だ。これらの情報をPRFに与えて、48バイト分出力したものがマスタシークレットとして使用される。
こうして生成したマスタシークレットは、さらにPRFの演算処理を経て、次にキーブロックが生成される。そのときは、「シークレット」はマスタシークレットが、「ラベル」には "key expansion" が、「シード」にはサーバランダムにクライアントランダムを結合したビット列が、それぞれ用いられる。
PRFが出力するキーブロックのサイズは、使用する暗号アルゴリズムの種類によって異なる。MAC書き込みシークレットは、MD5を使えば16バイト、SHA-1なら20バイト必要だ。暗号化キーはDESなら8バイト、3DESなら24バイトの情報を用意する。また、ブロック暗号をCBCモード(前ブロック情報も使用するモード)で利用する場合はブロックサイズの初期ベクタ(IV)を用意するが、そうでなければ初期ベクタは不要である。
暗号アルゴリズムに3DESをCBC_EDEモードで使用し、ハッシュ関数にSHA-1を使用する場合だと、MAC書き込みシークレットが20バイト×2個、暗号化キーが24バイト×2個、初期ベクタ(IV)が8バイト×2個となるので、少なくとも104バイト分の情報がキーブロックに必要である。
こうして生成したキーブロックの内容は、先頭からクライアントMAC書き込みシークレット、サーバMAC書き込みシークレットと、順次切り出していき、最終的にはコネクション内部情報の状態変数に設定されることになる。
輸出規制された暗号でのパラメータ生成
最近でこそ米国から日本に向けた暗号製品の輸出規制は緩やかになってきているが、もともと暗号技術は軍事技術の中でも機密度が極めて高いもので、米国外への持ち出しは厳しく制限されてきた。その方法としては、暗号アルゴリズムそのものの持ち出しを禁止するほかに、利用可能なキーの長さを制限し、暗号の強度を下げることが行われる。
こういったキー長が制約された輸出可能な暗号アルゴリズムを使用する場合、暗号化キーが暗号化処理に必要な長さに足りなくなってしまう。また表面上のキー長が短いと、攻撃されやすくもなる。それをカバーするため、前図に示したフローでパラメータ生成を行った後、さらに図31に示す追加的な処理が行われる。
例えば、前出のフローで得られた「クライアント書き込みキー」と「サーバ書き込みキー」は、再びPRF関数に与えられる。その結果として得られた「最終クライアント書き込みキー」「最終サーバ書き込みキー」が、実際の暗号化処理に使用される(図32)。
輸出可能な暗号の1つ、RC2_CBC_40と呼ばれるアルゴリズムの場合、キー長は5バイト(40ビット)しかない。しかし実際の暗号化処理では16バイト分のキーが必要なので、この後工程によって、5バイトのクライアント書き込みキーから、16バイトの最終クライアント書き込みキーが生成される。そして実際の暗号処理はそれを使って行われる。
この場合、元のキーが5バイトしかないわけだから、暗号の本質的な強さとしては、決して強いものにはならない。5バイト分の全空間探索は十分に実施できるので、破ろうと思えば力づくで破ることができる程度の強さだ。そのため、こういった暗号を使っていると、たとえSSL/TLSを使っているからといっても安心というわけではないのである。
ただ、このごろは日本に対する輸出規制は緩やかになってきており、本来の長さである16バイトのキーも利用可能になっている。そのため、こういったキー長が短いことに起因した危険性は薄れてきた。これは幸いなことである。
なお、最後になったが、輸出可能な暗号アルゴリズムでは、初期ベクタの生成に関しても、特別な処理が行われる。具体的にはマスタシークレットを使わずに、"IV Block" をラベルに用いて、PRFによってIVブロックを生成、そこから切り出して用いる。
次回はいよいよ最終回です。ここまでに得た知識をもとに、SSL/TLSのメッセージシーケンスを読み解いていきます。
Copyright © ITmedia, Inc. All Rights Reserved.