跳到主要内容

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 密钥派生。

SRTP 必须至少执行一次初始密钥派生, 即, 第一次密钥派生是必需的。可以根据加密上下文中的 key_derivation_rate 值执行密钥派生的进一步应用。密钥派生函数应在第一个数据包之前初始调用, 然后, 当 r 大于零时, 每当 index mod r 等于零时执行密钥派生。这可以被认为是 "刷新" 会话密钥。key_derivation_rate 的值对于关联主密钥的生命周期必须保持固定。

可互操作的 SRTP 实现也可以为加密变换派生会话盐值密钥, 就像在两个预定义变换中所做的那样。

mn 为正整数。伪随机函数族是一组密钥函数 PRF_n(k,x), 使得对于 (秘密) 随机密钥 k, 给定 m 位 x, PRF_n(k,x) 是一个 n 位字符串, 在计算上与随机 n 位字符串无法区分, 参见 [HAC]。对于 SRTP 中的密钥派生目的, 必须使用具有 m = 128 (或更多) 的安全 PRF, 并且在第 4.3.3 节中定义了默认 PRF 变换。

设 "a DIV t" 表示 a 除以 t 的整数除法, 向下舍入, 并且约定对于所有 a, "a DIV 0 = 0"。我们还约定将 "a DIV t" 视为与 a 相同长度的位串, 因此 "a DIV t" 通常会有前导零。

密钥派生应按如下方式定义, 根据 <label>, 一个 8 位常量 (见下文), master_saltkey_derivation_rate, 如加密上下文中所确定, 以及 index, 数据包索引 (即, SRTP 的 48 位 ROC || SEQ):

  • r = index DIV key_derivation_rate (DIV 如上所定义)。

  • key_id = &lt;label&gt; || r

  • x = key_id XOR master_salt, 其中 key_idmaster_salt 对齐, 使其最低有效位一致 (右对齐)。

<label> 对于要派生的每种类型的密钥必须是唯一的。我们目前定义 <label> 0x00 到 0x05 (见下文), 未来的扩展可以为其他目的在 0x06 到 0xff 范围内指定新值。然后此数据包的 n 位 SRTP 密钥 (或盐值) 应从主密钥 k_master 派生如下:

      PRF_n(k_master, x).

(PRF 可能在内部指定 x 的额外格式化和填充, 例如参见第 4.3.3 节的默认 PRF。)

会话密钥和盐值现在应使用以下方法派生:

  • 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_sn_a 来自加密上下文。

主密钥和主盐值必须是随机的, 但主盐值可以是公开的。

请注意, 对于 key_derivation_rate 为 0, 密钥派生的应用应恰好发生一次。

上述 DIV 的定义纯粹是为了符号方便。对于允许的密钥派生速率集中的非零 t, "a DIV t" 可以实现为向右移位 t 的以 2 为底的对数。如果选择速率为 256 的幂, 派生操作会进一步简化, 但这种粒度被认为过于粗糙而不能成为本规范的要求。

可以使用相同主密钥保护的数据包数量的上限 (参见第 9.2 节) 与密钥派生无关。