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構造に基づいており、2
256未満の長さのメッセージに対して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): F
28上で、各列と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、
TrueCrypt、
VeraCryptなどが挙げられます。
関連項目
タイムスタンプ
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