美文网首页
javascript 和 golang 前后端使用 AES 加密

javascript 和 golang 前后端使用 AES 加密

作者: 千罹 | 来源:发表于2021-03-01 13:21 被阅读0次

    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
    //高级加密标准(Adevanced Encryption Standard ,AES)
    
    //16,24,32位字符串的话,分别对应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()函数的功能是把切片[]byte{byte(padding)}复制padding个,然后合并成新的字节切片返回
        padtext := bytes.Repeat([]byte{byte(padding)}, padding)
        return append(ciphertext, padtext...)
    }
    
    //填充的反向操作,删除填充字符串
    func PKCS7UnPadding1(origData []byte) ([]byte, error) {
        //获取数据长度
        length := len(origData)
        if length == 0 {
            return nil, errors.New("加密字符串错误!")
        } else {
            //获取填充字符串长度
            unpadding := int(origData[length-1])
            //截取切片,删除填充字节,并且返回明文
            return origData[:(length - unpadding)], nil
        }
    }
    
    //实现加密
    func AesEcrypt(origData []byte, key []byte) ([]byte, error) {
        //创建加密算法实例
        block, err := aes.NewCipher(key)
        if err != nil {
            return nil, err
        }
        //获取块的大小
        blockSize := block.BlockSize()
        //对数据进行填充,让数据长度满足需求
        origData = PKCS7Padding(origData, blockSize)
        //采用AES加密方法中CBC加密模式
        blocMode := cipher.NewCBCEncrypter(block, key[:blockSize])
        crypted := make([]byte, len(origData))
        //执行加密
        blocMode.CryptBlocks(crypted, origData)
        return crypted, nil
    }
    
    //实现解密
    func AesDeCrypt(cypted []byte, key []byte) (string, error) {
        //创建加密算法实例
        block, err := aes.NewCipher(key)
        if err != nil {
            return "", err
        }
        //获取块大小
        blockSize := block.BlockSize()
        //创建加密客户端实例
        blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
        origData := make([]byte, len(cypted))
        //这个函数也可以用来解密
        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)
        //执行AES解密
        res, _:=AesDeCrypt(temp, []byte(PwdKey))
        return res
    }
    
    func main() {
    
        //aes加密
        destring:=`{"name":"菜鸟教程11","site":"http://www.runoob.com"}`
        deStr := EnPwdCode(destring)
        fmt.Println(deStr) //4f4d74c15e0ad4afb323a17927b1176ecb0c95ecbdf8e776ceb093499e3ff4c45157b007ae7dff1688ac2d2bf9fef28644922a1b3bbc6ef5881cb1ed0dff298a
    
        //aes解密
        decodeStr := DePwdCode("4f4d74c15e0ad4afb323a17927b1176ecb0c95ecbdf8e776ceb093499e3ff4c45157b007ae7dff1688ac2d2bf9fef28644922a1b3bbc6ef5881cb1ed0dff298a")
        fmt.Println(decodeStr) //{"name":"菜鸟教程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: "菜鸟教程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>
    

    参考文章

    相关文章

      网友评论

          本文标题:javascript 和 golang 前后端使用 AES 加密

          本文链接:https://www.haomeiwen.com/subject/doqafltx.html