package encrypt import ( "bytes" "crypto/aes" "crypto/cipher" "encoding/base64" ) // AESEncrypt Aes加密 key: 24个字符 func AESEncrypt(orig string, key string) (string, error) { // 转成字节数组 origData := []byte(orig) k := []byte(key) // 分组秘钥 // NewCipher该函数限制了输入k的长度必须为16, 24或者32 block, err := aes.NewCipher(k) if err != nil { return "", err } // 获取秘钥块的长度 blockSize := block.BlockSize() // 补全码 origData = PKCS7Padding(origData, blockSize) // 加密模式 blockMode := cipher.NewCBCEncrypter(block, k[:blockSize]) // 创建数组 cryted := make([]byte, len(origData)) // 加密 blockMode.CryptBlocks(cryted, origData) return base64.StdEncoding.EncodeToString(cryted), nil } // AESDecrypt Aes解密 key: 24个字符 func AESDecrypt(crypt string, key string) (string, error) { // 转成字节数组 cryptByte, err := base64.StdEncoding.DecodeString(crypt) if err != nil { return "", err } k := []byte(key) // 分组秘钥 block, err := aes.NewCipher(k) if err != nil { return "", err } // 获取秘钥块的长度 blockSize := block.BlockSize() // 加密模式 blockMode := cipher.NewCBCDecrypter(block, k[:blockSize]) // 创建数组 orig := make([]byte, len(cryptByte)) // 解密 blockMode.CryptBlocks(orig, cryptByte) // 去补全码 orig = PKCS7UnPadding(orig) return string(orig), nil } // PKCS7Padding 补码 // AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。 func PKCS7Padding(ciphertext []byte, blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSize paddingText := bytes.Repeat([]byte{byte(padding)}, padding) return append(ciphertext, paddingText...) } // PKCS7UnPadding 去码 func PKCS7UnPadding(origData []byte) []byte { length := len(origData) unPadding := int(origData[length-1]) return origData[:(length - unPadding)] }