跳到主要内容

4.1.2. AES in f8-mode (f8 模式下的 AES)

4.1.2. AES in f8-mode (f8 模式下的 AES)

为了加密 UMTS (Universal Mobile Telecommunications System, 通用移动通信系统, 即 3G 网络) 数据, 开发了一种称为 f8 算法的解决方案 (见 [f8-a] [f8-b])。在高层次上, 所提出的方案是输出反馈模式 (Output Feedback Mode, OFB) [HAC] 的一个变体, 具有更复杂的初始化和反馈函数。与正常的 OFB 一样, 核心由分组密码组成。我们还在这里定义了 AES 作为分组密码的使用, 用于我们称之为"f8 操作模式" RTP 加密。AES f8 模式应该使用与 AES 计数器模式相同的默认会话密钥和盐值大小。

图 4 显示了在 f8 模式下运行的分组密码 E 的结构。

                   IV
|
v
+------+
| |
+--->| E |
| +------+
| |
m -> (*) +-----------+-------------+-- ... ------+
| IV' | | | |
| | j=1 -> (*) j=2 -> (*) ... j=L-1 ->(*)
| | | | |
| | +-> (*) +-> (*) ... +-> (*)
| | | | | | | |
| v | v | v | v
| +------+ | +------+ | +------+ | +------+
k_e ---+--->| E | | | E | | | E | | | E |
| | | | | | | | | | |
+------+ | +------+ | +------+ | +------+
| | | | | | |
+------+ +--------+ +-- ... ----+ |
| | | |
v v v v
S(0) S(1) S(2) . . . S(L-1)

图 4. f8 操作模式 (星号 (*) 表示按位异或)。当使用 AES-f8 时, 该图表示图 3 中的 KG。

4.1.2.1. f8 密钥流生成

初始化向量 (Initialization Vector, IV) 应该按照第 4.1.2.2 节 (对于 SRTCP 则是第 4.1.2.3 节) 中的描述确定。

令 IV', S(j) 和 m 表示 n_b 位块。对于 N 位消息, 密钥流 S(0) ||... || S(L-1) 应该通过设置 IV' = E(k_e XOR m, IV) 和 S(-1) = 00..0 来定义。对于 j = 0,1,..,L-1, 其中 L = N/n_b (如果还不是整数则向上舍入到最接近的整数), 计算

S(j) = E(k_e, IV' XOR j XOR S(j-1))

请注意, IV 不是直接使用的。相反, 它在另一个密钥下通过 E 馈送, 以产生一个内部"掩蔽"值 (表示为 IV'), 以防止攻击者获得已知的输入/输出对。

内部计数器 j 的作用是防止短密钥流周期。密钥掩码 m 的值应该为

m = k_s || 0x555..5,

即, 会话盐化密钥, 后面附加二进制模式 0101.. 以填充整个所需的密钥大小 n_e。

发送方不应该生成超过 2^32 个块, 这足以生成 2^39 位的密钥流。与计数器模式不同, 没有绝对阈值, 超过 (低于) 该阈值可以保证 f8 是不安全的 (安全的)。选择上述界限是为了以足够的安全裕度限制 f8 密钥流生成中退化行为的概率。

4.1.2.2. f8 SRTP IV 形成

以下 IV 形成的目的是提供我们称之为隐式头部认证 (implicit header authentication, IHA) 的功能, 见第 9.5 节。

128 位块 AES-f8 的 SRTP IV 应该按以下方式形成:

IV = 0x00 || M || PT || SEQ || TS || SSRC || ROC

M, PT, SEQ, TS, SSRC 应该从 RTP 头部获取; ROC 来自密码上下文。

SSRC 作为 IV 的一部分的存在允许在同一 RTP 会话内的多个流之间共享主密钥时使用 AES-f8, 见第 9.1 节。

4.1.2.3. f8 SRTCP IV 形成

128 位块 AES-f8 的 SRTCP IV 应该按以下方式形成:

IV= 0..0 || E || SRTCP index || V || P || RC || PT || length || SSRC

其中 V, P, RC, PT, length, SSRC 应该从 RTCP 复合数据包中的第一个头部获取。E 和 SRTCP index 是添加到数据包的 1 位和 31 位字段。