2

我正在使用 Speex 库在 p2p 语音聊天应用程序中编码/解码字节数组。我曾尝试使用 AES 加密,但由于加密和解密,我的 UI 线程挂起。我将尝试用伪代码编写问题。

OnPlayer 端:

while(keep_on_running) {
socket.receive(packet); 
encodedFrame = AESEncrytion.decrypt(encodedFrame);
Speex.decode(encodedFrame, encodedFrame.length, pcmFrame);

}

在记录器方面:

while(keep_on_running) {
Speex.encode(pcmFrame, encodedFrame);       
AESEncrytion.encrypt(encodedFrame);
socket.send(packet)

}

我想知道加密/解密连续数据流的最佳方法。

4

1 回答 1

4

加密/解密连续数据流的最佳方法是(等待它)在流密码模式下使用流密码或分组密码。

分组密码操作模式(例如 CBC 或 - 不安全 - ECB 模式)的问题在于,它们需要完整的数据块用于每个加密/解密操作。这意味着您必须一次为 AES 提供 16 个字节。这很容易导致您遇到的阻塞问题。

现在,如果您使用AES 计数器模式加密,那么您有几个优点:

  • 您可以预先计算“密钥流”,这应该有助于解决延迟问题(AKA 滞后)
  • 您可以简单地解密每个字节
  • 将流转换为GCM 模式认证加密相对容易(认证加密与机密通信一样好)
  • 您也许可以使用多线程 CTR 实现来加速加密/解密

如果您遇到性能问题,您还可以查看专门的流密码,例如流行的Salsa20流密码。流密码通常是专门为高效率/高带宽通信而生成的。

[编辑]

请注意,TLS也被定义为在 UDP 包上工作。如果您不确定是否要实现自己的传输协议,最好使用标准化选项。请注意,您可能无法在运行时找到开箱即用的支持此功能的库。

引用自维基百科:

但是,它也已通过面向数据报的传输协议实现,例如用户数据报协议 (UDP) 和数据报拥塞控制协议 (DCCP),使用术语数据报传输层安全性 ( DTLS ) 已独立标准化。

于 2013-07-20T11:16:14.137 回答