android aes加密和解密,在android2.1和2.2下一切正常,可在2.3.3等以上版本却提示错误“java.lang.Exception: pad block corrupted”源码如下:
// 解密文件
public static String DecryptFile(String pwd, File fileIn, File fileOut)
throws Exception {
try {
// 读取文件 FileInputStream fis = new FileInputStream(fileIn);
byte[] bytIn = readbyte(fis); // AES解密
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(256, new SecureRandom(pwd.getBytes()));
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
// 写文件
byte[] bytOut = cipher.doFinal(bytIn);
FileOutputStream fos = new FileOutputStream(fileOut);
InputStream sbs = new ByteArrayInputStream(bytOut);
fos.write(readbyte(sbs));
fos.close();
fis.close();
} catch (Exception e) {
throw new Exception(e.getMessage());

}
return pwd;
} protected static byte[] readbyte(InputStream stream) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream(8196);
byte[] buffer = new byte[1024];
int length = 0;
while ((length = stream.read(buffer)) > 0) {
baos.write(buffer, 0, length);
}
return baos.toByteArray(); } catch (Exception exception) {
return exception.getMessage().getBytes();
}
}使用方法:
String DecryptCode = EncryptfileActivity.DecryptFile(pwd, fileIn,fileOut);
以上使用在android2.1\2.2下一切正常,可在2.3以上版本却报“java.lang.Exception: pad block corrupted”log.txt如下:
06-23 13:21:34.758: W/System.err(1744): java.lang.Exception: pad block corrupted
06-23 13:21:34.767: W/System.err(1744):  at DecryptFile(EncryptfileActivity.java:44)
06-23 13:21:34.777: W/System.err(1744):  at onCreate(Activity.java:61)
06-23 13:21:34.777: W/System.err(1744):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
06-23 13:21:34.777: W/System.err(1744):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
06-23 13:21:34.797: W/System.err(1744):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
06-23 13:21:34.797: W/System.err(1744):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
06-23 13:21:34.797: W/System.err(1744):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
06-23 13:21:34.807: W/System.err(1744):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-23 13:21:34.817: W/System.err(1744):  at android.os.Looper.loop(Looper.java:123)
06-23 13:21:34.817: W/System.err(1744):  at android.app.ActivityThread.main(ActivityThread.java:3683)
06-23 13:21:34.817: W/System.err(1744):  at java.lang.reflect.Method.invokeNative(Native Method)
06-23 13:21:34.817: W/System.err(1744):  at java.lang.reflect.Method.invoke(Method.java:507)
06-23 13:21:34.817: W/System.err(1744):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-23 13:21:34.827: W/System.err(1744):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-23 13:21:34.827: W/System.err(1744):  at dalvik.system.NativeStart.main(Native Method)
06-23 13:21:37.136: D/dalvikvm(1744): GC_EXTERNAL_ALLOC freed 337K, 54% free 2577K/5575K, external 1925K/2137K, paused 85ms
06-23 13:21:37.268: D/dalvikvm(1744): GC_EXTERNAL_ALLOC freed 3K, 54% free 2573K/5575K, external 3425K/4277K, paused 87ms
06-23 13:21:37.387: D/dalvikvm(1744): GC_EXTERNAL_ALLOC freed <1K, 54% free 2575K/5575K, external 4925K/6151K, paused 71ms
其中:
DecryptFile(EncryptfileActivity.java:44) 如下:throw new Exception(e.getMessage());(上面代码的红字部分)
onCreate(Activity.java:61)   如下:String DecryptCode = EncryptfileActivity.DecryptFile(pwd, fileIn,fileOut);这应该怎么处理呢,麻烦大家帮帮忙呀,怎么样才能全版本兼容(开发是在android2.1下做的)急!!谢谢大家

解决方案 »

  1.   

    catch到exception时,使用原始的异常,而不是抛出一个新的异常,可以更精确的定位异常
      

  2.   

    遇到同样的问题,只是看了这个才知道在不同的版本有不同的结果
    我是Android初学者,一直用4.2的
    解密时一直报错。能加不能解!! 好头痛,好烦人的问题
      

  3.   


    http://blog.csdn.net/wujxiaoz/article/details/9036981
    AES加解密在Android 4.2上的Encryption error这个是可以解决下,但在部分少量机型还是有点问题。
    ---同求完全兼容的方法