加密:
func AESEncodeStr(src, key string) (string, error) { block, err := aes.NewCipher([]byte(key)) if err != nil { return "", err } if src == "" { return "", err } ecb := cipher.NewCBCEncrypter(block, []byte(key)[:block.BlockSize()]) content := []byte(src) content = PKCS5Padding(content, block.BlockSize()) crypted := make([]byte, len(content)) if len(content)%ecb.BlockSize() != 0 { return "", errors.New("error length") } ecb.CryptBlocks(crypted, content) data := base64.StdEncoding.EncodeToString(crypted) return data, nil }
解密:
func AESDecodeStr(crypt, key string) (string, error) { crypted, err := base64.StdEncoding.DecodeString(crypt) if err != nil || len(crypted) == 0 { return "", err } block, err := aes.NewCipher([]byte(key)) if err != nil { return "", err } ecb := cipher.NewCBCDecrypter(block, []byte(key)[:block.BlockSize()]) decrypted := make([]byte, len(crypted)) if len(crypted)%ecb.BlockSize() != 0 { return "", errors.New("error length") } ecb.CryptBlocks(decrypted, crypted) return string(PKCS5Trimming(decrypted)), nil }
func PKCS5Padding(ciphertext []byte, blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSize padtext := bytes.Repeat([]byte{byte(padding)}, padding) return append(ciphertext, padtext...) } func PKCS5Trimming(encrypt []byte) []byte { padding := encrypt[len(encrypt)-1] return encrypt[:len(encrypt)-int(padding)] }