12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 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
- }
|