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

Java 加密UDP数据包的密码是什么?,java,encryption,udp,aes,blowfish,Java,Encryption,Udp,Aes,Blowfish,我有一个通过UDP进行时间敏感通信的应用程序(如视频流或游戏)。数据包可能丢失,不需要重新传输 我应该使用什么密码来加密数据报 我倾向于欧洲央行模式下的河豚。我知道ECB模式有问题,但我需要支持丢失的数据包,因此加密不能依赖于以前的数据块是否有更好的密码或模式可用于减少丢失的数据包,并且仍然允许丢失数据包? (我想让一切都保持纯Java,所以我不能使用DTL。)您可以使用CBC模式,您只需要将每个数据包作为单独的CBC流进行加密。这意味着重新启动CBC的每个数据包,使用新的静脉注射 顺便说一句,

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

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

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

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

您可以使用CBC模式,您只需要将每个数据包作为单独的CBC流进行加密。这意味着重新启动CBC的每个数据包,使用新的静脉注射

顺便说一句,Blowfish只是一种64位(块大小)的分组密码,这使得它的安全性非常低。

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


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

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

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


请参见

仅在数据包前面加上IV,并在CMAC中使用CBC模式或CTR模式。我不相信我可以使用CBC或CTR模式,因为它们依赖于先前丢失的UDP数据包中的先前数据块的输出。您可以使用CBC模式。假设您要发送的每个UDP数据包是1300字节。该数据包将被发送或丢失。发送数据包之前,请使用AES-CBC对其进行加密。AES具有16字节的块大小,将把它转换为1312字节。在数据包前面加上您为该数据包生成的唯一的16字节IV,这意味着您发送的是一个1328字节的数据包,它不依赖于任何以前的数据包,也不依赖于任何将来的数据包。它的CBC,或者类似ECB,如果AES有1312字节的块大小。