PRFという用語は IKE(Internet Key Exchange) プロトコルのドキュメントで言及されています。
PRFとは何ですか?
PRFとハッシュ関数の違いは何ですか?
IKEプロトコルではどのPRFが使用されますか?
PRFは PseudoRandom Function の略です。 PRFは、ランダム性とPRFの内部を知らない(そして、PRFをまだ見たことがない)攻撃者とを区別できないように見える決定論的な方法で入力に出力をマッピングします(同じ入力は常に同じPRFの同じ出力にマッピングされます)。 PRFが多くの類似した入力を処理するのを見たとしても、まったく同じ入力を処理します)。
通常、PRFはPRFファミリからランダムに取得されます。 PRFファミリーは、特定のPRF(入力を出力にマップする)を選択する追加の入力(ランダムシード、ランダムキーとも呼ばれる)をとる関数と考えることができます。したがって、PRFファミリに128ビットのシードがある場合、そのファミリから使用できる2 ^ 128(340,282,366,920,938,463,463,374,607,431,768,211,456)の可能なPRFがあります。これは、一般的に使用される数十のハッシュ関数(MD5、SHA-1、SHA-256、SHA-512など)しかないハッシュ関数とは対照的です。
_"Hello"
_が_8b1a9953c4611296a827abf8c47804d7
_(16進数)にマップされていることを知っているとしましょう。攻撃者は、私がMD5を使用していることをすぐに理解し、必要な入力に対して出力を生成することができます。
ただし、HMAC-ハッシュベースのMACはPRFのファミリーです。したがって、 HMAC構造 :H(K1 ++ H(K2 ++ m))
を取る場合、_++
_は連結を意味し、H
は通常のハッシュ関数であり、_K1
_および_K2
_は、_K1 = K XOR 0x5c5c...5c
_および_K2 = K XOR 0x3636...36
_を使用して同じキーから派生するように定義されている2つのキーです。ここで、私のPRF(特定のキーKを使用するHMAC)が_"Hello"
_を_53a7e60d93a6853780d622f3b5bd641f
_にマップすると言った場合、攻撃者(Kを知らないが、私は知っているかもしれません)のための方法はありません。 m HMAC-MD5を使用して)、これまでに見たことのない入力の出力を生成します。
IKEプロトコルで使用される実際のPRFは、クライアントとサーバー間でネゴシエートされます。 IKEv2のRFC で指定されているのは、HMAC_MD5、HMAC_SHA1、HMAC_TIGER(異なるハッシュ関数から生成された3つのHMAC)、および AES128_XCBC です。元のIKE RFCでは、使用するPRFは定義されていませんでした: "現在、定義されている疑似ランダム関数はありません。" 。
PRFとPRFファミリの違いは、多くの場合明示的には行われないことに注意してください。文献では、しばしば2つの入力(キー、プレーンテキスト)を生成し、1つの入力を生成します。
暗号化では、関連する2つの概念、PRP(PseudoRandom Permutation)とPRG(PseudoRandom Generator)が登場します。
疑似ランダム順列(PRP)は、1対1のPRFです。これは、特定のタイプのPRFであり、PRFの各出力(同じキー)は、1つの入力からのみ生成できます。これにより、機能を反転させ、そのアプリケーションのアプリケーションの効果を元に戻すことができます。つまり、PRP(秘密鍵の知識が必要)を平文に適用して暗号文を作成し、次にPRPの逆を適用できます。暗号文(秘密鍵を使用)を解読します。たとえば、AES-128のようなブロック暗号はPRPです。これは、128ビットの鍵と128ビットの入力のブロックを受け取り、プレーンテキストブロックを一意の128ビットの暗号テキストブロックにマップします。次に、これらの操作を逆にして、暗号文ブロックを元の平文ブロックにマッピングできます(その秘密鍵でAES-128の逆を使用)。
疑似ランダムジェネレーター(PRG)は、初期シード(ランダムキーなど)に基づいてランダムに見えるビットのストリームを放出する関数です。このビットストリームを長い平文メッセージとXORして暗号化し(暗号文がランダムに見える)、PRGのビットストリームと暗号文をXORすることで復号化できます。 PRGを生成する1つの方法は、AES-128のようなブロック暗号を取得し、それをCTRモードで使用することです。つまり、同じキーを使用して1ずつインクリメントされた連続するブロックを暗号化してから、出力を連結します。たとえば、PRG(K) = AES(K, 0) ++ AES(K, 1) ++ AES(K, 2) ++ AES(K, 3) ++ ...
(_++
_は連結を意味します)。