Android中AES加密算法

Android中AES的使用
常見(jiàn)的加密算法大致有兩種,一種是對(duì)稱(chēng)加密算法如AES,另一種是非對(duì)稱(chēng)加密算法如RSA。在對(duì)稱(chēng)加密算法中田炭,加密與解密的密鑰是相同的查吊。密鑰是絕對(duì)不可以泄漏的谐区,否則會(huì)被攻擊者還原密文,竊取機(jī)密數(shù)據(jù)逻卖。非對(duì)稱(chēng)加密算法需要兩個(gè)密鑰:公開(kāi)密鑰(publickey)和私有密鑰(privatekey)宋列。公開(kāi)密鑰與私有密鑰是一對(duì),如果用公開(kāi)密鑰對(duì)數(shù)據(jù)進(jìn)行加密评也,只有用對(duì)應(yīng)的私有密鑰才能解密炼杖;如果用私有密鑰對(duì)數(shù)據(jù)進(jìn)行加密灭返,那么只有用對(duì)應(yīng)的公開(kāi)密鑰才能解密。AES是對(duì)稱(chēng)加密算法的一種坤邪,對(duì)稱(chēng)加密速度非澄鹾快,適合經(jīng)常發(fā)送數(shù)據(jù)的場(chǎng)合艇纺。缺點(diǎn)是密鑰的傳輸比較麻煩怎静。

AES加密需要:明文 + 密鑰+ 偏移量(IV)+密碼模式(算法/模式/填充)
AES解密需要:密文 + 密鑰+ 偏移量(IV)+密碼模式(算法/模式/填充)

其中加密和解密的密鑰,偏移量和密碼模式要相同黔衡。實(shí)際工作中蚓聘,對(duì)加密結(jié)果做Base64轉(zhuǎn)換,在解密之前要做Base64逆轉(zhuǎn)換盟劫。上代碼:

import android.util.Base64;

import java.io.UnsupportedEncodingException;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


