Sponge function
thumb | upright = 1.35 | right | alt =スポンジ構造のイラスト|ハッシュ関数のスポンジ構造。 p&lt; sub&gt;&lt; sub&gt;は入力ストリングのブロックであり、z i </ sub>は入力ストリングのブロックである。ハッシュされた出力ブロックです。 暗号において、スポンジ関数 スポンジ構築 'は有限[[状態(コンピュータ科学)|内部状態]を持つアルゴリズムのクラスです。任意の長さの入力ビットストリームを取り、任意の所望の長さの出力ビットストリームを生成する。スポンジ機能は、理論的にも実用的にも使用できます。それらは、暗号化ハッシュ、メッセージ認証コード、マスク生成関数、ストリーム暗号などを含む多くの暗号プリミティブをモデル化または実装するために使用できます、疑似乱数発生器、認証された暗号化。
構成[編集]
スポンジ機能は3つのコンポーネントで構成されています。
- "b"ビットを含む状態メモリ、 "S"、および "
- 固定長の関数 " 'は、状態メモリを置換または変換する
- パディング関数 P
状態メモリは、サイズ "r"(ビットレート)とサイズ "c"(容量)の2つのセクションに分かれています。これらのセクションは、それぞれ「R」および「C」と表示されています。
padding関数は、入力文字列に十分なビットを追加して、padded入力の長さがビットレート "r"の倍数になるようにします。したがって、padded入力を "r"ビットブロックに分割することができます。
操作[編集]
スポンジ機能は次のように動作します。
- 状態 "S"はゼロに初期化されます
- 入力文字列にはパディングがあります。これは、入力pがパディング関数Pを用いて「r」ビットのブロックに変換されることを意味する。
- Rはパディングされた入力の最初の r ビットブロックとXORされます
- Sは "f"(S)に置き換えられます。
- Rは、次の r ' - パディングされた入力のビットブロック(存在する場合)とXORされます。
- Sは "f"(S)に置き換えられます。
- ...
パッディングされた入力文字列のすべてのブロックが使い尽くされるまで([スポンジ(マテリアル)|スポンジ]メタファーで吸収されるまで)、プロセスが繰り返されます。
これでスポンジ機能の出力は次のように生成されます(「スクイーズアウト」)。
- 状態メモリのR部分は出力の最初の「r」ビットです
- より多くの出力ビットが必要な場合、Sは "f"(S)に置き換えられます。
- 状態メモリのR部分は出力の次の「r」ビットです
- ...
このプロセスは、所望の数の出力ビットが生成されるまで繰り返される。出力の長さが r ビットの倍数でない場合は、切り捨てられます。
もう1つのメタファーは、入力メモリがプールに注ぎ込まれ、変換関数が「エントロピープールを攪拌する」と呼ばれる状態メモリを "エントロピープール"として記述します。
入力ビットは決して状態メモリのC部分にXORされず、Cのビットも直接出力されないことに注意してください。ハッシュ・アプリケーションでは、 collisionまたはpreimage attackに対する耐性はCに依存し、その値はCに依存します。 「容量」「c」は、典型的には所望の抵抗レベルの2倍である。
デュプレックス構成[編集]
交互に吸収し、絞ることも可能である。この操作は、二重化構成または二重化と呼ばれます。これは、シングルパスで認証された暗号化システムの基礎となることができます。
- 状態 "S"はゼロに初期化されます
- Rは入力の最初の r ビットブロックとXORされます
- Sは "f"(S)に置き換えられます。
- Rは出力の最初の「r」ビットになりました。
- Rは次の r - 入力のビットブロックとXORされます
- Sは "f"(S)に置き換えられます。
- Rは出力の次の「r」ビットになりました。
- ...
上書きモード[編集]
選択した[セキュリティレベル]を維持しながら、吸収中のxor演算を省略することは可能です。
スポンジ構造はまた、実用的な暗号プリミティブを構築するために使用することができる。たとえばKeccakは1600ビットの状態の暗号スポンジです。 SHA-3大会の勝者としてNISTによって選ばれました。 Keccakの強みは、著者が開発した複雑で多元的なパーミュテーション "f"に由来しています。 [[Spritz(cipher)| Spritz]と呼ばれるRC4 - 再設計とは、アルゴリズムを定義するスポンジ構造を指します。
別の例として、スポンジ機能を使用して関連するデータ(AEAD)で認証された暗号化を構築することができます。&lt; ref name = "Rivest2014" /&gt;