AES128解密错误:javax.crypto.IlliegalBlockSizeException:使用填充密码解密时,输入必须是16的倍数
当我使用AES128加密文本时,它工作正常,然后当我尝试使用相同的加密数据和密钥解密时,它会给我一个 javax.crypto.IlliegalBlockSizeException:输入必须是 16当使用填充密码解密时 错误只有在我上次修复添加IvParameterSpec后才会发生 AES128 Java类: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;
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字节。检查您的cyphertextbyte[]
长度是否为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);
}