javascript 和 golang 前后端使用 AES 加密傳輸數(shù)據(jù)

golang

package crypto

import (
    "bytes"
    "crypto/aes"
    "crypto/cipher"
    "encoding/hex"
    "errors"
    "fmt"
)
//參考文檔
//http://www.topgoer.com/%E5%85%B6%E4%BB%96/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86/%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86.html
//高級(jí)加密標(biāo)準(zhǔn)(Adevanced Encryption Standard ,AES)

//16,24,32位字符串的話(huà)种远,分別對(duì)應(yīng)AES-128串稀,AES-192,AES-256 加密方法
//key不能泄露
//var PwdKey = []byte("DIS**#KKKDJJSKDI")
var PwdKey = "linkbook1qaz*WSX"

//PKCS7 填充模式
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    //Repeat()函數(shù)的功能是把切片[]byte{byte(padding)}復(fù)制padding個(gè)搁嗓,然后合并成新的字節(jié)切片返回
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}

//填充的反向操作,刪除填充字符串
func PKCS7UnPadding1(origData []byte) ([]byte, error) {
    //獲取數(shù)據(jù)長(zhǎng)度
    length := len(origData)
    if length == 0 {
        return nil, errors.New("加密字符串錯(cuò)誤矿酵!")
    } else {
        //獲取填充字符串長(zhǎng)度
        unpadding := int(origData[length-1])
        //截取切片浪箭,刪除填充字節(jié)婴梧,并且返回明文
        return origData[:(length - unpadding)], nil
    }
}

//實(shí)現(xiàn)加密
func AesEcrypt(origData []byte, key []byte) ([]byte, error) {
    //創(chuàng)建加密算法實(shí)例
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    //獲取塊的大小
    blockSize := block.BlockSize()
    //對(duì)數(shù)據(jù)進(jìn)行填充下梢,讓數(shù)據(jù)長(zhǎng)度滿(mǎn)足需求
    origData = PKCS7Padding(origData, blockSize)
    //采用AES加密方法中CBC加密模式
    blocMode := cipher.NewCBCEncrypter(block, key[:blockSize])
    crypted := make([]byte, len(origData))
    //執(zhí)行加密
    blocMode.CryptBlocks(crypted, origData)
    return crypted, nil
}

//實(shí)現(xiàn)解密
func AesDeCrypt(cypted []byte, key []byte) (string, error) {
    //創(chuàng)建加密算法實(shí)例
    block, err := aes.NewCipher(key)
    if err != nil {
        return "", err
    }
    //獲取塊大小
    blockSize := block.BlockSize()
    //創(chuàng)建加密客戶(hù)端實(shí)例
    blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
    origData := make([]byte, len(cypted))
    //這個(gè)函數(shù)也可以用來(lái)解密
    blockMode.CryptBlocks(origData, cypted)
    //去除填充字符串
    origData, err = PKCS7UnPadding1(origData)
    if err != nil {
        return "", err
    }
    return string(origData), err
}

//加密base64
func EnPwdCode(pwdStr string) string {
    pwd := []byte(pwdStr)
    result, err := AesEcrypt(pwd, []byte(PwdKey))
    if err != nil {
        return ""
    }
    return hex.EncodeToString(result)
}

//解密
func DePwdCode(pwd string) string {
    temp, _ := hex.DecodeString(pwd)
    //執(zhí)行AES解密
    res, _:=AesDeCrypt(temp, []byte(PwdKey))
    return res
}

func main() {

    //aes加密
    destring:=`{"name":"菜鳥(niǎo)教程11","site":"http://www.runoob.com"}`
    deStr := EnPwdCode(destring)
    fmt.Println(deStr) //4f4d74c15e0ad4afb323a17927b1176ecb0c95ecbdf8e776ceb093499e3ff4c45157b007ae7dff1688ac2d2bf9fef28644922a1b3bbc6ef5881cb1ed0dff298a

    //aes解密
    decodeStr := DePwdCode("4f4d74c15e0ad4afb323a17927b1176ecb0c95ecbdf8e776ceb093499e3ff4c45157b007ae7dff1688ac2d2bf9fef28644922a1b3bbc6ef5881cb1ed0dff298a")
    fmt.Println(decodeStr) //{"name":"菜鳥(niǎo)教程11","site":"http://www.runoob.com"}
}

前端javascript的代碼

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Title</title>

</head>
<script src="./aes.js"></script>

<body>

  <script>
    // var key1 = "1234567887654321";
    var key1 = "linkbook1qaz*WSX";
    // var plaintText = '"name"="lisi",age=18'; // 明文
    var str = {
      name: "菜鳥(niǎo)教程11",
      site: "http://www.runoob.com"
    }
    var plaintText = JSON.stringify(str)
    console.log(plaintText)
    endata = encodeAes(plaintText)
    //加密
    function encodeAes(plaintTextStr) {
      var key = CryptoJS.enc.Utf8.parse(key1);

      var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {
        iv: key,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      });

      // console.log("加密前:" + plaintText);
      // console.log("加密后:" + encryptedData);    //Pkcs7:   WoCzvm6eZiM4/bx5o/CzGw==

      // console.log("加密后 base64:" + encryptedData.ciphertext.toString(CryptoJS.enc.Base64));
      encryptedData = encryptedData.ciphertext.toString();
      console.log("加密后-no-hex:" + encryptedData);
      return encryptedData
    }


    // 解密
    endata1 = "46ce4f5bb33896c4c75a24a46c6f16c32991228f40831003b98acffe41fee255f892d68283b8a1b07a4dfd66622b6c50685854e918ac059d5d8e969b3b105c6b";
    decodeAes(endata1)
    function decodeAes(encryptedDataStr) {
      var key = CryptoJS.enc.Utf8.parse(key1);
      var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedDataStr);
      // console.log("解密前hex:" + encryptedHexStr);
      var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);
      // console.log("解密前:" + encryptedBase64Str);

      var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, {
        iv: key,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      });

      var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);
      console.log("解密后:" + decryptedStr);

    }

  </script>
</body>

</html>

參考文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怔球,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浮还,老刑警劉巖竟坛,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钧舌,居然都是意外死亡担汤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)洼冻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崭歧,“玉大人,你說(shuō)我怎么就攤上這事撞牢÷誓耄” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵屋彪,是天一觀的道長(zhǎng)所宰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)畜挥,這世上最難降的妖魔是什么仔粥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蟹但,結(jié)果婚禮上躯泰,老公的妹妹穿的比我還像新娘。我一直安慰自己华糖,他們只是感情好麦向,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著客叉,像睡著了一般磕蛇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上十办,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天秀撇,我揣著相機(jī)與錄音,去河邊找鬼向族。 笑死呵燕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的件相。 我是一名探鬼主播再扭,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼氧苍,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泛范?” 一聲冷哼從身側(cè)響起让虐,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎罢荡,沒(méi)想到半個(gè)月后赡突,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡区赵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年惭缰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笼才。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漱受,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骡送,到底是詐尸還是另有隱情昂羡,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布摔踱,位于F島的核電站紧憾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昌渤。R本人自食惡果不足惜赴穗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膀息。 院中可真熱鬧般眉,春花似錦、人聲如沸潜支。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)冗酿。三九已至埠对,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裁替,已是汗流浹背项玛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弱判,地道東北人襟沮。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親开伏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膀跌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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