4.3.1. Key Derivation Algorithm (鍵導出アルゴリズム)
4.3.1. Key Derivation Algorithm (鍵導出アルゴリズム)
採用される暗号化またはメッセージ認証変換に関係なく (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 鍵導出。
少なくとも 1 回の初期鍵導出が SRTP によって実行されなければなりません。つまり, 最初の鍵導出は必須です。暗号コンテキストの key_derivation_rate 値に従って, 鍵導出のさらなる適用が実行される場合があります。鍵導出関数は最初のパケットの前に最初に呼び出されなければならず, その後, r がゼロより大きい場合, index mod r がゼロに等しいときはいつでも鍵導出が実行されます。これはセッションキーの "リフレッシュ" と考えることができます。key_derivation_rate の値は, 関連するマスターキーの生涯にわたって固定されなければなりません。
相互運用可能な SRTP 実装は, 2 つの事前定義された変換で行われているように, 暗号化変換のセッションソルティングキーを導出することもできます。
m と n を正の整数とします。疑似ランダム関数ファミリーは, (秘密の) ランダムキー k に対して, m ビット x が与えられたとき, PRF_n(k,x) が n ビット文字列であり, ランダムな n ビット文字列と計算上区別できないキー付き関数 PRF_n(k,x) のセットです。[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 を参照) は, 鍵導出とは無関係です。