AES算法實現(xiàn)Java和JS互通加解密

實際開發(fā)中客戶端與服務(wù)端的通信內(nèi)容往往需要通過密文傳輸枪狂,本文將介紹可以實現(xiàn)Java與js的互相加解密的AES加密方式

Java語言實現(xiàn)

public class AESTest {

    //static String data = "123456RWEQR";
    static String key = "abcdef0123456789";  //16位
    static String iv = "0123456789abcdef";  //16位

    public static void main(String args[]) throws Exception {
       System.out.println(encryptAES("123456"));
        System.out.println(decryptAES(encryptAES("123456")));
    }

    public static String encryptAES(String data) throws Exception {

        try {

            Cipher cipher = Cipher.getInstance("AES/CBC/NOPadding");   //參數(shù)分別代表 算法名稱/加密模式/數(shù)據(jù)填充方式
            int blockSize = cipher.getBlockSize();

            byte[] dataBytes = data.getBytes();
            int plaintextLength = dataBytes.length;
            if (plaintextLength % blockSize != 0) {
                plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
            }

            byte[] plaintext = new byte[plaintextLength];
            System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
            byte[] encrypted = cipher.doFinal(plaintext);

            return new sun.misc.BASE64Encoder().encode(encrypted);

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String decryptAES(String data) throws Exception {
        try {
            byte[] encrypted1 = new BASE64Decoder().decodeBuffer(data);

            Cipher cipher = Cipher.getInstance("AES/CBC/NOPadding");
            SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
            IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes());

            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            byte[] original = cipher.doFinal(encrypted1);
            String originalString = new String(original);
            return originalString;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

js實現(xiàn)

需要引入 aes.js依賴包 密碼:oeer

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>AES TEST</title>
</head>
<body>
<p>待加密值:123456RWEQR</p>
<p id="p1"></p>
<p id="p2"></p>

<script type="text/javascript" src="js/vendor/jquery-1.12.0.min.js"></script>
<script type="text/javascript" src="js/aes/aes.js"></script>
<script type="text/javascript" src="js/aes/pad-zeropadding.js"></script>
<script type="text/javascript">
    $(function () {
        var data = "123456RWEQR";
        var key = CryptoJS.enc.Latin1.parse('abcdef0123456789');
        var iv = CryptoJS.enc.Latin1.parse('0123456789abcdef');

        //加密
        var encrypted = CryptoJS.AES.encrypt(data, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.ZeroPadding
        });
        $("#p1").text("加密結(jié)果:"+encrypted.toString());
        console.log(encrypted.toString())
        //解密
        var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: iv, padding: CryptoJS.pad.ZeroPadding});
        console.log(decrypted.toString(CryptoJS.enc.Utf8));
        $("#p2").text("解密結(jié)果:"+decrypted.toString(CryptoJS.enc.Utf8));
    })
</script>
</body>
</html>

AES四種常用的加密模式

對稱/分組密碼一般分為流加密(如OFB咏删、CFB等)和塊加密(如ECB淌实、CBC等)。對于流加密概行,需要將分組密碼轉(zhuǎn)化為流模式工作细层。對于塊加密(或稱分組加密),如果要加密超過塊大小的數(shù)據(jù)倦逐,就需要涉及填充和鏈加密模式譬正。


一、 ECB(Electronic Code Book電子密碼本)模式
ECB模式是最早采用和最簡單的模式檬姥,它將加密的數(shù)據(jù)分成若干組曾我,每組的大小跟加密密鑰長度相同,然后每組都用相同的密鑰進(jìn)行加密健民。
優(yōu)點:
1.簡單抒巢; 2.有利于并行計算; 3.誤差不會被傳送秉犹; 
缺點: 1.不能隱藏明文的模式蛉谜; 2.可能對明文進(jìn)行主動攻擊; 因此崇堵,此模式適于加密小消息型诚。

二、CBC(Cipher Block Chaining鸳劳,加密塊鏈)模式
優(yōu)點:
1.不容易主動攻擊,安全性好于ECB,適合傳輸長度長的報文,是SSL狰贯、IPSec的標(biāo)準(zhǔn)」髟 
缺點: 1.不利于并行計算暮现; 2.誤差傳遞; 3.需要初始化向量IV且必須是16字節(jié)

三楚昭、CFB(Cipher FeedBack Mode栖袋,加密反饋)模式
優(yōu)點:
1.隱藏了明文模式; 2.分組密碼轉(zhuǎn)化為流模式; 3.可以及時加密傳送小于分組的數(shù)據(jù); 
缺點: 1.不利于并行計算; 2.誤差傳送:一個明文單元損壞影響多個單元; 3.唯一的IV;

四、OFB(Output FeedBack抚太,輸出反饋)模式
優(yōu)點:
1.隱藏了明文模式; 2.分組密碼轉(zhuǎn)化為流模式; 3.可以及時加密傳送小于分組的數(shù)據(jù); 
缺點: 1.不利于并行計算; 2.對明文的主動攻擊是可能的; 3.誤差傳送:一個明文單元損壞影響多個單元

AES三中數(shù)據(jù)填充方式

PKCS7Padding
Java不支持此方式
PKCS7Padding是缺幾個字節(jié)就補幾個字節(jié)的0

PKCS5Padding
JS不支持此方式
PKCS5Padding是缺幾個字節(jié)就補充幾個字節(jié)的幾塘幅,例如缺8個字節(jié)昔案,就補充8個字節(jié)的8

NOPadding
不補充字節(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市电媳,隨后出現(xiàn)的幾起案子踏揣,更是在濱河造成了極大的恐慌,老刑警劉巖匾乓,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捞稿,死亡現(xiàn)場離奇詭異,居然都是意外死亡拼缝,警方通過查閱死者的電腦和手機(jī)娱局,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咧七,“玉大人衰齐,你說我怎么就攤上這事〖套瑁” “怎么了耻涛?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘟檩。 經(jīng)常有香客問我抹缕,道長,這世上最難降的妖魔是什么芒帕? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任歉嗓,我火速辦了婚禮,結(jié)果婚禮上背蟆,老公的妹妹穿的比我還像新娘。我一直安慰自己哮幢,他們只是感情好带膀,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著橙垢,像睡著了一般垛叨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柜某,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天嗽元,我揣著相機(jī)與錄音,去河邊找鬼喂击。 笑死剂癌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翰绊。 我是一名探鬼主播佩谷,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旁壮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谐檀?” 一聲冷哼從身側(cè)響起抡谐,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桐猬,沒想到半個月后麦撵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡溃肪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年免胃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乍惊。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡杜秸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出润绎,到底是詐尸還是另有隱情撬碟,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布莉撇,位于F島的核電站呢蛤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棍郎。R本人自食惡果不足惜其障,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涂佃。 院中可真熱鬧励翼,春花似錦、人聲如沸辜荠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伯病。三九已至造烁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間午笛,已是汗流浹背惭蟋。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留药磺,地道東北人告组。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像与涡,于是被迫代替她去往敵國和親惹谐。 傳聞我的和親對象是個殘疾皇子持偏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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