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 实现也可以为加密变换派生会话盐值密钥, 就像在两个预定义变换中所做的那样。
设 m 和 n 为正整数。伪随机函数族是一组密钥函数 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_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 的额外格式化和填充, 例如参见第 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_s 和 n_a 来自加密上下文。
主密钥和主盐值必须是随机的, 但主盐值可以是公开的。
请注意, 对于 key_derivation_rate 为 0, 密钥派生的应用应恰好发生一次。
上述 DIV 的定义纯粹是为了符号方便。对于允许的密钥派生速率集中的非零 t, "a DIV t" 可以实现为向右移位 t 的以 2 为底的对数。如果选择速率为 256 的幂, 派生操作会进一步简化, 但这种粒度被认为过于粗糙而不能成为本规范的要求。
可以使用相同主密钥保护的数据包数量的上限 (参见第 9.2 节) 与密钥派生无关。