AES工具類(lèi)

package com.csh.encryptdemo.encryptutils;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * Created by 宮智耀 on 2016/10/13.
 */
public class AES {

    /**
     * AES 加密
     *
     * @param seed      密鑰
     * @param cleartext 明文
     * @return 密文
     */
    public static String encrypt(String seed, String cleartext) {
        //對(duì)密鑰進(jìn)行加密
        byte[] rawkey = getRawKey(seed.getBytes());
        //加密數(shù)據(jù)
        byte[] result = encrypt(rawkey, cleartext.getBytes());
        //將十進(jìn)制數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)
        return toHex(result);
    }


    /**
     * AES 解密
     *
     * @param seed      密鑰
     * @param encrypted 密文
     * @return 明文
     */
    public static String decrypt(String seed, String encrypted) {
        byte[] rawKey = getRawKey(seed.getBytes());
        byte[] enc = toByte(encrypted);
        byte[] result = decrypt(rawKey, enc);
        return new String(result);
    }


    private static byte[] getRawKey(byte[] seed) {

        try {
            //獲取密鑰生成器
            KeyGenerator kgen = KeyGenerator.getInstance("AES");

            SecureRandom sr =null;

            // 在4.2以上版本中司致,SecureRandom獲取方式發(fā)生了改變
            if (android.os.Build.VERSION.SDK_INT >= 17) {
                sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
            } else {
                sr = SecureRandom.getInstance("SHA1PRNG");
            }
            sr.setSeed(seed);
            //生成位的AES密碼生成器
            kgen.init(128, sr);
            //生成密鑰
            SecretKey skey = kgen.generateKey();
            //編碼格式
            byte[] raw = skey.getEncoded();
            return raw;

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }
        return null;

    }


    private static byte[] encrypt(byte[] raw, byte[] clear) {

        try {
            //生成一系列擴(kuò)展密鑰挫鸽,并放入一個(gè)數(shù)組中
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES");
            //使用ENCRYPT_MODE模式企量,用skeySpec密碼組裁着,生成AES加密方法
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
            //得到加密數(shù)據(jù)
            byte[] encrypted = cipher.doFinal(clear);
            return encrypted;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static byte[] decrypt(byte[] raw, byte[] encrypted) {

        try {
            //生成一系列擴(kuò)展密鑰挽放,并放入一個(gè)數(shù)組中
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = null;
            cipher = Cipher.getInstance("AES");
            //使用DECRYPT_MODE模式晒屎,用skeySpec密碼組,生成AES解密方法
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            //得到加密數(shù)據(jù)
            byte[] decrypted = cipher.doFinal(encrypted);
            return decrypted;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
        return null;

    }


    //將十進(jìn)制數(shù)轉(zhuǎn)為十六進(jìn)制
    public static String toHex(String txt) {
        return toHex(txt.getBytes());
    }

    //將十六進(jìn)制字符串轉(zhuǎn)換位十進(jìn)制字符串
    public static String fromHex(String hex) {
        return new String(toByte(hex));
    }

    //將十六進(jìn)制字符串轉(zhuǎn)為十進(jìn)制字節(jié)數(shù)組
    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;
    }

    //將十進(jìn)制字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制
    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));
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末樊诺,一起剝皮案震驚了整個(gè)濱河市扶欣,隨后出現(xiàn)的幾起案子鹅巍,更是在濱河造成了極大的恐慌,老刑警劉巖料祠,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骆捧,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡术陶,警方通過(guò)查閱死者的電腦和手機(jī)凑懂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)煤痕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梧宫,“玉大人,你說(shuō)我怎么就攤上這事摆碉√料唬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵巷帝,是天一觀(guān)的道長(zhǎng)忌卤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)楞泼,這世上最難降的妖魔是什么驰徊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任笤闯,我火速辦了婚禮,結(jié)果婚禮上棍厂,老公的妹妹穿的比我還像新娘颗味。我一直安慰自己,他們只是感情好牺弹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布浦马。 她就那樣靜靜地躺著,像睡著了一般张漂。 火紅的嫁衣襯著肌膚如雪晶默。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天航攒,我揣著相機(jī)與錄音磺陡,去河邊找鬼。 笑死漠畜,一個(gè)胖子當(dāng)著我的面吹牛仅政,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盆驹,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼圆丹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了躯喇?” 一聲冷哼從身側(cè)響起辫封,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廉丽,沒(méi)想到半個(gè)月后倦微,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡正压,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年欣福,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焦履。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拓劝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘉裤,到底是詐尸還是另有隱情郑临,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布屑宠,位于F島的核電站厢洞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躺翻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一丧叽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧公你,春花似錦蠢正、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至懦傍,卻和暖如春雹舀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粗俱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工说榆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寸认。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓签财,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親偏塞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唱蒸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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