4.1. Encryption (加密)
4.1. Encryption (加密)
以下参数对于本节中指定的两种预定义非 NULL 加密变换是通用的。
- BLOCK_CIPHER-MODE 表示所使用的分组密码及其操作模式
- n_b 是分组密码的分组比特大小
- k_e 是会话加密密钥
- n_e 是 k_e 的比特长度
- k_s 是会话盐化密钥 (session salting key)
- n_s 是 k_s 的比特长度
- SRTP_PREFIX_LENGTH 是密钥流前缀的八位字节长度, 一个非负整数, 由正在使用的消息认证码指定。
SRTP/SRTCP 的不同会话密钥和盐值默认按照第 4.3 节中的规定派生。
SRTP 中定义的加密变换将 SRTP 数据包索引和秘密密钥映射到伪随机密钥流段。每个密钥流段加密单个 RTP 数据包。加密数据包的过程包括生成与数据包对应的密钥流段, 然后将该密钥流段按位异或到 RTP 数据包的有效载荷上, 以产生 SRTP 数据包的加密部分。如果有效载荷大小不是 n_b 比特的整数倍, 则密钥流的多余 (最低有效) 比特将被简单地丢弃。解密以相同方式完成, 但交换明文和密文的角色。
+----+ +------------------+---------------------------------+
| KG |-->| Keystream Prefix | Keystream Suffix |---+
+----+ +------------------+---------------------------------+ |
|
+---------------------------------+ v
| Payload of RTP Packet |->(*)
+---------------------------------+ |
|
+---------------------------------+ |
| Encrypted Portion of SRTP Packet|<--+
+---------------------------------+
图 3: 默认 SRTP 加密处理。这里 KG 表示密钥流生成器, (*) 表示按位异或。
给定索引时如何生成密钥流的定义取决于密码及其操作模式。下面定义了两个这样的密钥流生成器。还定义了 NULL 密码, 用于不需要加密 RTP 的情况。
密钥流的 SRTP 定义如图 3 所示。每个密钥流段的初始八位字节可以保留用于消息认证码, 在这种情况下, 用于加密的密钥流在最后一个保留八位字节之后立即开始。初始保留的八位字节称为"密钥流前缀" (不要与 [RFC3550, 第 6.1 节] 的"加密前缀"混淆), 其余八位字节称为"密钥流后缀"。密钥流前缀绝对不能用于加密。该过程如图 3 所示。
密钥流前缀中的八位字节数表示为 SRTP_PREFIX_LENGTH。密钥流前缀由 SRTP_PREFIX_LENGTH 的正非零值表示。这意味着, 即使不提供机密性, 仍可能需要计算密钥流生成器输出用于数据包认证, 在这种情况下应该使用默认密钥流生成器 (模式)。
默认密码是高级加密标准 (Advanced Encryption Standard, AES) [AES], 我们定义了运行 AES 的两种模式, (1) 分段整数计数器模式 AES 和 (2) f8 模式 AES。在本节的其余部分, 令 E(k,x) 为应用于密钥 k 和输入块 x 的 AES。