Whirlpool (ハッシュ関数)

Whirlpool ハッシュ関数



Whirlpool(WHIRLPOOLと表記されることもある)は、暗号学的ハッシュ関数の一種です。この関数は、AES(Advanced Encryption Standard)で採用されたブロック暗号であるRijndaelの設計者の一人、フィンセント・ライメンとパウロ・S・L・M・バレットによって2000年に設計されました。

Whirlpoolは、ヨーロッパのNESSIEプロジェクトで推奨ハッシュ関数の一つとして採用されたほか、国際標準化機構(ISO)および国際電気標準会議(IEC)によって、国際規格ISO/IEC 10118-3として標準化されています。

設計



Whirlpoolは、ブロック暗号Squareに続いて設計されたハッシュ関数です。Rijndaelを大幅に改変したMiyaguchi-Preneel構造に基づいており、2256未満の長さのメッセージに対して512ビットのハッシュ値を生成します。設計者によると、Whirlpoolは特許で保護されておらず、今後も保護される予定はありません。したがって、いかなる目的でも無料で利用できます。

バージョンの変遷



Whirlpoolには、現在3つのバージョンが存在します。

Whirlpool-0: 2000年に発表されたオリジナル版です。
Whirlpool-T: 2001年に改訂されたバージョンで、Sボックスがランダム生成から暗号学的に優れたものに変更され、ハードウェア実装が容易になりました。
Whirlpool: 2003年に再度改訂された最新版で、単に「Whirlpool」と区別されます。以前のバージョンで発見された脆弱性が修正され、ハードウェア実装も容易になりました。ISO/IEC 10118-3で標準化されているのもこの再改訂版です。

バージョン間の主な違いは、SボックスとMDSマトリックスの定数にあります。

内部構造



Whirlpoolハッシュ関数は、Miyaguchi-PreneelモードのRijndaelに類似したブロック暗号WをベースにしたMerkle-Damgård構造を採用しています。ブロック暗号Wは、8x8の状態マトリックスS(合計512ビット)を持ちます。暗号化プロセスは、4つのラウンド関数(SubBytes (SB)、ShiftColumns (SC)、MixRows (MR)、AddRoundKey (AK))による状態更新が10ラウンド繰り返されます。

1ラウンドの計算は以下のようになります。

S = AK ∘ MR ∘ SC ∘ SB (S)

ラウンド関数の詳細


SubBytes (SB): 状態の各バイトを、非線形置換(Sボックス)を使って独立に変換します。8ビットのSボックスは、3つの4ビットのSボックスから構成されています。
ShiftColumns (SC): 状態の各列に対して、循環シフトを実行します。列jの各バイトはjだけシフトされます。
MixRows (MR): F28上で、各列と8x8マトリックスの乗算を行います。8x8マトリックスは、差分解読法への耐性を高めるため、枝数が最大の9となるように選ばれています。
AddRoundKey (AK): XOR演算を使って、鍵スケジュールから計算された鍵を現在の状態に加えます。鍵スケジュールは、AddRoundKey関数がAddRoundConstant関数(ラウンドごとに決まった定数を加算)に置き換えられている点を除き、暗号化処理そのものと本質的に同じです。

ハッシュ値の例



以下に、異なる入力に対するWhirlpoolのハッシュ値の例を示します。

Whirlpool-0("The quick brown fox jumps over the lazy dog") =
4F8F5CB531E3D49A61CF417CD133792CCFA501FD8DA53EE368FED20E5FE0248C3A0B64F98A6533CEE1DA614C3A8DDEC791FF05FEE6D971D57C1348320F4EB42D

Whirlpool-T("The quick brown fox jumps over the lazy dog") =
3CCF8252D8BBB258460D9AA999C06EE38E67CB546CFFCF48E91F700F6FC7C183AC8CC3D3096DD30A35B01F4620A1E3A20D79CD5168544D9E1B7CDF49970E87F1

Whirlpool("The quick brown fox jumps over the lazy dog") =
B97DE512E91E3828B40D2B0FDCE9CEB3C4A71F9BEA8D88E75C4FA854DF36725FD2B52EB6544EDCACD6F8BEDDFEA403CB55AE31F03AD62A5EF54E42EE82C3FB35

入力メッセージのわずかな違いも、出力されるハッシュ値に大きな変化をもたらします。

例えば、"dog" を "eog" に変更した場合:

Whirlpool-0("The quick brown fox jumps over the lazy eog") =
228FBF76B2A93469D4B25929836A12B7D7F2A0803E43DABA0C7FC38BC11C8F2A9416BBCF8AB8392EB2AB7BCB565A64AC50C26179164B26084A253CAF2E012676

Whirlpool-T("The quick brown fox jumps over the lazy eog") =
C8C15D2A0E0DE6E6885E8A7D9B8A9139746DA299AD50158F5FA9EECDDEF744F91B8B83C617080D77CB4247B1E964C2959C507AB2DB0F1F3BF3E3B299CA00CAE3

Whirlpool("The quick brown fox jumps over the lazy eog") =
C27BA124205F72E6847F3E19834F925CC666D0974167AF915BB462420ED40CC50900D85A1F923219D832357750492D5C143011A76988344C2635E69D06F2D38C

空の入力に対するハッシュ値の例:

Whirlpool-0("") =
B3E1AB6EAF640A34F784593F2074416ACCD3B8E62C620175FCA0997B1BA2347339AA0D79E754C308209EA36811DFA40C1C32F1A2B9004725D987D3635165D3C8

Whirlpool-T("") =
470F0409ABAA446E49667D4EBE12A14387CEDBD10DD17B8243CAD550A089DC0FEEA7AA40F6C2AAAB71C6EBD076E43C7CFCA0AD32567897DCB5969861049A0F5A

Whirlpool("") =
19FA61D75522A4669B44E39C1D2E1726C530232130D407F89AFEE0964997F7A73E83BE698B288FEBCF88E3E03C4F0757EA8964E59B63D93708B138CC42A66EB3

実装



設計者によって、C言語およびJavaで書かれた参照実装がパブリックドメインで公開されています。

利用例



Whirlpoolが使用されている代表的なアプリケーションとしては、ディスク暗号化ソフトウェアのFreeOTFE、TrueCryptVeraCryptなどが挙げられます。

関連項目



タイムスタンプ
Hashcash

外部リンク



Whirlpool homepage (アルゴリズムの詳細、C/Java実装、論文などを含む)
Perl Whirlpool module at CPAN
Ruby Whirlpool library
ISO/IEC 10118-3 standard
* Test vectors for the Whirlpool hash from the NESSIE project

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。