zoukankan      html  css  js  c++  java
  • go lang AES 加密

    golang 加密解密

     

    golang 加密解密

    package main
    
    import (
        "bytes"
        "crypto/aes"
        "crypto/cipher"
        "encoding/base64"
        "errors"
        "fmt"
    )
    
    //高级加密标准(Adevanced Encryption Standard ,AES)
    
    //16,24,32位字符串的话,分别对应AES-128,AES-192,AES-256 加密方法
    //key不能泄露
    var PwdKey = []byte("DIS**#KKKDJJSKDI")
    
    //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 PKCS7UnPadding(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) ([]byte, error) {
        //创建加密算法实例
        block, err := aes.NewCipher(key)
        if err != nil {
            return nil, err
        }
        //获取块大小
        blockSize := block.BlockSize()
        //创建加密客户端实例
        blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
        origData := make([]byte, len(cypted))
        //这个函数也可以用来解密
        blockMode.CryptBlocks(origData, cypted)
        //去除填充字符串
        origData, err = PKCS7UnPadding(origData)
        if err != nil {
            return nil, err
        }
        return origData, err
    }
    
    //加密base64
    func EnPwdCode(pwd []byte) (string, error) {
        result, err := AesEcrypt(pwd, PwdKey)
        if err != nil {
            return "", err
        }
        return base64.StdEncoding.EncodeToString(result), err
    }
    
    //解密
    func DePwdCode(pwd string) ([]byte, error) {
        //解密base64字符串
        pwdByte, err := base64.StdEncoding.DecodeString(pwd)
        if err != nil {
            return nil, err
        }
        //执行AES解密
        return AesDeCrypt(pwdByte, PwdKey)
    
    }
    func main() {
        str := []byte("12fff我是ww.topgoer.com的站长枯藤")
        pwd, _ := EnPwdCode(str)
        bytes, _ := DePwdCode(pwd)
        fmt.Println(string(bytes))
    }
    
  • 相关阅读:
    Azure PowerShell (2) 修改Azure订阅名称
    Windows Azure Platform Introduction (11) 了解Org ID、Windows Azure订阅、账户
    Azure PowerShell (3) 上传证书
    Azure PowerShell (1) PowerShell入门
    Windows Azure Service Bus (2) 队列(Queue)入门
    Windows Azure Service Bus (1) 基础
    Windows Azure Cloud Service (10) Role的生命周期
    Windows Azure Cloud Service (36) 在Azure Cloud Service配置SSL证书
    Android studio 使用心得(一)—android studio快速掌握快捷键
    android 签名、混淆打包
  • 原文地址:https://www.cnblogs.com/whm-blog/p/13895687.html
Copyright © 2011-2022 走看看