golang AES对称加解密

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"crypto/rsa"
	"crypto/tls"
	"crypto/x509"
	"encoding/base64"
	"errors"
	"github.com/go-gomail/gomail"
	"io"
)

const (
	aesTable = "ywlSRb80TaCQ4b7b"
)

var (
	aesBlock       cipher.Block
	ErrAESTextSize = errors.New("ciphertext is not a multiple of the block size")
	ErrAESPadding  = errors.New("cipher padding size error")
)


func init() {
	var err error
	aesBlock, err = aes.NewCipher([]byte(aesTable))
	if err != nil {
		panic(err)
	}
}


// AES解密
func aesDecrypt(src []byte) ([]byte, error) {
	// 长度不能小于aes.Blocksize
	if len(src) < aes.BlockSize*2 || len(src)%aes.BlockSize != 0 {
		return nil, ErrAESTextSize
	}
	srcLen := len(src) - aes.BlockSize
	decryptText := make([]byte, srcLen)
	iv := src[srcLen:]
	mode := cipher.NewCBCDecrypter(aesBlock, iv)
	mode.CryptBlocks(decryptText, src[:srcLen])
	paddingLen := int(decryptText[srcLen-1])
	if paddingLen > 16 {
		return nil, ErrAESPadding
	}
	return decryptText[:srcLen-paddingLen], nil
}


// AES加密

func aesEncrypt(src []byte) ([]byte, error) {
	padLen := aes.BlockSize - (len(src) % aes.BlockSize)
	for i := 0; i < padLen; i++ {
		src = append(src, byte(padLen))
	}
	srcLen := len(src)
	encryptText := make([]byte, srcLen+aes.BlockSize)
	iv := encryptText[srcLen:]
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
		return nil, err
	}
	mode := cipher.NewCBCEncrypter(aesBlock, iv)
	mode.CryptBlocks(encryptText[:srcLen], src)
	return encryptText, nil
}

func main() {
	en, err := aesEncrypt([]byte("he"))
	if err != nil {
		panic(err)
	}
	println(string(en))
	de, err := aesDecrypt(en)
	if err != nil {
		panic(err)
	}
	println(string(de))
}

  

原文地址:https://www.cnblogs.com/zipon/p/12857546.html