package auth import ( "crypto/aes" "crypto/cipher" "crypto/rand" "encoding/base64" "fmt" "io" ) // GenerateAESKey 生成一个随机的AES密钥 func GenerateAESKey(keySize int) ([]byte, error) { if keySize != 16 && keySize != 24 && keySize != 32 { return nil, fmt.Errorf("unsupported key size: %d", keySize) } key := make([]byte, keySize) _, err := io.ReadFull(rand.Reader, key) if err != nil { return nil, err } return key, nil } // AESEncrypt 使用AES CBC模式加密数据 func AESEncrypt(key []byte, plaintext []byte) (string, error) { block, err := aes.NewCipher(key) if err != nil { return "", err } // 生成一个随机的初始化向量 ciphertext := make([]byte, aes.BlockSize+len(plaintext)) iv := ciphertext[:aes.BlockSize] if _, err := io.ReadFull(rand.Reader, iv); err != nil { return "", err } mode := cipher.NewCBCEncrypter(block, iv) mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext) // 返回Base64编码后的字符串 return base64.StdEncoding.EncodeToString(ciphertext), nil } // AESDecrypt 使用AES CBC模式解密数据 func AESDecrypt(key []byte, ciphertext string) (string, error) { ciphertextBytes, err := base64.StdEncoding.DecodeString(ciphertext) if err != nil { return "", err } block, err := aes.NewCipher(key) if err != nil { return "", err } if len(ciphertextBytes) < aes.BlockSize { return "", fmt.Errorf("ciphertext too short") } iv := ciphertextBytes[:aes.BlockSize] ciphertextBytes = ciphertextBytes[aes.BlockSize:] mode := cipher.NewCBCDecrypter(block, iv) mode.CryptBlocks(ciphertextBytes, ciphertextBytes) // 去除PKCS#7填充 unPadded := unPad(ciphertextBytes) return string(unPadded), nil } // unPad 去除PKCS#7填充 func unPad(src []byte) []byte { padding := src[len(src)-1] return src[:len(src)-int(padding)] } func main() { key := []byte("this is a key123") // 16字节长的密钥 plaintext := []byte("Hello, World!") // 加密 encrypted, err := AESEncrypt(key, plaintext) if err != nil { fmt.Println("Error encrypting:", err) return } fmt.Println("Encrypted:", encrypted) // 解密 decrypted, err := AESDecrypt(key, encrypted) if err != nil { fmt.Println("Error decrypting:", err) return } fmt.Println("Decrypted:", decrypted) }