加密UDP数据包的密码是什么?

时间:2010-10-06 00:53:54

标签: java encryption udp aes blowfish

我有一个通过UDP进行时间敏感通信的应用程序(如视频流或游戏)。数据包可能会丢失,无需重新传输。

我应该使用什么密码来加密数据报?

我倾向于在ECB模式下使用河豚。我知道ECB模式有问题,但我需要支持丢失的数据包,因此加密不能依赖于以前的块。 我可以使用更好的密码或模式来减少issues with ECB mode并仍允许丢失数据包吗?

(我想保留所有纯Java,所以我不能使用DTLS。)

3 个答案:

答案 0 :(得分:2)

计数器模式下的AES(CTR)是一种可行的选择。建立连接时,您将以发送和接收程序都知道的随机选择值启动计数器。如果每个视频数据包包含一个足够长的序列号( n ),不能在单个连接中重复,则接收程序可以将其添加到初始计数器值以获取用于的计数器的值。加密该数据包。

当然,对于超过一个块的消息,您需要在数据包中多次递增计数器。我将确定最长传输数据包的长度为多少块,例如16个块,并对数据包中的第一个块使用计数器值16*n,对于第二个块使用16*n+1,依此类推。 / p>

答案 1 :(得分:1)

可以使用CBC模式,你只需要将每个数据包加密为一个单独的CBC流。这意味着重新启动CBC每个数据包,并使用新的IV。

顺便说一下,Blowfish只是一个64位(块大小)的分组密码,这些日子本身就具有相当低的安全性。

答案 2 :(得分:1)

ECB是开放的攻击,因为每个加密块完全独立于所有其他块,这使得可以通过注意到两个(或更多)密码块是相同的并且改变消息来对密文的内容进行推断。通过重新排列密码块或用其他使用相同密钥加密的消息替换密码块(这本身不是一个好主意),这是不可能的。

如果您的UDP数据包包含某些序列信息,您可以在CTR模式下将其用作计数器,或者您可以使用XEX(或XTS)模式。 XEX是为加密情况开发的,其中数据加密可能必须以块的随机顺序执行,如加密随机访问设备(如硬盘驱动器)的情况,并且非常适合您的情况。

请参阅http://en.wikipedia.org/wiki/Disk_encryption_theory#XEX