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  }