遇到一个老项目重构工作,客户端采用C# 对请求参数使用 AES256加密,模式是CBC,填充应该是C#AES加密的默认填充方式,而服务器现采用golang进行重构,遇到解密参数时,发现解密出来的明文只有正确明文的一半
正常解密出的数据: "FC5872C8A556912318C4AC35D035B322"
现在golang解密出来的数据 :"[{t��&�Rnёr�18C4AC35D035B322"
这很费解,去网上找了很多现成的解密代码,搬砖过去要么截出来全是乱码,要么就只有一半
下面是客户端的加密和服务端的解密代码
// 加密
public static string Encrypt (string str, string key) {
AesCryptoServiceProvider aesCryptoProvider = new AesCryptoServiceProvider();
byte[] byteBuff;
try
{
aesCryptoProvider.Key = Encoding.UTF8.GetBytes(key);
aesCryptoProvider.GenerateIV();
aesCryptoProvider.IV = aesCryptoProvider.IV;
byteBuff = Encoding.UTF8.GetBytes(str);
byte[] encoded = aesCryptoProvider.CreateEncryptor().TransformFinalBlock(byteBuff, 0, byteBuff.Length);
string ivHexString = ToHexString(aesCryptoProvider.IV);
string encodedHexString = ToHexString(encoded);
return ivHexString + ':' + encodedHexString; // 此处字符串拼接请忽略
}
catch (Exception ex)
{
Console.WriteLine(ex);
return null;
}
}
//pkcs7UnPadding 填充的反向操作
func pkcs7UnPadding(data []byte) ([]byte, error) {
length := len(data)
if length == 0 {
return nil, errors.New("加密字符串错误!")
}
//获取填充的个数
unPadding := int(data[length-1])
return data[:(length - unPadding)], nil
}
//AesDecrypt 解密
func AesDecrypt(data []byte, key []byte) ([]byte, error) {
//创建实例
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
//获取块的大小
blockSize := block.BlockSize()
//使用cbc
blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
//初始化解密数据接收切片
crypted := make([]byte, len(data))
//执行解密
blockMode.CryptBlocks(crypted, data)
//去除填充
crypted, err = pkcs7UnPadding(crypted)
if err != nil {
return nil, err
}
return crypted, nil
}