跳到主要内容

3.3. SRTP Packet Processing (SRTP 数据包处理)

3.3. SRTP Packet Processing (SRTP 数据包处理)

以下内容适用于 SRTP。SRTCP 在 Section 3.4 中描述。

假设加密上下文的初始化已通过密钥管理完成, 发送方应当执行以下操作来构造 SRTP 数据包:

  1. 按照 Section 3.2.3 中的描述确定要使用哪个加密上下文。

  2. 使用翻转计数器 (rollover counter), 加密上下文中的最高序列号 (highest sequence number), 以及 RTP 数据包中的序列号, 按照 Section 3.3.1 中的描述确定 SRTP 数据包的索引 (index)。

  3. 确定主密钥 (master key) 和主盐值 (master salt)。这是使用前一步骤中确定的索引或加密上下文中的当前 MKI 完成的, 根据 Section 8.1。

  4. 按照 Section 4.3 中的描述确定会话密钥 (session keys) 和会话盐值 (session salt) (如果转换使用它们), 使用加密上下文中的主密钥、主盐值、key_derivation_rate 和会话密钥长度以及在步骤 2 和 3 中确定的索引。

  5. 加密 RTP 负载以生成数据包的加密部分 (Encrypted Portion) (参见 Section 4.1 中定义的密码)。此步骤使用加密上下文中指示的加密算法、步骤 4 中找到的会话加密密钥和会话盐值 (如果使用) 以及步骤 2 中找到的索引。

  6. 如果 MKI 指示符设置为 1, 则将 MKI 附加到数据包。

  7. 对于消息认证 (message authentication), 按照 Section 4.2 中的描述计算数据包认证部分 (Authenticated Portion) 的认证标签 (authentication tag)。此步骤使用当前翻转计数器、加密上下文中指示的认证算法以及步骤 4 中找到的会话认证密钥。将认证标签附加到数据包。

  8. 如有必要, 使用步骤 2 中确定的数据包索引, 按照 Section 3.3.1 更新 ROC。

要认证和解密 SRTP 数据包, 接收方应当执行以下操作:

  1. 按照 Section 3.2.3 中的描述确定要使用哪个加密上下文。

  2. 运行 Section 3.3.1 中的算法以获取 SRTP 数据包的索引。该算法使用加密上下文中的翻转计数器和最高序列号以及 SRTP 数据包中的序列号, 如 Section 3.3.1 中所述。

  3. 确定主密钥和主盐值。如果上下文中的 MKI 指示符设置为 1, 则使用 SRTP 数据包中的 MKI, 否则使用前一步骤的索引, 根据 Section 8.1。

  4. 按照 Section 4.3 中的描述确定会话密钥和会话盐值 (如果转换使用), 使用加密上下文中的主密钥、主盐值、key_derivation_rate 和会话密钥长度以及在步骤 2 和 3 中确定的索引。

  5. 对于消息认证和重放保护 (replay protection), 首先使用重放列表 (Replay List) 和步骤 2 中确定的索引检查数据包是否已被重放 (Section 3.3.2)。如果判断数据包已被重放, 则必须丢弃该数据包, 并且应当记录该事件。

    接下来, 使用步骤 2 中的翻转计数器、加密上下文中指示的认证算法以及步骤 4 中的会话认证密钥执行认证标签的验证。如果结果为 "AUTHENTICATION FAILURE" (认证失败) (参见 Section 4.2), 则必须丢弃该数据包而不进行进一步处理, 并且应当记录该事件。

  6. 使用加密上下文中指示的解密算法、步骤 4 中找到的会话加密密钥和盐值 (如果使用) 以及步骤 2 中的索引, 解密数据包的加密部分 (参见 Section 4.1 中定义的密码)。

  7. 使用步骤 2 中估计的数据包索引, 按照 Section 3.3.1 更新加密上下文中的翻转计数器和最高序列号 s_l。如果提供了重放保护, 还要按照 Section 3.3.2 中的描述更新重放列表。

  8. 如果存在, 从数据包中移除 MKI 和认证标签字段。