BadPaddingExeception 同时解密 AES256
BadPaddingExeception whilst decrypting AES256
目前在解密 AES 哈希时遇到问题。
当我使用 AES256 加密时,我得到以下结果(经过 base64 编码)
07sKQfb9dN86XAMxFmVKHQAAAAAAAAAAAAAAAAAAAAA=
我认为我的问题与 AAAAAAAA 等有关。出于某种原因,我认为无论如何在解密过程中都不会删除填充。
我的代码
public String encrypt(String key, String initVector, String value) throws Exception {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"), 0, initVector.getBytes().length);
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), 0, key.getBytes().length, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = new byte[32];
cipher.doFinal(value.getBytes(), 0, value.getBytes().length, encrypted, 0);
System.out.println("Base64: " + Base64.encode(encrypted));
System.out.println("Hex: " + bytesToHex(encrypted));
return Base64.encode(encrypted);
}
public String decrypt(String key, String initVector, String encrypted) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"), 0, initVector.getBytes().length);
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), 0, key.getBytes().length, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] decrypted = new byte[64];
cipher.doFinal(Base64.decode(encrypted), 0, Base64.decode(encrypted).length, decrypted, 0);
return new String(decrypted);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
当我编码 base64 时我期待什么 07sKQfb9dN86XAMxFmVKHQ=
我正在加密的字符串:测试
密钥:password12345678password12345678
byte[] decrypted = new byte[64];
您创建了一个 64 字节数组,但解密后的值可能更短(Java 不像 C 那样使用零字符串终止符)。所以你不应该对参数 length
做假设
尝试使用
encrypted = cipher.doFinal(value.getBytes());
和
decrypted = cipher.doFinal(Base64.decode(encrypted));
目前在解密 AES 哈希时遇到问题。
当我使用 AES256 加密时,我得到以下结果(经过 base64 编码)
07sKQfb9dN86XAMxFmVKHQAAAAAAAAAAAAAAAAAAAAA=
我认为我的问题与 AAAAAAAA 等有关。出于某种原因,我认为无论如何在解密过程中都不会删除填充。
我的代码
public String encrypt(String key, String initVector, String value) throws Exception {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"), 0, initVector.getBytes().length);
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), 0, key.getBytes().length, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = new byte[32];
cipher.doFinal(value.getBytes(), 0, value.getBytes().length, encrypted, 0);
System.out.println("Base64: " + Base64.encode(encrypted));
System.out.println("Hex: " + bytesToHex(encrypted));
return Base64.encode(encrypted);
}
public String decrypt(String key, String initVector, String encrypted) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"), 0, initVector.getBytes().length);
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), 0, key.getBytes().length, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] decrypted = new byte[64];
cipher.doFinal(Base64.decode(encrypted), 0, Base64.decode(encrypted).length, decrypted, 0);
return new String(decrypted);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
当我编码 base64 时我期待什么 07sKQfb9dN86XAMxFmVKHQ=
我正在加密的字符串:测试
密钥:password12345678password12345678
byte[] decrypted = new byte[64];
您创建了一个 64 字节数组,但解密后的值可能更短(Java 不像 C 那样使用零字符串终止符)。所以你不应该对参数 length
做假设尝试使用
encrypted = cipher.doFinal(value.getBytes());
和
decrypted = cipher.doFinal(Base64.decode(encrypted));