2

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

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

在欧洲央行模式下,我倾向于河豚。我知道ECB模式有问题,但我需要支持丢失的数据包,所以加密不能依赖以前的块。是否有更好的密码或模式可以用来减少ECB 模式的问题并仍然允许丢失数据包?

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

4

3 回答 3

2

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

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

于 2010-10-06T11:18:44.577 回答
1

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

顺便说一句,Blowfish 只是一个 64 位(块大小)的块密码,这在当今本质上赋予了它相当低的安全边际。

于 2010-10-06T10:48:07.267 回答
1

ECB 容易受到攻击,因为每个加密块都完全独立于其他所有加密块,这使得既可以通过注意到某些两个(或更多)加密块相同来推断密文的内容,又可以通过重新排列不可检测地更改消息密码块或从使用相同密钥加密的其他消息中替换密码块(这本身不是一个好主意)。

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

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

于 2010-10-07T14:39:39.410 回答