跳到主要内容

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。