无填充的javaaes

无填充的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,

在没有自动填充的情况下,AES加密和解密16字节数组的最简单方法是什么?我已经找到了使用外部库的解决方案,但如果可能的话,我希望避免这种情况

我现在的代码是

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字节?

见我的评论。对不起,我第一次可能应该仔细看看

  • 将“AES”更改为“AES/CBC/NoPadding”
  • 更改
    decryptor.init(Cipher.DECRYPT_模式,skeySpec)
    to
    decryptor.init(Cipher.DECRYPT_模式,skeySpec,encryptor.gerParameters())
    
  • 要使用不需要保存初始化向量的方法仅加密16字节的固定长度数据,请将
    的“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通常不是一个好选择的好文章: