入力圧縮関数は、撹拌関数の呼び出し回数を減らすため、また前処理として大きな入力ブロックを内部状態サイズ以下に不可逆に縮めるために使われ、
可能な限り撹拌関数の対象となる内部状態サイズ=必要レジスタ数を小さくして、その分撹拌関数一回あたりの複雑性を高めることで安全性を担保しようとした。
一方スポンジ関数方式では、大きな内部状態=スポンジを用い、複雑な圧縮関数を不要にする。入力は単に、内部状態の一部(例えばKeccakでは1600bit中の1024bit)にXORするような方法で行われる。最後に出力圧縮関数を使う場合もあるが、keccakのように単純な切り出しで十分と考えられているようだ。
この場合、バッファサイズの大きさが増えるが、撹拌関数の複雑性・計算量を無理に増やす必要はないようだ。
非線形な圧縮関数を用いず、撹拌関数と内部状態の余裕分に安全性を担保してもらう形になる。
現在では、ASICや高速な一次キャッシュが十分安価になっているので、内部状態を小さくする利点よりも、高速かつ単純な撹拌関数を利用する利点の方が勝ったということと思われる。非線形性をワード内rotとワード置換のみで実現している点などが評価されたか。
またkeccakは5x5xWord長という可変サイズの内部状態に対してほぼ同じ関数を使える。(rijndaelからAESの256bitブロック固定のように最終的に64bitword固定で規格化されると思うけど。)
独立した暗号化と鍵精製関数を使うよりも、スポンジ関数にsalt+パスワード+padを入力し、残りは入力ブロックの替りにカウンタを入れて出力ブロックをCTRモード暗号として扱う、といった単純な実装で安全に利用できる可能性がある。SHA-3で規格化されることは無いだろうが、ハッシュと暗号化を統合できるかもしれない。
素人に思いつくのはせいぜい必要レジスタ数で実装コストが増えることくらいか。
構造が単純な分懐石も検証もしやすいかもしれない。一般に非線形置換・rotで十分安全と考えられているようなので、単純に性能を犠牲にラウンド数を増やされるかも、程度に思う。
撹拌関数のラウンド数の他、スポンジ関数の内部状態レジスタにどの程度余裕をもたせるか(一回に出し入れする入出力サイズと、手を加えない残り自由度。図のrとc)で性能が変わる。
余裕を減らしてブロックサイズを大きくすれば計算速度は早くなるが、衝突が発生しやすくなる。(内部状態を推定・制御しやすくなる)
http://keccak.noekeon.org/tune.html
ブロックを減らせば第二原像の算出可能性が下がるが、撹拌関数の呼び出しが増えるのでrに反比例して性能が下がる。


