Whirlpool (ハッシュ関数)

**Whirlpool**（すべて大文字で**WHIRLPOOL**と綴られることもある）は、暗号学的ハッシュ関数の一つである。AESに採用されたブロック暗号であるRijndaelの設計者の一人であるフィンセント・ライメンと、Paulo S. L. M. Barretoによって2000年に設計された。WhirlpoolはヨーロッパのNESSIEプロジェクトにおいて推奨ハッシュ関数の一つに採用された他、国際標準化機構 (ISO) および国際電気標準会議 (IEC) によって国際規格ISO/IEC 10118-3として標準化されている。

## 設計

Whirlpoolは、ブロック暗号であるSquareに続いて設計されたハッシュ関数である。Whirlpoolは、かなり改変されたRijndaelに基づく:en:Miyaguchi-Preneel構造を有している。2256 (≒ 1.158 × 1077) 未満の長さのメッセージに対して512ビットのハッシュを返す

設計者によれば、Whirlpoolは特許でカバーされておらず、将来カバーされることもない。いかなる目的においても無料で利用できる。

### バージョンの変遷
現在Whirlpoolには3つのバージョンが存在する。オリジナルのWhirlpoolは **Whirlpool-0**、最初の改訂版は **Whirlpool-T**、最新版は2003年の再改訂版で単に **Whirlpool** と区別される。ほとんどの場合は、再改訂版が用いられる。この版ではそれ以前の版で発見された脆弱性が修正されており、ハードウェア実装も容易である。ISO/IEC 10118-3で標準化されているのもこの再改訂版である。

これらの違いは以下の通りである。

; Whirlpool-0
: 2000年のオリジナル。
; Whirlpool-T
: 2001年の改訂版。Sボックスが、ランダムに生成されるものから暗号学的により良いものに変更され、ハードウェアでの実装が容易となった。
; Whirlpool
: 2003年の再改訂版。アルゴリズムのセキュリティを低下させるの欠陥が発見された。8x8のローテートマトリックス定数を (1, 1, 3, 1, 5, 8, 9, 5) から (1, 1, 4, 1, 8, 5, 2, 9) に変更することで問題を解決した。

## 内部構造
Whirlpoolハッシュ関数は、:en:Miyaguchi-PreneelモードのRijndaelに類似のブロック暗号 W に基づくMerkle-Damgård constructionである。ブロック暗号 W は、8×8の状態マトリックス S を持ち、総計512ビットとなる。暗号化プロセスは、4つのラウンド関数によって状態が更新され、それが10ラウンドから構成される。4つのラウンド関数は、SubBytes (SB)、ShiftColumns (SC)、MixRows (MR)、AddRoundKey (AK)である。1ラウンドでの計算は以下の通りとなる。

S=AK \circ MR \circ SC \circ SB(S) .

; SubBytes
: **SubBytes**操作は状態の各バイトを独立に非線形置換（Sボックス）を行う。8ビットのSボックスは、3つの4ビットのSボックスから成る。
; ShiftColumns
: 状態の各カラムの循環シフトを行う。カラム *j* の各バイトは *j* だけシフトされる。
; MixRows
: \mathbb{F}_{2^8} 上で、各列と8×8マトリックスの乗算を行う。8×8マトリックスは枝数が最大の9となるよう選ばれる（差分解読法への耐性）。
; AddRoundKey
: XORビット演算にて現在の状態に鍵スケジュールから計算された鍵を加える。鍵スケジュールは、AddRoundKey関数がAddRoundConstant関数（ラウンドごとに決められた定数を加える）に置き換えられている点以外は暗号化そのものと本質的に同じである。

## ハッシュ値の例
 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

入力メッセージのわずかな違いも、出力されるハッシュ値に大きな変化を及ぼす。例えば、 "**d**og" を "**e**og" とした場合：
 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やTrueCrypt、VeraCryptが挙げられる。

## 関連項目
* タイムスタンプ
* Hashcash

## 脚注

## 外部リンク
* Whirlpool homepage Includes detailed algorithm information, C and Java implementations, the paper, etc.
* Perl Whirlpool module at CPAN
* Ruby Whirlpool library
* The ISO/IEC 10118-3 standard
* Test vectors for the Whirlpool hash from the NESSIE project