gpt4 book ai didi

java - AES 加密函数返回 null

转载 作者:行者123 更新时间:2023-12-02 10:38:57 25 4
gpt4 key购买 nike

我正在为 Android 构建 AES 加密应用程序。我正在使用 android.util.Base64 库。

我有一个名为 SecondActivity.java 的类,它调用我的 EncryptionController.java 类。

这是我的 SecondActivity 的外观:enc() 是从按钮的 onClick 方法调用的。我遇到的问题是解密方法从 catch 语句返回一条错误消息,这意味着抛出了异常。 Logcat 中输出的错误指的是非法的最终 block 大小: javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH

 public String enc(){


String initVector = "RandomInitVector";
String key = "Bar12345Bar12345Bar12345Bar12345";
String result;


//Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();


// System.out.println(result);




return ec.decrypt(key, initVector, ec.encrypt(key, initVector, "Hello World"));
}

该方法调用 EncryptionController 中的两个方法:第一个是解密,第二个是加密。

这是加密的样子:

 public String encrypt(String key, String initVector, String value){




try {


IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));

SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");

cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes("UTF-8"));


System.out.println("Encrypted Var is: " + android.util.Base64.encode(encrypted, android.util.Base64.DEFAULT));

return android.util.Base64.encode(encrypted, android.util.Base64.DEFAULT).toString();

}catch(Exception e){
return null;
}
//return Base64.encodeBase64String(encrypted);



}

最后是我的解密方法:

public static String decrypt(String key, String initVector, String encrypted){



try {

IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));

SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");

cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);


byte[] original = cipher.doFinal(android.util.Base64.decode(encrypted,0));


return new String(original);
// return null;



}catch(Exception e){

e.printStackTrace();

return "this is broken ******************";
}

我不确定出了什么问题,但我感觉它与行 byte[] original = cipher.doFinal(android.util.Base64.decode(encrypted,0)); 有关
在解密方法中。我也尝试过将编码类型设置为 UTF-8,但我不确定这会产生什么影响。

最佳答案

问题源于加密方法。

java.lang.Byte.toString() 返回一个表示无符号 Byte 值的 String 对象; android.util.Base64.encode(encrypted, android.util.Base64.DEFAULT) 的返回值是一个字节数组,当您在此对象上调用 toString() 时,它将返回该数组中字节的字符串表示形式,而不是从base64编码获得的实际字节。您需要以不修改原始字节数组数据的方式将字节数组更改为字符串,如下所示:

public String encrypt(String key, String initVector, String value){
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes("UTF-8"));
System.out.println("Encrypted Var is: " + android.util.Base64.encode(encrypted, android.util.Base64.DEFAULT));

return new String(android.util.Base64.encode(encrypted, android.util.Base64.DEFAULT));

}catch(Exception e){
return null;
}
}

关于java - AES 加密函数返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53069915/

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