public class AESUtil {
//-- 算法/模式/填充
 private static final String CipherMode = "AES/CBC/PKCS7Padding";

//--創(chuàng)建密鑰
private static SecretKeySpec createKey(String password) {
    byte[] data = null;
    if (password == null) {
        password = "";
    }
    StringBuffer sb = new StringBuffer();
    sb.append(password);
    String s =null;
    while (sb.length() < 32) {
        sb.append(" ");//--密碼長(zhǎng)度不夠32補(bǔ)足到32
    }
    s =sb.substring(0,32);//--截取32位密碼
    try {
        data = s.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return new SecretKeySpec(data, "AES");
}

//--創(chuàng)建偏移量
private static IvParameterSpec createIV(String iv) {
    byte[] data = null;
    if (iv == null) {
        iv = "";
    }
    StringBuffer sb = new StringBuffer(16);
    sb.append(iv);
    String s =null;
    while (sb.length() < 16) {
        sb.append(" ");//--偏移量長(zhǎng)度不夠16補(bǔ)足到16
    }
    s =sb.substring(0,16);//--截取16位偏移量
    try {
        data = s.getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return new IvParameterSpec(data);
}

//--加密字節(jié)數(shù)組到字節(jié)數(shù)組
public static byte[] encryptByte2Byte(byte[] content,String password,String iv){
    try {
        SecretKeySpec key = createKey(password);
        Cipher cipher = Cipher.getInstance(CipherMode);
        cipher.init(Cipher.ENCRYPT_MODE, key, createIV(iv));
        byte[] result = cipher.doFinal(content);
        return result;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
//--加密字節(jié)數(shù)組到字符串
public static String encryptByte2String(byte[] content,String password,String iv){
    byte[] data =encryptByte2Byte(content,password,iv);
    String result =new String(data);
    return  result;
}
//--加密字節(jié)數(shù)組到base64
public static String encryptByte2Base64(byte[] content,String password,String iv){
    byte[] data =encryptByte2Byte(content,password,iv);
    String result = new String(Base64.encode(data,Base64.DEFAULT));
    return result;
}

//--加密字符串到字節(jié)數(shù)組
public static byte[] encryptString2Byte(String content, String password, String iv){
    byte[] data = null;
    try {
        data = content.getBytes("UTF-8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    data = encryptByte2Byte(data,password,iv);
    return data;
}
//--加密字符串到字符串
public static String encryptString2String(String content, String password, String iv){
    byte[] data = null;
    try {
        data = content.getBytes("UTF-8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    data = encryptByte2Byte(data,password,iv);
    String result =new String(data);
    return result;
}
//--加密字符串到base64
public static String encryptString2Base64(String content, String password, String iv){
    byte[] data = null;
    try {
        data = content.getBytes("UTF-8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    data = encryptByte2Byte(data,password,iv);
    String result =new String(Base64.encode(data,Base64.DEFAULT));
    return result;
}

//-- 解密字節(jié)數(shù)組到字節(jié)數(shù)組
public static byte[] decryptByte2Byte(byte[] content, String password, String iv) {
    try {
        SecretKeySpec key = createKey(password);
        Cipher cipher = Cipher.getInstance(CipherMode);
        cipher.init(Cipher.DECRYPT_MODE, key, createIV(iv));
        byte[] result = cipher.doFinal(content);
        return result;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

//--解密字符串到字節(jié)數(shù)組
public static byte[] decryptString2Byte(String content, String password, String iv) {
    byte[] data = null;
    try {
        data = content.getBytes("UTF-8");
    } catch (Exception e) {
        e.printStackTrace();
    }
    data = decryptByte2Byte(data,password,iv);
    return data;
}

//--解密base64到字節(jié)數(shù)組
public static byte[] decryptBase642Byte(String content, String password, String iv) {
    byte[] data = null;
    try {
        data = Base64.decode(content,Base64.DEFAULT);
    } catch (Exception e) {
        e.printStackTrace();
    }
    data = decryptByte2Byte(data,password,iv);
    return data;
}

//-- 解密字節(jié)數(shù)組到字符串
public static String decryptByte2String(byte[] content, String password, String iv) {
    byte[] data =decryptByte2Byte(content,password,iv);
    String result =new String(data);
    return result;
}

//-- 解密字節(jié)數(shù)組到字符串
public static String decryptBase642String(String content, String password, String iv) {
    byte[] data =Base64.decode(content,Base64.DEFAULT);
    String result=decryptByte2String(data,password,iv);
    return result;
}
}

AES加密的工具類(lèi)AESUtil.java夜牡,封裝了”AES/CBC/PKCS7Padding” 模式的加密方法。包括字節(jié)數(shù)組加密輸出字節(jié)數(shù)組侣签,字符串加密輸出Base64等方法塘装。

在實(shí)際工作中多是服務(wù)端使用密鑰將字符串加密輸出base64傳遞到客戶(hù)端,客戶(hù)端解密的時(shí)候硝岗,先將base64逆轉(zhuǎn)換成字節(jié)數(shù)組氢哮,在使用ASE密鑰解密得到解密后的字節(jié)數(shù)組,將解密后的字節(jié)數(shù)組轉(zhuǎn)成字符串型檀。

String base64String =AESUtil.encryptString2Base64("歡迎來(lái)到王者榮      耀","kakuishdyshifncgyrsjdiosfnvjfeas","asadfdedwderfvgd");
        LogUtil.i("load_Aes"," base64String "+base64String);//--U0E01UZ5ed7hijY7YY1+v/x5rsbWtknI9piWP3QHvfQ=

        String string  = AESUtil.decryptBase642String(base64String,"kakuishdyshifncgyrsjdiosfnvjfeas","asadfdedwderfvgd");
        LogUtil.i("load_Aes"," string "+string);//--歡迎來(lái)到王者榮耀

總結(jié):上例先對(duì)字符串“歡迎來(lái)到王者榮耀”進(jìn)行加密冗尤,輸出base64,然后解密得到字符串“歡迎來(lái)到王者榮耀”胀溺。AES加密算法師對(duì)稱(chēng)加密算法裂七,速度較快,在實(shí)際應(yīng)用中較多仓坞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末背零,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子无埃,更是在濱河造成了極大的恐慌柱蟀,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晶渠,死亡現(xiàn)場(chǎng)離奇詭異乾吻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)织阅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)壳繁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事闹炉≥镉” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵渣触,是天一觀(guān)的道長(zhǎng)羡棵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)昵观,這世上最難降的妖魔是什么晾腔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮啊犬,結(jié)果婚禮上灼擂,老公的妹妹穿的比我還像新娘。我一直安慰自己觉至,他們只是感情好剔应,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著语御,像睡著了一般峻贮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上应闯,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天纤控,我揣著相機(jī)與錄音,去河邊找鬼碉纺。 笑死船万,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骨田。 我是一名探鬼主播耿导,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼态贤!你這毒婦竟也來(lái)了舱呻?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤悠汽,失蹤者是張志新(化名)和其女友劉穎箱吕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體柿冲,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡殖氏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姻采。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慨亲,靈堂內(nèi)的尸體忽然破棺而出婚瓜,到底是詐尸還是另有隱情,我是刑警寧澤刑棵,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布巴刻,位于F島的核電站,受9級(jí)特大地震影響蛉签,放射性物質(zhì)發(fā)生泄漏胡陪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一碍舍、第九天 我趴在偏房一處隱蔽的房頂上張望柠座。 院中可真熱鬧,春花似錦片橡、人聲如沸妈经。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吹泡。三九已至,卻和暖如春经瓷,著一層夾襖步出監(jiān)牢的瞬間爆哑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工舆吮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揭朝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓歪泳,卻偏偏與公主長(zhǎng)得像萝勤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子呐伞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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