我尝试使用AES加密/解密python和java中的字符串,并且两者的加密结果相同。加密工作正常,但是当我尝试解密java中的字符串时,它会向我显示此错误(javax.crypto.IllegalBlockSizeException:当使用填充密码解密时,输入长度必须是16的倍数)。在python中它工作正常。 java解密有什么问题?
private static String toHexString(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; ++i) {
String s = Integer.toHexString(data[i] & 0XFF);
buf.append((s.length() == 1) ? ("0" + s) : s);
}
return buf.toString();
}
public static String encrypt(String input, String key) {
byte[] crypted = null;
try {
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
crypted = cipher.doFinal(input.getBytes());
final String encryptedString = toHexString(Base64.encodeBase64(crypted));
return encryptedString;
} catch (Exception e) {
System.out.println(e.toString());
}
return "";
}
public static String decrypt(String encrypted, String key) {
char[] ch= encrypted.toCharArray();
try {
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher2.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] h =Hex.decodeHex(ch);
String de = new String(Base64.decodeBase64(cipher2.doFinal(Hex.decodeHex(ch))),"UTF-8");
return de;
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
答案 0 :(得分:1)
很简单,你应该在解密之前执行base 64解码,而不是之后。
以下是密文基于64编码的示例。没有理由执行base 64 和十六进制编码,你可以做其中任何一个,但是使用两者都没有意义。
我使用了替代的Base64编解码器,但没有指定您使用的是哪一种。
警告:不要复制下面的代码,它不安全;它只提供问题的直接答案。
public static String encrypt(String input, String key) {
byte[] crypted = null;
try {
SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skey);
crypted = cipher.doFinal(input.getBytes());
final String encryptedString = Base64.toBase64String(crypted);
return encryptedString;
} catch (Exception e) {
System.out.println(e.toString());
}
return "";
}
public static String decrypt(String encrypted, String key) {
// char[] ch= encrypted.toCharArray();
try {
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher2 = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher2.init(Cipher.DECRYPT_MODE, skeySpec);
// byte[] h = Hex.decode(encrypted);
String de = new String(cipher2.doFinal(Base64
.decode(encrypted)), "UTF-8");
return de;
} catch (Exception e) {
System.out.println(e.toString());
}
return null;
}
我认为这是出于学习目的,因为代码存在许多问题,例如:使用字符串中的键,ECB模式加密等等。