我正在为Android开发一个AES加密应用程序。我正在使用android.util.Base64
库。
我有一个名为SecondActivity.java的类,它调用了我的EncryptionController.java类。
这是我的SecondActivity的外观:
从按钮onClick方法调用enc()。我遇到的问题是,解密方法从catch语句返回一条错误消息,这意味着引发了异常。 Logcat中输出的错误是指非法的最终块大小: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,但不确定是否有所作为。
答案 0 :(得分:1)
问题出在加密方法上。
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;
}
}