4.3. Key Derivation (鍵導出)
4.3. Key Derivation (鍵導出)
使用される暗号化またはメッセージ認証変換 (SRTP 事前定義変換またはセクション 6 に従って新しく導入されたもの) に関係なく, 相互運用可能な SRTP 実装はセッション鍵を生成するために SRTP 鍵導出を使用しなければなりません。鍵導出レートがセッションの開始時に適切にシグナリングされると, SRTP 鍵導出を使用する当事者間での追加の通信は不要です。
packet index ---+
|
v
+-----------+ master +--------+ session encr_key
| ext | key | |---------->
| key mgmt |-------->| key | session auth_key
| (optional | | deriv |---------->
| rekey) |-------->| | session salt_key
| | master | |---------->
+-----------+ salt +--------+
図 5: SRTP 鍵導出。
SRTP によって少なくとも 1 つの初期鍵導出が実行されなければなりません。つまり, 最初の鍵導出は必須です。暗号コンテキストの "key_derivation_rate" 値に従って, 鍵導出のさらなる適用が実行される場合があります。鍵導出関数は最初のパケットの前に最初に呼び出されなければならず, その後, r > 0 の場合, index mod r がゼロに等しいときはいつでも鍵導出が実行されます。これはセッション鍵を "リフレッシュ" すると考えることができます。"key_derivation_rate" の値は, 関連するマスター鍵のライフタイム中固定されたままでなければなりません。
相互運用可能な SRTP 実装は, 両方の事前定義変換で行われているように, 暗号化変換のためのセッションソルト鍵も導出する場合があります。
m と n を正の整数とします。疑似ランダム関数ファミリは, 鍵付き関数の集合 {PRF_n(k,x)} であり, (秘密の) ランダム鍵 k に対して, m ビットの x が与えられたとき, PRF_n(k,x) は n ビット文字列であり, ランダム n ビット文字列と計算上区別できません ([HAC] を参照)。SRTP における鍵導出の目的のため, m = 128 (またはそれ以上) の安全な PRF を使用しなければならず, デフォルトの PRF 変換はセクション 4.3.3 で定義されています。
"a DIV t" を, a を t で割った整数除算 (切り捨て) を表すものとし, すべての a に対して "a DIV 0 = 0" という規則を持つものとします。また, "a DIV t" を a と同じ長さのビット文字列として扱う規則を採用するため, "a DIV t" は一般に先頭にゼロを持つことになります。
鍵導出は, <label> (8 ビット定数, 以下を参照), master_salt および key_derivation_rate (暗号コンテキストで決定される), および index (パケットインデックス, つまり SRTP の 48 ビット ROC || SEQ) に関して, 次のように定義されなければなりません:
-
r = index DIV key_derivation_rate とします (上記で定義された DIV を使用)。
-
key_id = <label> || r とします。
-
x = key_id XOR master_salt とします。ここで, key_id と master_salt は最下位ビットが一致するように整列されます (右揃え)。
導出される各タイプの鍵に対して, <label> は一意でなければなりません。現在, <label> 0x00 から 0x05 を定義しています (以下を参照)。将来の拡張では, 他の目的のために範囲 0x06 から 0xff の新しい値を指定する場合があります。このパケットの n ビット SRTP 鍵 (またはソルト) は, マスター鍵 k_master から次のように導出されなければなりません:
PRF_n(k_master, x).
(PRF は内部的に x の追加のフォーマットとパディングを指定する場合があります。例えば, デフォルト PRF についてはセクション 4.3.3 を参照してください。)
セッション鍵とソルトは次を使用して導出されなければなりません:
-
k_e (SRTP 暗号化): <label> = 0x00, n = n_e。
-
k_a (SRTP メッセージ認証): <label> = 0x01, n = n_a。
-
k_s (SRTP ソルト鍵): <label> = 0x02, n = n_s。
ここで, n_e, n_s, および n_a は暗号コンテキストからのものです。
マスター鍵とマスターソルトはランダムでなければなりませんが, マスターソルトは公開されても構いません。
key_derivation_rate が 0 の場合, 鍵導出の適用は正確に 1 回行われなければならないことに注意してください。
上記の DIV の定義は, 純粋に表記の便宜のためです。許可された鍵導出レートのセットの中の非ゼロ t に対して, "a DIV t" は t の底 2 の対数による右シフトとして実装できます。レートが 256 の累乗として選択された場合, 導出操作はさらに容易になりますが, その粒度はこの仕様の要件として粗すぎると考えられました。
同じマスター鍵を使用して保護できるパケット数の上限 (セクション 9.2 を参照) は, 鍵導出とは独立しています。