github.com/sereiner/library@v0.0.0-20200518095232-1fa3e640cc5f/security/aes/aes.go (about) 1 package aes 2 3 import ( 4 "crypto/aes" 5 "crypto/cipher" 6 "strings" 7 8 "github.com/sereiner/library/encoding/base64" 9 ) 10 11 func getKey(key string) []byte { 12 arrKey := []byte(key) 13 keyLen := len(key) 14 if keyLen >= 32 { 15 //取前32个字节 16 return arrKey[:32] 17 } 18 if keyLen >= 24 { 19 //取前24个字节 20 return arrKey[:24] 21 } 22 //取前16个字节 23 return arrKey[:16] 24 } 25 26 //Encrypt 加密字符串 27 func Encrypt(msg string, key string) (string, error) { 28 keyBytes := getKey(key) 29 var iv = keyBytes[:aes.BlockSize] 30 encrypted := make([]byte, len(msg)) 31 aesBlockEncrypter, err := aes.NewCipher(keyBytes) 32 if err != nil { 33 return "", err 34 } 35 aesEncrypter := cipher.NewCFBEncrypter(aesBlockEncrypter, iv) 36 aesEncrypter.XORKeyStream(encrypted, []byte(msg)) 37 return base64.Encode(string(encrypted)), nil 38 } 39 40 //Decrypt 解密字符串 41 func Decrypt(src string, key string) (msg string, err error) { 42 defer func() { 43 //错误处理 44 if e := recover(); e != nil { 45 err = e.(error) 46 } 47 }() 48 content, err := base64.Decode(src) 49 if err != nil { 50 return 51 } 52 keyBytes := getKey(key) 53 var iv = keyBytes[:aes.BlockSize] 54 decrypted := make([]byte, len(content)) 55 var aesBlockDecrypter cipher.Block 56 aesBlockDecrypter, err = aes.NewCipher(keyBytes) 57 if err != nil { 58 return "", err 59 } 60 aesDecrypter := cipher.NewCFBDecrypter(aesBlockDecrypter, iv) 61 aesDecrypter.XORKeyStream(decrypted, []byte(content)) 62 return strings.TrimSpace(string(decrypted)), nil 63 }