2010-10-06 81 views
1

我有一个通过UDP进行时间敏感通信的应用程序(如视频流或游戏)。数据包可能会丢失,并且不需要重新传输。加密UDP数据包的密码是什么?

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

我正在靠ECB模式的河豚。我知道ECB模式有问题,但我需要支持丢失的数据包,所以加密不能依赖于以前的块。 有没有更好的密码或模式,我可以用来减少issues with ECB mode,仍然允许丢失数据包?

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

+0

刚好与IV前缀的分组,并使用CBC模式或CTR模式CMAC。 – 2010-10-06 00:57:37

+0

我不相信我可以使用CBC或CTR模式,因为它们依赖于之前丢失的以前UDP数据包中的数据块的输出。 – 2010-10-06 01:18:41

回答

1

可以使用CBC模式,你只需要每一个数据包作为一个独立的CBC加密流。这意味着重新启动CBC每个数据包,一个新的IV。顺便说一句,Blowfish只是一个64位(块大小)的分组密码,这些天固有地给它一个相当低的安全边际。

2

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

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

1

由于每个加密块与其他所有加密块完全无关,所以ECB可以进行攻击,这使得可以通过注意到两个(或更多)密码块是相同的并且改变密文块的方式来推断密文的内容通过重新排列密码块或用其他使用相同密钥加密的消息代替密码块(这本身不是一个好主意),无法检测到消息。

如果您的UDP数据包包含一些序列信息,您可以使用它作为CTR模式下的计数器,或者您可以使用XEX(或XTS)模式。 XEX是为加密情况而开发的,其中数据加密可能必须按随机顺序进行,就像加密的随机访问设备(如硬盘驱动器)一样,并且对于诸如您的情况而言是理想选择。

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