Java 用于蓝牙通信的轻量级对称密钥算法?
在我的应用程序中,我使用AES算法进行WLAN通信,但现在我通过蓝牙传输数据,我希望获得一些安全性。问题是AES太重了,因为它给了我超过100字节的块——当我传输少于10字节时——如果可能的话,我想使用更轻的块Java 用于蓝牙通信的轻量级对称密钥算法?,java,android,algorithm,security,Java,Android,Algorithm,Security,在我的应用程序中,我使用AES算法进行WLAN通信,但现在我通过蓝牙传输数据,我希望获得一些安全性。问题是AES太重了,因为它给了我超过100字节的块——当我传输少于10字节时——如果可能的话,我想使用更轻的块 有人知道更好的解决方案吗?将AES与128位块一起使用。这是16个字节。初始化加密如下所示: //Generate a key KeyGenerator KeyGen = KeyGenerator.getInstance("AES"); KeyGen.init(128); SecretK
有人知道更好的解决方案吗?将AES与128位块一起使用。这是16个字节。初始化加密如下所示:
//Generate a key
KeyGenerator KeyGen = KeyGenerator.getInstance("AES");
KeyGen.init(128);
SecretKey Key = KeyGen.generateKey();
//Generate init vector
SecureRandom rng = SecureRandom.getInstance("SHA1PRNG");
byte [] IV = new byte[16];
rng.nextBytes(IV);
//Initialize the encryptor
Cipher ci = Cipher.getInstance("AES/CBC/NoPadding"); //The spec might be different!
ci.init(Cipher.ENCRYPT_MODE, Key, new IvParameterSpec(IV));
RC4具有已知的弱点。CBC中的AES本身仅将pads添加到16字节块,这相当于每条消息平均8字节。如何获得>100字节?并且在CTR模式下使用AES完全没有开销。CTR模式需要nonce/IV,并且必须将其与数据一起传输。没有填充,但仍然有开销。CBC根据前一个块的输出修改当前块的编码方式。CTR本质上是从块密码(如AES)构建流密码。流式密码比块式密码更容易被误用,特别是你必须小心永远不要重用密钥对。@Tiago你选择了不使用填充(
AES/CBC/NoPadding
)。使用填充来避免此问题。但是,在不使用IV的情况下,使用CBC时,每个压缩的开销最多为16字节。因此,您仍然没有解释如何使用100字节的cyphertext。从何时以及由谁认为它“坏了”?从:“RC4有一些缺点,反对在新系统中使用它”。如果你想了解详细信息,请点击那里的链接。“有缺点”并不意味着“坏了”。SHA1也有弱点,但存在数百万个完全有效的X.509证书。SHA1和RC4在TLS中都被广泛使用。谢谢你的好答案,但这正是我基本上使用的-AES/CBC/PKCS5Padding。这个问题、答案和它的注释让我理解了AES的使用(尽管方式正确)。所以,答案是可以接受的。