暗号学的ハッシュ関数
暗号学的ハッシュ関数(以下では「暗号学的」を省略する)は他の暗号の構築に使える。それらが暗号学的に安全であるためには、正しく構築するよう注意が必要である。
メッセージ認証符号 (MAC) はハッシュ関数から構築することが多い。例えばHMACがある。
ブロック暗号を使ってハッシュ関数を構築できると同時に、ハッシュ関数を使ってブロック暗号が構築できる。Feistel構造で構築されたブロック暗号は、使用したハッシュ関数が安全である限り、その暗号自体も安全であるといえる。また多くのハッシュ関数(SHAなど)は専用のブロック暗号を使い Davis-Mayer などの構成法で構築されている。そのような暗号は、ブロック暗号として従来のモードでも使えるが、同程度のセキュリティは保証できない。
擬似乱数列生成器 (PRNG) を、ハッシュ関数を使って構築できるが、そのままでは通常の「一般の擬似乱数列生成器の出力を暗号学的ハッシュ関数を通すようにして安全にしたもの」のような安全性はない(過去の出力結果が十分にあれば、未来の結果が予測可能だから)。安全にするにはさらにハッシュ関数を通さなければならない。また、現代的な擬似乱数列生成器では通常、周期は確定的だが、ハッシュ関数を利用したPRNGの周期は、衝突の確率でしか推定できず、確定的ではない。
ストリーム暗号はハッシュ関数を使って構築できる。多くの場合、暗号論的擬似乱数生成器をまず構築し、それが生成するランダムなバイト列を鍵ストリームとして使用する。SEALというストリーム暗号は、SHA-1を使って内部の表を生成し、その表は鍵ストリーム生成に使われる。
この特性を利用して、ハッシュ関数に基づく単純な認証方式を破ることが可能である。HMACはこの問題への対策として考案された。
理想的には、さらに強い条件を課すこともできる。例えば、悪意ある者が非常によく似たダイジェストを生成する2つのメッセージを見つけることができないのが望ましい。また、ダイジェストだけから元のデータについて何らかの有用な情報を推測できないのが望ましい。これはある意味で、暗号学的ハッシュ関数は疑似乱数列を生成する関数(特に、暗号論的擬似乱数生成器)の関数に似ているといえる。しかし、決定性と計算効率は維持しなければならず、疑似乱数列生成系においては通常必要とされる最長周期の保証といった特性は、暗号学的ハッシュ関数にはない。
単純なチェックサムはもとより、巡回冗長検査 (CRC) などの誤り検出符号も、上で説明したような攻撃への耐性はなく、暗号的な目的には不適である。例えば、CRCがWEPでのデータ完全性保証に使われていたので、チェックサムの線形性を利用した攻撃が可能となった。