iedc-go/example/app/AES.go
2022-05-06 13:08:13 +08:00

119 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package app
import (
"bytes"
"code.hoteas.com/golang/hotime/common"
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"errors"
"fmt"
)
//高级加密标准Adevanced Encryption Standard ,AES
//16,24,32位字符串的话分别对应AES-128AES-192AES-256 加密方法
//key不能泄露
var PwdKey = []byte("mif022h3g9geAHUHY432,:da1adag389")
//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) (bytes []byte, err error) {
//异常处理
defer func() {
if e := recover(); e != nil {
//that.SetError(errors.New(fmt.Sprint(err)), LOG_FMT)
fmt.Println(err)
err = errors.New(common.ObjToStr(e))
}
}()
//创建加密算法实例
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 {
fmt.Println(err)
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))
//}