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