package utils import ( "bytes" "crypto/aes" "crypto/cipher" "crypto/rand" "errors" "io" ) // GenerateAESKey 生成 AES 密钥 func GenerateAESKey(len int) ([]byte, error) { key := make([]byte, len) _, err := io.ReadFull(rand.Reader, key) if err != nil { return nil, err } return key, nil } func pad(buf []byte, blockSize int) []byte { padding := blockSize - (len(buf) % blockSize) padtext := bytes.Repeat([]byte{byte(padding)}, padding) return append(buf, padtext...) } // EncryptWithAES 使用 AES 加密数据 func EncryptWithAES(key []byte, plaintext []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } plaintext = pad(plaintext, aes.BlockSize) ciphertext := make([]byte, aes.BlockSize+len(plaintext)) iv := ciphertext[:aes.BlockSize] if _, err = io.ReadFull(rand.Reader, iv); err != nil { return nil, err } stream := cipher.NewCFBEncrypter(block, iv) stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext) return ciphertext, nil } // DecryptWithAES 使用 AES 解密数据 func DecryptWithAES(key []byte, ciphertext []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err } if len(ciphertext) < aes.BlockSize { return nil, errors.New("ciphertext too short") } iv := ciphertext[:aes.BlockSize] ciphertext = ciphertext[aes.BlockSize:] stream := cipher.NewCFBDecrypter(block, iv) stream.XORKeyStream(ciphertext, ciphertext) return ciphertext, nil }