android javax.crypto.BadPaddingException: pad block corrupted

今天发现在windows上能正常使用的java aes代码在android上无法使用,折腾了一天。。。。最后查了些资料后发现主要原因是在windows上以及android上产生的key是不同的,所以更改了以下类的使用方法便可以正常使用。主要是自己传递了一个16个字符的seed即可。
以下代码经过在手机上测试可用


import java.security.SecureRandom;
import java.util.UUID;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**

  • AES加密器
  • @author padnans

/
public class AESEncryptor {
/
*
* 生成秘钥 16位,否则不能进行正常的加密解密
/
public static final int passwordLength = 16;
/
*
* 生成秘钥 16位,否则不能进行正常的加密解密
* @return
/
public static String randomPassword(){
String uuid = UUID.randomUUID().toString();
System.out.println("uuid = "+uuid.length());
int random = (int)(Math.random()
11);
String password = uuid.substring(random,random+passwordLength);
return password;
}
public static String encrypt(String seed, String cleartext)
throws Exception {
// byte[] rawKey = getRawKey(seed.getBytes());
byte[] rawKey = seed.getBytes();
byte[] result = encrypt(rawKey, cleartext.getBytes());
return toHex(result);
}

public static String decrypt(String seed, String encrypted)        throws Exception {    // byte[] rawKey = getRawKey(seed.getBytes());    byte[] rawKey = seed.getBytes();    byte[] enc = toByte(encrypted);    byte[] result = decrypt(rawKey, enc);    return new String(result);}private static byte[] getRawKey(byte[] seed) throws Exception {    KeyGenerator kgen = KeyGenerator.getInstance("AES");    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");    sr.setSeed(seed);    kgen.init(128, sr); // 192 and 256 bits may not be available    SecretKey skey = kgen.generateKey();    byte[] raw = skey.getEncoded();    return raw;}private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");    Cipher cipher = Cipher.getInstance("AES");    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);    byte[] encrypted = cipher.doFinal(clear);    return encrypted;}private static byte[] decrypt(byte[] raw, byte[] encrypted)        throws Exception {    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");    Cipher cipher = Cipher.getInstance("AES");    cipher.init(Cipher.DECRYPT_MODE, skeySpec);    byte[] decrypted = cipher.doFinal(encrypted);    return decrypted;}public static String toHex(String txt) {    return toHex(txt.getBytes());}public static String fromHex(String hex) {    return new String(toByte(hex));}public static byte[] toByte(String hexString) {    int len = hexString.length() / 2;    byte[] result = new byte[len];    for (int i = 0; i < len; i++)        result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),                16).byteValue();    return result;}public static String toHex(byte[] buf) {    if (buf == null)        return "";    StringBuffer result = new StringBuffer(2 * buf.length);    for (int i = 0; i < buf.length; i++) {        appendHex(result, buf[i]);    }    return result.toString();}private final static String HEX = "0123456789ABCDEF";private static void appendHex(StringBuffer sb, byte b) {    sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));}

}

测试代码:
加密:


String random = AESEncryptor.randomPassword();
String password = random;
try {
String msgEncrypt = AESEncryptor.encrypt(password,mMsgText);
mMsgText = password+msgEncrypt+"[.SNAPCHAT]";
Log.i("=======加密========密码:"+password+",数据:"+msgEncrypt);
}catch (Exception e){
e.printStackTrace();
}

解密:


String password = sms.content.substring(0,AESEncryptor.passwordLength);
String msgEncrypt = sms.content.substring(AESEncryptor.passwordLength).replace("[.SNAPCHAT]","");// 前面16个字符是秘钥的一部分
String s = "";
try {
s = AESEncryptor.decrypt(password, msgEncrypt);
Log.i("=======解密========密码:"+password+",数据:"+msgEncrypt);
}catch (Exception e){
e.printStackTrace();
}

更多相关文章

  1. 在Ubuntu16.04上下载并编译Android内核源代码
  2. Android实用代码片段(一)
  3. fanfou(饭否) android客户端 代码学习1
  4. android短信发送器源代码
  5. Android(Java)正则表达式判断手机号、邮箱、身份证号码、密码、Url
  6. Android Media Recorder录音播放源代码
  7. android实现自动关机代码
  8. Android 用源代码写layout布局

随机推荐

  1. Android IntentService 分析
  2. android之AlerDialog
  3. 【随记】Android GPS定位(编辑中)
  4. Android 中比较好的adapter的写法
  5. android 录音操作
  6. Android游戏引擎
  7. Android 封装SharedPreference工具类
  8. Hack Android SD Card support
  9. android仿优酷超炫菜单
  10. Android(安卓)ListView异步加载图片乱序