|
|
@ -0,0 +1,75 @@ |
|
|
|
package helper |
|
|
|
|
|
|
|
import ( |
|
|
|
"bytes" |
|
|
|
"crypto/aes" |
|
|
|
"crypto/cipher" |
|
|
|
"encoding/base64" |
|
|
|
) |
|
|
|
|
|
|
|
// PKCS7Padding 对数据进行填充
|
|
|
|
func PKCS7Padding(data []byte, blockSize int) []byte { |
|
|
|
padding := blockSize - len(data)%blockSize |
|
|
|
padtext := bytes.Repeat([]byte{byte(padding)}, padding) |
|
|
|
return append(data, padtext...) |
|
|
|
} |
|
|
|
|
|
|
|
// PKCS7UnPadding 去除填充
|
|
|
|
func PKCS7UnPadding(data []byte) []byte { |
|
|
|
length := len(data) |
|
|
|
unpadding := int(data[length-1]) |
|
|
|
return data[:(length - unpadding)] |
|
|
|
} |
|
|
|
|
|
|
|
// EncryptAES 对数据进行 AES 加密
|
|
|
|
func EncryptAES(str, key_str string) (string, error) { |
|
|
|
plaintext := []byte(str) |
|
|
|
key := []byte(key_str) |
|
|
|
// 创建一个新的 AES 块
|
|
|
|
block, err := aes.NewCipher(key) |
|
|
|
if err != nil { |
|
|
|
return "", err |
|
|
|
} |
|
|
|
|
|
|
|
// 块大小
|
|
|
|
blockSize := block.BlockSize() |
|
|
|
// 对明文进行填充
|
|
|
|
plaintext = PKCS7Padding(plaintext, blockSize) |
|
|
|
|
|
|
|
// 创建一个 CBC 模式的加密块
|
|
|
|
ciphertext := make([]byte, len(plaintext)) |
|
|
|
mode := cipher.NewCBCEncrypter(block, key[:blockSize]) |
|
|
|
// 加密数据
|
|
|
|
mode.CryptBlocks(ciphertext, plaintext) |
|
|
|
|
|
|
|
// 将加密结果进行 Base64 编码
|
|
|
|
return base64.StdEncoding.EncodeToString(ciphertext), nil |
|
|
|
} |
|
|
|
|
|
|
|
// DecryptAES 对数据进行 AES 解密
|
|
|
|
func DecryptAES(ciphertext, key_str string) ([]byte, error) { |
|
|
|
key := []byte(key_str) |
|
|
|
// 对 Base64 编码的密文进行解码
|
|
|
|
ciphertextBytes, err := base64.StdEncoding.DecodeString(ciphertext) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
// 创建一个新的 AES 块
|
|
|
|
block, err := aes.NewCipher(key) |
|
|
|
if err != nil { |
|
|
|
return nil, err |
|
|
|
} |
|
|
|
|
|
|
|
// 块大小
|
|
|
|
blockSize := block.BlockSize() |
|
|
|
// 创建一个 CBC 模式的解密块
|
|
|
|
mode := cipher.NewCBCDecrypter(block, key[:blockSize]) |
|
|
|
// 解密数据
|
|
|
|
plaintext := make([]byte, len(ciphertextBytes)) |
|
|
|
mode.CryptBlocks(plaintext, ciphertextBytes) |
|
|
|
|
|
|
|
// 去除填充
|
|
|
|
plaintext = PKCS7UnPadding(plaintext) |
|
|
|
return plaintext, nil |
|
|
|
} |