zoukankan      html  css  js  c++  java
  • 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))
    }
    
    

    相关链接

    http://www.topgoer.com/其他/加密解密/加密解密.html

  • 相关阅读:
    猜拳游戏
    python2.7安装paramiko模板(windows)
    python socket编程(初级)
    Python2.7怎么安装MySQLdb模板(Windows32)
    Python的用户交互模式
    一个java程序员自学IOS开发之路(三)
    一个java程序员自学IOS开发之路(二)
    一个java程序员自学IOS开发之路(一)
    win 7 取得最高权限
    Multiset ------ 多重集合
  • 原文地址:https://www.cnblogs.com/tomtellyou/p/12806649.html
Copyright © 2011-2022 走看看