AES128解密错误:javax.crypto.IlliegalBlockSizeException:使用填充密码解密时,输入必须是16的倍数

AES128解密错误:javax.crypto.IlliegalBlockSizeException:使用填充密码解密时,输入必须是16的倍数,java,encryption,cryptography,aes,Java,Encryption,Cryptography,Aes,当我使用AES128加密文本时,它工作正常,然后当我尝试使用相同的加密数据和密钥解密时,它会给我一个 javax.crypto.IlliegalBlockSizeException:输入必须是 16当使用填充密码解密时 错误只有在我上次修复添加IvParameterSpec后才会发生 AES128 Java类: package xcrypt; import java.security.SecureRandom; import javax.crypto.Cipher;

当我使用AES128加密文本时,它工作正常,然后当我尝试使用相同的加密数据和密钥解密时,它会给我一个

javax.crypto.IlliegalBlockSizeException:输入必须是 16当使用填充密码解密时

错误只有在我上次修复添加IvParameterSpec后才会发生

AES128 Java类:

package xcrypt;

    import java.security.SecureRandom;

    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;

    public class AES128 
    {

        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        IvParameterSpec ivSpec = new IvParameterSpec(iv);

        private  byte[] getRawKey(byte[] seed) throws Exception 
        {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
            sr.setSeed(seed);
            kgen.init(128, sr); // 192 and 256 bits may not be available
            SecretKey skey = kgen.generateKey();
            byte[] raw = skey.getEncoded();
            return raw;
        }

        public  byte[] encrypt(byte[] raw, byte[] clear) throws Exception 
        {
            SecretKeySpec skeySpec = new SecretKeySpec(getRawKey(raw), "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
            byte[] encrypted = cipher.doFinal(clear);
            return encrypted;
        }

        public  byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception 
        {

            SecretKeySpec skeySpec = new SecretKeySpec(getRawKey(raw), "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
            byte[] decrypted = cipher.doFinal(encrypted);
            return decrypted;
        }
    }
这里是调用方法的地方(主类):


在添加
IVParameter
之前,它工作正常吗?不,然后它给了我一个缺少的参数错误。你能给我们看一下你实际调用加密和解密方法的附近代码吗?AES块是128位16字节。检查您的cyphertext
byte[]
长度是否为16字节的倍数。你的静脉注射有多长?如果不是16字节,则可能是导致问题的原因。请注意,使用
SecureRandom
派生密钥不是一个好的算法。如果要从密码派生密钥,请改用PBKDF2。
SecureRandom
实现可能因平台而异,在创建后直接设置种子也可能不适用于每个实现。
public byte[] Encryption_AES128(byte[] plain  , byte[] key) throws Exception
    {
        AES128 aes128 = new AES128();
        return aes128.encrypt(key, plain);
    }
    public byte[] Decryption_AES128(byte[] cipher  , byte[] key) throws Exception
    {
        AES128 aes128 = new AES128();
        return aes128.decrypt(key, cipher);
    }