Android最有效的加密/解密连续UDP(语音数据包)数据的方法

时间:2013-07-20 07:12:34

标签: android encryption udp voip

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

OnPlayer Side:

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)

}

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

1 个答案:

答案 0 :(得分:3)

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

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

现在,如果你使用AES counter mode加密,那么你有几个好处:

  • 您可以预先计算“密钥流”,这有助于解决延迟问题(AKA滞后)
  • 您可以简单地解密每个字节
  • 将流转换为GCM mode经过身份验证的加密相对容易(经过身份验证的加密与保密通信必须一样好)
  • 您可以使用多线程CTR实施来加速加密/解密

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

[编辑]

请注意,TLS也已定义为适用于UDP包。如果您不确定是否实现自己的传输协议,那么使用标准化选项会更好。请注意,您可能找不到支持运行时开箱即用的库。

来自维基百科的引用:

  

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