android 中使用java aes加密算法侥涵,報(bào)錯(cuò)信息android javax.crypto.BadPaddingException: pad block corrupted

android javax.crypto.BadPaddingException: pad block corrupted

今天發(fā)現(xiàn)在windows上能正常使用的java aes代碼在android上無法使用炫乓,折騰了一天甸赃。惧所。。队萤。最后查了些資料后發(fā)現(xiàn)主要原因是在windows上以及android上產(chǎn)生的key是不同的,所以更改了以下類的使用方法便可以正常使用矫钓。主要是自己傳遞了一個(gè)16個(gè)字符的seed即可要尔。
以下代碼經(jīng)過在手機(jī)上測試可用

<pre>
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位舍杜,否則不能進(jìn)行正常的加密解密
/
public static final int passwordLength = 16;
/
*
* 生成秘鑰 16位,否則不能進(jìn)行正常的加密解密
* @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));
}

}

</pre>

測試代碼:
加密:
<pre>
String random = AESEncryptor.randomPassword();
String password = random;
try {
String msgEncrypt = AESEncryptor.encrypt(password,mMsgText);
mMsgText = password+msgEncrypt+"[.SNAPCHAT]";
Log.i("=======加密========密碼:"+password+",數(shù)據(jù):"+msgEncrypt);
}catch (Exception e){
e.printStackTrace();
}
</pre>

解密:
<pre>
String password = sms.content.substring(0,AESEncryptor.passwordLength);
String msgEncrypt = sms.content.substring(AESEncryptor.passwordLength).replace("[.SNAPCHAT]","");// 前面16個(gè)字符是秘鑰的一部分
String s = "";
try {
s = AESEncryptor.decrypt(password, msgEncrypt);
Log.i("=======解密========密碼:"+password+",數(shù)據(jù):"+msgEncrypt);
}catch (Exception e){
e.printStackTrace();
}

</pre>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赵辕,一起剝皮案震驚了整個(gè)濱河市既绩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌还惠,老刑警劉巖饲握,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚕键,居然都是意外死亡救欧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門锣光,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笆怠,“玉大人,你說我怎么就攤上這事誊爹〉潘ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵替废,是天一觀的道長箍铭。 經(jīng)常有香客問我,道長椎镣,這世上最難降的妖魔是什么诈火? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮状答,結(jié)果婚禮上冷守,老公的妹妹穿的比我還像新娘。我一直安慰自己惊科,他們只是感情好拍摇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馆截,像睡著了一般充活。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜡娶,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天混卵,我揣著相機(jī)與錄音,去河邊找鬼窖张。 笑死幕随,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宿接。 我是一名探鬼主播赘淮,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辕录,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梢卸?” 一聲冷哼從身側(cè)響起走诞,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎低剔,沒想到半個(gè)月后速梗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡襟齿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年姻锁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猜欺。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡位隶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出开皿,到底是詐尸還是另有隱情涧黄,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布赋荆,位于F島的核電站笋妥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窄潭。R本人自食惡果不足惜春宣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫉你。 院中可真熱鬧月帝,春花似錦、人聲如沸幽污。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽距误。三九已至簸搞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間准潭,已是汗流浹背攘乒。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惋鹅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓殉簸,卻偏偏與公主長得像闰集,于是被迫代替她去往敵國和親沽讹。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容