AES加解密,vue加密,goframe解密代码
AES CBC模式的加解密示例,前端使用Vue.js,后端使用GoFrame框架。
前端加密代码(Vue.js):
import CryptoJS from 'crypto-js'
// 加密
export function encrypt(data, key, iv) {
key = CryptoJS.enc.Utf8.parse(key)
iv = CryptoJS.enc.Utf8.parse(iv)
let encrypted = CryptoJS.AES.encrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return encrypted.toString()
}
// 解密
export function decrypt(data, key, iv) {
key = CryptoJS.enc.Utf8.parse(key)
iv = CryptoJS.enc.Utf8.parse(iv)
let decrypted = CryptoJS.AES.decrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
})
return decrypted.toString(CryptoJS.enc.Utf8)
}
后端解密代码(GoFrame框架):
import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
)
// 解密函数
func AesDecrypt(crypted, key, iv string) (string, error) {
keyBytes := []byte(key)
ivBytes := []byte(iv)
cryptedBytes, err := base64.StdEncoding.DecodeString(crypted)
if err != nil {
return "", err
}
block, err := aes.NewCipher(keyBytes)
if err != nil {
return "", err
}
blockMode := cipher.NewCBCDecrypter(block, ivBytes)
origData := make([]byte, len(cryptedBytes))
blockMode.CryptBlocks(origData, cryptedBytes)
origData = PKCS7UnPadding(origData)
return string(origData), nil
}
// PKCS7 Padding
func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
// PKCS7 UnPadding
func PKCS7UnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
使用示例:
// 前端加密
let data = 'Hello World'
let key = '1234567890123456'
let iv = '1234567890123456'
let encryptedData = encrypt(data, key, iv)
// 后端解密
decryptedData, err := AesDecrypt(encryptedData, key, iv)
if err != nil {
// 解密失败
}
报错: exception recovered: runtime error: slice bounds out of range [:-91]
解释: 这个异常的原因可能是在解密过程中出现了越界的情况,具体原因需要查看代码并进行调试。
一种可能的情况是解密的密钥或向量不正确,导致解密后的明文长度不足,从而导致越界异常。另一种可能是解密的密文本身就存在问题,比如长度不正确或格式错误。
建议检查密钥、向量和密文是否正确,以及解密代码中的边界情况是否处理完备,如果仍然无法解决问题,可以提供更多的代码信息以便进一步分析。