222 lines
5.9 KiB
Go
222 lines
5.9 KiB
Go
|
|
package utility
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"crypto/aes"
|
|||
|
|
"crypto/cipher"
|
|||
|
|
"crypto/rand"
|
|||
|
|
"encoding/base64"
|
|||
|
|
"errors"
|
|||
|
|
"fmt"
|
|||
|
|
"io"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 加密key
|
|||
|
|
var CryptoKey = "ProxyServer@#(123321)!Keycrypto"
|
|||
|
|
|
|||
|
|
// CryptoHelper 加密帮助类
|
|||
|
|
type CryptoHelper struct {
|
|||
|
|
key []byte
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// NewCryptoHelper 创建新的加密帮助实例
|
|||
|
|
// key: 32字节的加密密钥,如果长度不足会自动填充,超出会截断
|
|||
|
|
func NewCryptoHelper(key string) *CryptoHelper {
|
|||
|
|
// 确保密钥长度为32字节(AES-256)
|
|||
|
|
keyBytes := make([]byte, 32)
|
|||
|
|
copy(keyBytes, []byte(key))
|
|||
|
|
return &CryptoHelper{
|
|||
|
|
key: keyBytes,
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Encrypt 加密字符串
|
|||
|
|
// plaintext: 要加密的明文
|
|||
|
|
// 返回: base64编码的密文和错误信息
|
|||
|
|
func (c *CryptoHelper) Encrypt(plaintext string) (string, error) {
|
|||
|
|
if plaintext == "" {
|
|||
|
|
return "", errors.New("plaintext cannot be empty")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建AES cipher
|
|||
|
|
block, err := aes.NewCipher(c.key)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", fmt.Errorf("failed to create cipher: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 使用GCM模式
|
|||
|
|
gcm, err := cipher.NewGCM(block)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", fmt.Errorf("failed to create GCM: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成随机nonce
|
|||
|
|
nonce := make([]byte, gcm.NonceSize())
|
|||
|
|
if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
|
|||
|
|
return "", fmt.Errorf("failed to generate nonce: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 加密数据
|
|||
|
|
ciphertext := gcm.Seal(nonce, nonce, []byte(plaintext), nil)
|
|||
|
|
|
|||
|
|
// 返回base64编码的结果
|
|||
|
|
return base64.StdEncoding.EncodeToString(ciphertext), nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Decrypt 解密字符串
|
|||
|
|
// ciphertext: base64编码的密文
|
|||
|
|
// 返回: 解密后的明文和错误信息
|
|||
|
|
func (c *CryptoHelper) Decrypt(ciphertext string) (string, error) {
|
|||
|
|
if ciphertext == "" {
|
|||
|
|
return "", errors.New("ciphertext cannot be empty")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// base64解码
|
|||
|
|
data, err := base64.StdEncoding.DecodeString(ciphertext)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", fmt.Errorf("failed to decode base64: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建AES cipher
|
|||
|
|
block, err := aes.NewCipher(c.key)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", fmt.Errorf("failed to create cipher: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 使用GCM模式
|
|||
|
|
gcm, err := cipher.NewGCM(block)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", fmt.Errorf("failed to create GCM: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查数据长度
|
|||
|
|
nonceSize := gcm.NonceSize()
|
|||
|
|
if len(data) < nonceSize {
|
|||
|
|
return "", errors.New("ciphertext too short")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 提取nonce和密文
|
|||
|
|
nonce, cipherData := data[:nonceSize], data[nonceSize:]
|
|||
|
|
|
|||
|
|
// 解密数据
|
|||
|
|
plaintext, err := gcm.Open(nil, nonce, cipherData, nil)
|
|||
|
|
if err != nil {
|
|||
|
|
return "", fmt.Errorf("failed to decrypt: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return string(plaintext), nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// EncryptBytes 加密字节数组
|
|||
|
|
// data: 要加密的字节数组
|
|||
|
|
// 返回: 加密后的字节数组和错误信息
|
|||
|
|
func (c *CryptoHelper) EncryptBytes(data []byte) ([]byte, error) {
|
|||
|
|
if len(data) == 0 {
|
|||
|
|
return nil, errors.New("data cannot be empty")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建AES cipher
|
|||
|
|
block, err := aes.NewCipher(c.key)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("failed to create cipher: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 使用GCM模式
|
|||
|
|
gcm, err := cipher.NewGCM(block)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("failed to create GCM: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 生成随机nonce
|
|||
|
|
nonce := make([]byte, gcm.NonceSize())
|
|||
|
|
if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
|
|||
|
|
return nil, fmt.Errorf("failed to generate nonce: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 加密数据
|
|||
|
|
ciphertext := gcm.Seal(nonce, nonce, data, nil)
|
|||
|
|
|
|||
|
|
return ciphertext, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// DecryptBytes 解密字节数组
|
|||
|
|
// ciphertext: 加密后的字节数组
|
|||
|
|
// 返回: 解密后的字节数组和错误信息
|
|||
|
|
func (c *CryptoHelper) DecryptBytes(ciphertext []byte) ([]byte, error) {
|
|||
|
|
if len(ciphertext) == 0 {
|
|||
|
|
return nil, errors.New("ciphertext cannot be empty")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 创建AES cipher
|
|||
|
|
block, err := aes.NewCipher(c.key)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("failed to create cipher: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 使用GCM模式
|
|||
|
|
gcm, err := cipher.NewGCM(block)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("failed to create GCM: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查数据长度
|
|||
|
|
nonceSize := gcm.NonceSize()
|
|||
|
|
if len(ciphertext) < nonceSize {
|
|||
|
|
return nil, errors.New("ciphertext too short")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 提取nonce和密文
|
|||
|
|
nonce, cipherData := ciphertext[:nonceSize], ciphertext[nonceSize:]
|
|||
|
|
|
|||
|
|
// 解密数据
|
|||
|
|
plaintext, err := gcm.Open(nil, nonce, cipherData, nil)
|
|||
|
|
if err != nil {
|
|||
|
|
return nil, fmt.Errorf("failed to decrypt: %w", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return plaintext, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GenerateKey 生成随机密钥
|
|||
|
|
// 返回: 32字节的随机密钥字符串
|
|||
|
|
func GenerateKey() (string, error) {
|
|||
|
|
key := make([]byte, 32)
|
|||
|
|
if _, err := io.ReadFull(rand.Reader, key); err != nil {
|
|||
|
|
return "", fmt.Errorf("failed to generate key: %w", err)
|
|||
|
|
}
|
|||
|
|
return base64.StdEncoding.EncodeToString(key), nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// QuickEncrypt 快速加密函数(使用默认密钥)
|
|||
|
|
// plaintext: 要加密的明文
|
|||
|
|
// key: 加密密钥
|
|||
|
|
// 返回: base64编码的密文和错误信息
|
|||
|
|
func QuickEncrypt(plaintext, key string) (string, error) {
|
|||
|
|
crypto := NewCryptoHelper(key)
|
|||
|
|
return crypto.Encrypt(plaintext)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// QuickDecrypt2 快速解密函数(使用默认密钥)
|
|||
|
|
// ciphertext: base64编码的密文
|
|||
|
|
// 返回: 解密后的明文和错误信息
|
|||
|
|
func QuickDecrypt2(ciphertext string) (string, error) {
|
|||
|
|
crypto := NewCryptoHelper(CryptoKey)
|
|||
|
|
return crypto.Decrypt(ciphertext)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// QuickEncrypt2 快速加密函数(使用默认密钥)
|
|||
|
|
// plaintext: 要加密的明文
|
|||
|
|
// 返回: base64编码的密文和错误信息
|
|||
|
|
func QuickEncrypt2(plaintext string) (string, error) {
|
|||
|
|
crypto := NewCryptoHelper(CryptoKey)
|
|||
|
|
return crypto.Encrypt(plaintext)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// QuickDecrypt 快速解密函数(使用默认密钥)
|
|||
|
|
// ciphertext: base64编码的密文
|
|||
|
|
// key: 解密密钥
|
|||
|
|
// 返回: 解密后的明文和错误信息
|
|||
|
|
func QuickDecrypt(ciphertext, key string) (string, error) {
|
|||
|
|
crypto := NewCryptoHelper(key)
|
|||
|
|
return crypto.Decrypt(ciphertext)
|
|||
|
|
}
|