2013-07-20 80 views
1

我使用Speex語音庫編碼在P2P語音聊天應用程序/解碼字節組最有效的方式。 我一直在使用AES加密,但由於加密和解密的嘗試,我的UI線程掛斷。我將嘗試用僞代碼編寫問題。Android的加密/解密連續UDP(語音數據包)數據

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) 

}

我想知道內情的最佳可能的方式來encrpyt /解密連續數據流。

回答

3

來加密/解密數據的連續流使用流密碼或流密碼方式的塊密碼(等待它)的最佳方法。

與操作的塊加密模式(例如CBC或 - 不安全 - ECB模式)的問題是,它們需要用於每個加密/解密操作數據的完整塊。這意味着您必須一次爲AES提供16個字節。這很容易導致您遇到阻塞問題。

現在,如果你會使用AES counter mode加密,那麼你有幾個優點:

  • 可以預先計算「密鑰流」,這應有助於防治與延遲問題(AKA滯後)
  • 可以只需對每個字節進行解密即可
  • 將流轉換爲GCM mode經過身份驗證的加密(驗證加密與保密通信必須一樣好)
  • 您可能可以使用如果您遇到性能問題,您還可以看看專門的流密碼,如流行的Salsa20流密碼的多線程CTR實現加快加密/解密

。流密碼通常專爲高效率/高帶寬通信而生成。

[編輯]

注意TLS也被定義爲在UDP包工作。如果您不確定實施自己的傳輸協議,那麼使用標準化選項會更好。請注意,您可能找不到支持運行時開箱即用的庫。維基百科

引用:

然而,它也被實施與面向數據報的傳輸 協議,諸如用戶數據報協議(UDP)和數據報 擁塞控制協議(DCCP),使用已單獨使用術語數據報傳輸層安全(​​)標準化 。

+0

但它會用於加密/解密來自UDP數據包的數據。有些數據包也丟失了...... – SoH

+0

@SoH肯定 - 只要你有[nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)(在許多加密庫中稱爲IV),你可以保持雙方同步 –