gpt4 book ai didi

java - Android中AES的解密算法

转载 作者:行者123 更新时间:2023-11-29 07:07:39 26 4
gpt4 key购买 nike

public static String Encrypt(String text){
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] keyBytes= new byte[16];
byte[] b= KEY.getBytes("UTF-8");
int len= b.length;
if (len > keyBytes.length) len = keyBytes.length;
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);

byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
String result = Base64.encodeToString(results, 0);
//result = URLEncoder.encode(result.trim(),"UTF-8");
return result;

} catch (Exception e) {
// TODO: handle exception
return null;
}
}

public static String Decrypt(String text){
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] keyBytes= new byte[16];
byte[] b= KEY.getBytes("UTF-8");
int len= b.length;
if (len > keyBytes.length) len = keyBytes.length;
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec);
byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
String result = Base64.encodeToString(results, 0);
//result = URLEncoder.encode(result.trim(),"UTF-8");
return result;

} catch (Exception e) {
// TODO: handle exception
Log.d("decryption", e.getMessage());
return null;
}
}

这是用于加密和解密的代码,我从其他一些问题中得到了加密算法,它对我来说工作正常,但我也需要解密,我试图像加密一样模仿它,但它不起作用。异常表示最后一个 block 不完整。

最佳答案

问题是您没有以相反的顺序执行相反的顺序。您最终得到了 base64 编码的数据 - 因此您需要做的第一件事是对其进行 base64 解码以获取二进制加密数据。然后解密,然后使用 UTF-8 将其转换回字符串。

public static String decrypt(String text){
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] keyBytes= new byte[16];
byte[] b= KEY.getBytes("UTF-8");
int len= b.length;
if (len > keyBytes.length) len = keyBytes.length;
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec);
byte[] results = cipher.doFinal(Base64.decode(text, 0));
return new String(results, "UTF-8");
} catch (Exception e) {
// TODO: handle exception
Log.d("decryption", e.getMessage());
return null;
}
}

当您从某个地方获取代码时,真正了解它在做什么很重要 - 特别是,了解此处每个阶段的数据是什么样的:

  • 从纯文本开始
  • UTF-8 编码成一个字节数组
  • 加密到另一个字节数组(不是 UTF-8 编码的文本)
  • 将加密后的二进制数据进行Base64编码为字符串

任何时候你在做这样的转换,当你想反转它时,你也需要反转步骤的顺序,以便返回到原始数据。

关于java - Android中AES的解密算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18031130/

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