76 lines
2.0 KiB
Go
76 lines
2.0 KiB
Go
package encrypt
|
||
|
||
import (
|
||
"bytes"
|
||
"crypto/aes"
|
||
"crypto/cipher"
|
||
"encoding/base64"
|
||
)
|
||
|
||
var AES_KEY = "ZRxS9kLzR90GLpCFabUWMKAw"
|
||
|
||
// AESEncrypt Aes加密 key: 24个字符
|
||
func AESEncrypt(orig string, key string) (string, error) {
|
||
// 转成字节数组
|
||
origData := []byte(orig)
|
||
k := []byte(key)
|
||
// 分组秘钥
|
||
// NewCipher该函数限制了输入k的长度必须为16, 24或者32
|
||
block, err := aes.NewCipher(k)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
// 获取秘钥块的长度
|
||
blockSize := block.BlockSize()
|
||
// 补全码
|
||
origData = PKCS7Padding(origData, blockSize)
|
||
// 加密模式
|
||
blockMode := cipher.NewCBCEncrypter(block, k[:blockSize])
|
||
// 创建数组
|
||
cryted := make([]byte, len(origData))
|
||
// 加密
|
||
blockMode.CryptBlocks(cryted, origData)
|
||
return base64.StdEncoding.EncodeToString(cryted), nil
|
||
}
|
||
|
||
// AESDecrypt Aes解密 key: 24个字符
|
||
func AESDecrypt(crypt string, key string) (string, error) {
|
||
// 转成字节数组
|
||
cryptByte, err := base64.StdEncoding.DecodeString(crypt)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
k := []byte(key)
|
||
// 分组秘钥
|
||
block, err := aes.NewCipher(k)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
// 获取秘钥块的长度
|
||
blockSize := block.BlockSize()
|
||
// 加密模式
|
||
blockMode := cipher.NewCBCDecrypter(block, k[:blockSize])
|
||
// 创建数组
|
||
orig := make([]byte, len(cryptByte))
|
||
// 解密
|
||
blockMode.CryptBlocks(orig, cryptByte)
|
||
// 去补全码
|
||
orig = PKCS7UnPadding(orig)
|
||
return string(orig), nil
|
||
}
|
||
|
||
// PKCS7Padding 补码
|
||
// AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。
|
||
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
|
||
padding := blockSize - len(ciphertext)%blockSize
|
||
paddingText := bytes.Repeat([]byte{byte(padding)}, padding)
|
||
return append(ciphertext, paddingText...)
|
||
}
|
||
|
||
// PKCS7UnPadding 去码
|
||
func PKCS7UnPadding(origData []byte) []byte {
|
||
length := len(origData)
|
||
unpadding := int(origData[length-1])
|
||
return origData[:(length - unpadding)]
|
||
}
|