AES加解密捕虽,js前端和java后端實現(xiàn)

AES加解密,具體的介紹就不說了祟身,覺得自己理解還不夠奥务,具體自己百科

直接上代碼
Javascript前端使用CryptoJS庫,這個庫很多加密都有實現(xiàn)
下載地址:https://github.com/brix/crypto-js/releases
CDN可以看這個:https://www.bootcdn.cn/crypto-js/

// AES 加密袜硫,AES-128, AES-192, AES-256
// AES-128: key和iv都是16個字節(jié)氯葬,16*8=128bit
// AES-192: key和iv都是24個字節(jié),24*8=128bit
// AES-256: key和iv都是32個字節(jié)婉陷,32*8=128bit
// iv 似乎一般都是純數(shù)字
// 例如:AES_encrypt_CBC('需要加密的內(nèi)容', '1234567890123456', '1234567890654321');
function AES_CBC_encrypt(message, key, iv) {
    // utf8字符串—>WordArray對象帚称,WordArray是一個保存32位整數(shù)的數(shù)組,相當于轉(zhuǎn)成了二進制
    let keyHex = CryptoJS.enc.Utf8.parse(key); //
    let ivHex = CryptoJS.enc.Utf8.parse(iv);
    let messageHex = CryptoJS.enc.Utf8.parse(message);
    let encrypted = CryptoJS.AES.encrypt(messageHex, keyHex, {
        iv: ivHex,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();// base64結(jié)果
    //return encrypted.ciphertext.toString();   // 二進制結(jié)果
}
// AES CBC模式解密
function AES_CBC_decrypt(messageBase64, key, iv) {
    // 如果加密后沒有轉(zhuǎn)成base64,那么先要轉(zhuǎn)成base64再傳入
    //let encryptedHexStr = CryptoJS.enc.Hex.parse(word);   // 從二進制文本轉(zhuǎn)成二進制
    //messageBase64 = CryptoJS.enc.Base64.stringify(encryptedHexStr);    // 轉(zhuǎn)成base64
    let keyHex = CryptoJS.enc.Utf8.parse(key);
    let ivHex = CryptoJS.enc.Utf8.parse(iv);
    let decrypt = CryptoJS.AES.decrypt(messageBase64, keyHex, {
        iv: ivHex,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
    return decryptedStr.toString();
}
// AES ECB模式加密秽澳,沒有iv
function AES_ECB_encrypt(message, key) {
    // utf8字符串—>WordArray對象闯睹,WordArray是一個保存32位整數(shù)的數(shù)組,相當于轉(zhuǎn)成了二進制
    let keyHex = CryptoJS.enc.Utf8.parse(key); //
    let messageHex = CryptoJS.enc.Utf8.parse(message);
    let encrypted = CryptoJS.AES.encrypt(messageHex, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();// base64結(jié)果
    //return encrypted.ciphertext.toString();   // 二進制結(jié)果
}
// AES ECB模式解密
function AES_ECB_decrypt(messageBase64, key) {
    // 如果加密后沒有轉(zhuǎn)成base64,那么先要轉(zhuǎn)成base64再傳入
    //let encryptedHexStr = CryptoJS.enc.Hex.parse(word);   // 從二進制文本轉(zhuǎn)成二進制
    //messageBase64 = CryptoJS.enc.Base64.stringify(encryptedHexStr);    // 轉(zhuǎn)成base64
    let keyHex = CryptoJS.enc.Utf8.parse(key);
    let decrypt = CryptoJS.AES.decrypt(messageBase64, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
    return decryptedStr.toString();
}

java后端AES加解密

package com.CryptPacket;


import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;


/**
 * AES加解密工具
 * AES-128: key和iv都是16個字節(jié)担神,16*8=128bit楼吃,java似乎只支持AES-128
 */
public class AESCrypt {
    /**
     * AES CBC 加密
     * @param message 需要加密的字符串
     * @param key   密匙
     * @param iv    IV,需要和key長度相同
     * @return  返回加密后密文妄讯,編碼為base64
     */
    public static String encryptCBC(String message, String key, String iv) {
        final String cipherMode = "AES/CBC/PKCS5Padding";
        final String charsetName = "UTF-8";
        try {
            byte[] content = new byte[0];
            content = message.getBytes(charsetName);
            //
            byte[] keyByte = key.getBytes(charsetName);
            SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
            //
            byte[] ivByte = iv.getBytes(charsetName);
            IvParameterSpec ivSpec = new IvParameterSpec(ivByte);

            Cipher cipher = Cipher.getInstance(cipherMode);
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
            byte[] data = cipher.doFinal(content);
            final Base64.Encoder encoder = Base64.getEncoder();
            final String result = encoder.encodeToString(data);
            return result;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }

        return null;
    }
    /**
     * AES CBC 解密
     * @param messageBase64 密文孩锡,base64編碼
     * @param key   密匙,和加密時相同
     * @param iv    IV捞挥,需要和key長度相同
     * @return  解密后數(shù)據(jù)
     */
    public static String decryptCBC(String messageBase64, String key, String iv) {
        final String cipherMode = "AES/CBC/PKCS5Padding";
        final String charsetName = "UTF-8";
        try {
            final Base64.Decoder decoder = Base64.getDecoder();
            byte[] messageByte = decoder.decode(messageBase64);

            //
            byte[] keyByte = key.getBytes(charsetName);
            SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
            //
            byte[] ivByte = iv.getBytes(charsetName);
            IvParameterSpec ivSpec = new IvParameterSpec(ivByte);

            Cipher cipher = Cipher.getInstance(cipherMode);
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            byte[] content = cipher.doFinal(messageByte);
            String result = new String(content, charsetName);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * AES ECB 加密
     * @param message 需要加密的字符串
     * @param key   密匙
     * @return  返回加密后密文浮创,編碼為base64
     */
    public static String encryptECB(String message, String key) {
        final String cipherMode = "AES/ECB/PKCS5Padding";
        final String charsetName = "UTF-8";
        try {
            byte[] content = new byte[0];
            content = message.getBytes(charsetName);
            //
            byte[] keyByte = key.getBytes(charsetName);
            SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");

            Cipher cipher = Cipher.getInstance(cipherMode);
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
            byte[] data = cipher.doFinal(content);
            final Base64.Encoder encoder = Base64.getEncoder();
            final String result = encoder.encodeToString(data);
            return result;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }

        return null;
    }
    /**
     * AES ECB 解密
     * @param messageBase64 密文,base64編碼
     * @param key   密匙砌函,和加密時相同
     * @return  解密后數(shù)據(jù)
     */
    public static String decryptECB(String messageBase64, String key) {
        final String cipherMode = "AES/ECB/PKCS5Padding";
        final String charsetName = "UTF-8";
        try {
            final Base64.Decoder decoder = Base64.getDecoder();
            byte[] messageByte = decoder.decode(messageBase64);

            //
            byte[] keyByte = key.getBytes(charsetName);
            SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");

            Cipher cipher = Cipher.getInstance(cipherMode);
            cipher.init(Cipher.DECRYPT_MODE, keySpec);
            byte[] content = cipher.doFinal(messageByte);
            String result = new String(content, charsetName);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 測試
     */
    public static void Test()
    {
        String key = "1234567890123456";
        String iv = "1234567890000000";
        String msg = "這是一個測試這是一個測試這是一個測試";
        {
            String encrypt = AESCrypt.encryptCBC(msg, key, iv);
            System.out.println(encrypt);
            String decryptStr = AESCrypt.decryptCBC(encrypt, key, iv);
            System.out.println(decryptStr);
        }
        {
            String encrypt = AESCrypt.encryptECB(msg, key);
            System.out.println(encrypt);
            String decryptStr = AESCrypt.decryptECB(encrypt, key);
            System.out.println(decryptStr);
        }
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斩披,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讹俊,更是在濱河造成了極大的恐慌垦沉,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仍劈,死亡現(xiàn)場離奇詭異厕倍,居然都是意外死亡,警方通過查閱死者的電腦和手機贩疙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門讹弯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來况既,“玉大人,你說我怎么就攤上這事组民“羧裕” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵臭胜,是天一觀的道長莫其。 經(jīng)常有香客問我,道長耸三,這世上最難降的妖魔是什么乱陡? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮仪壮,結(jié)果婚禮上憨颠,老公的妹妹穿的比我還像新娘。我一直安慰自己睛驳,他們只是感情好烙心,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乏沸,像睡著了一般淫茵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蹬跃,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天匙瘪,我揣著相機與錄音,去河邊找鬼蝶缀。 笑死丹喻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的翁都。 我是一名探鬼主播碍论,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柄慰!你這毒婦竟也來了鳍悠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤坐搔,失蹤者是張志新(化名)和其女友劉穎藏研,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體概行,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蠢挡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片业踏。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡禽炬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勤家,到底是詐尸還是另有隱情瞎抛,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布却紧,位于F島的核電站,受9級特大地震影響胎撤,放射性物質(zhì)發(fā)生泄漏晓殊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一伤提、第九天 我趴在偏房一處隱蔽的房頂上張望巫俺。 院中可真熱鬧,春花似錦肿男、人聲如沸介汹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嘹承。三九已至,卻和暖如春如庭,著一層夾襖步出監(jiān)牢的瞬間叹卷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工坪它, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留骤竹,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓往毡,卻偏偏與公主長得像蒙揣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子开瞭,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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