gpt4 book ai didi

java - 使用 AES 在 Java 和 Python 中加密/解密

转载 作者:行者123 更新时间:2023-11-30 06:14:23 25 4
gpt4 key购买 nike

我正在尝试使用 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;
}

最佳答案

简单,您应该在解密之前而不是之后执行 Base 64 解码。

<小时/>

这是一个密文采用 Base 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;
}

我认为这是出于学习目的,因为代码存在很多问题,例如使用字符串中的 key 、ECB 模式加密等。

关于java - 使用 AES 在 Java 和 Python 中加密/解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49544982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com