无填充的javaaes
在没有自动填充的情况下,AES加密和解密16字节数组的最简单方法是什么?我已经找到了使用外部库的解决方案,但如果可能的话,我希望避免这种情况 我现在的代码是无填充的javaaes,java,encryption,aes,padding,Java,Encryption,Aes,Padding,在没有自动填充的情况下,AES加密和解密16字节数组的最简单方法是什么?我已经找到了使用外部库的解决方案,但如果可能的话,我希望避免这种情况 我现在的代码是 SecretKeySpec skeySpec = new SecretKeySpec(getCryptoKeyByteArray(length=16)); // 128 bits Cipher encryptor = Cipher.getInstance("AES"); encryptor.init(Cipher.ENCRYPT_MODE,
SecretKeySpec skeySpec = new SecretKeySpec(getCryptoKeyByteArray(length=16)); // 128 bits
Cipher encryptor = Cipher.getInstance("AES");
encryptor.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = encryptor.doFinal(plain);
如何防止填充?plain
数据总是固定长度的,并且包含自己的填充。如何允许plain
为16字节,而不导致加密
变为32字节?
见我的评论。对不起,我第一次可能应该仔细看看
decryptor.init(Cipher.DECRYPT_模式,skeySpec)
todecryptor.init(Cipher.DECRYPT_模式,skeySpec,encryptor.gerParameters())代码>
的“AES”
更改为的“AES/ECB/NoPadding”
我选择欧洲央行是因为
如果需要加密超过16个字节,请考虑使用除
以外的其他内容。 在本位图示例中,此图像具有重复的白色块,因此您可以通过查找块的不同位置来推断图像的轮廓 如果您只加密一个块,这其实并不重要,但只有当您加密多个组合的块时,ECB才会显示出来相关:CTR模式不需要填充:
“AES/CTR/NoPadding”
同意@rossum,但还有更多内容:
CTR模式需要一个初始化向量(IV)。这是一个“计数器”(即“CTR”所指的计数器)。如果你能单独储存静脉注射(不需要保护),那就行了。解密数据时需要相同的IV值
如果您不想存储IV,并且可以保证不会使用相同的密钥对两个值进行加密,那么可以使用固定的IV(即使是0数组)
以上内容非常重要,因为使用相同的密钥/IV组合加密多条消息会破坏安全性。请参阅本Wikipedia文章中的初始化向量(IV)部分:
代码的AES CTR实现可能是:
SecretKeySpec skeySpec = new SecretKeySpec(getCryptoKeyByteArray(length=16));
Cipher encryptor = Cipher.getInstance("AES/CTR/NoPadding");
// Initialisation vector:
byte[] iv = new byte[encryptor.getBlockSize()];
SecureRandom.getInstance("SHA1PRNG").nextBytes(iv); // If storing separately
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
encryptor.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec);
byte[] encrypted = encryptor.doFinal(plain);
您是否尝试过
Cipher.getInstance(“AES/CBC/NoPadding”)代码>?这里的信息有用吗?@user384706,我已经试过了。尝试创建解密密码时,我得到了java.security.InvalidKeyException:缺少参数:decryptor.init(Cipher.DECRYPT_模式,skeySpec)再次搜索后,我找到了解决方案。“看我的答案。”梅里斯,我发现它太大了。特别是关于ivParamSpec
的所有内容。我已经提前很长时间生成了我的密钥,但我看不出这一切的原因。乔治贝利:我也不知道,有趣的发现!通常,您不希望将CBC与NoPadding一起使用(或者仅当您的数据大小始终是16字节的倍数时)。CTR、OFB和CFB模式可用于NoPadding,CBC不可用。(编辑:啊,我没注意到你的数据已经是一个16字节的数组了。那就好了。)另外,你的encrypter.getParameters()
实际上主要传输初始化向量。如果您不在同一过程中加密和解密,您会将此IV与您的数据一起发送。@Paŭlo,我现在发现了您所指的内容。我想要的是使用ECB,这样就不需要IV。一篇关于为什么ECB通常不是一个好选择的好文章: