加密数据解密算法
接口如果涉及敏感数据(如wx.getUserInfo
当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:
对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
对称解密的目标密文为 Base64_Decode(encryptedData)。
对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。
另外,为了应用能校验数据的有效性,我们会在敏感数据加上数据水印( watermark )
微信官方提供了多种编程语言的示例代码只有C++,Nodejs,PHP,Pyhton,缺少C#版本的
我也是 用这个方法 但是 有的账户就可以解密 有的 就抱错
在 byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
System.Security.Cryptography.CryptographicException: 填充无效,无法被移除。 有人知道这个问题么
public static string WXBizDataCrypt(string encrypted, string session_key, string iv)
{
//创建解密器生成工具实例
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.Mode = CipherMode.CBC;
aes.BlockSize = 128;
aes.Padding = PaddingMode.PKCS7;
//设置解密器参数
//格式化待处理字符串
byte[] byte_encryptedData = Convert.FromBase64String(encrypted);
byte[] byte_iv = Convert.FromBase64String(iv);
byte[] byte_sessionKey = Convert.FromBase64String(session_key);
aes.IV = byte_iv;
aes.Key = byte_sessionKey;
//根据设置好的数据生成解密器实例
using (ICryptoTransform transform = aes.CreateDecryptor())
{
//解密
byte[] final = transform.TransformFinalBlock(byte_encryptedData, 0, byte_encryptedData.Length);
//生成结果
string result = Encoding.UTF8.GetString(final);
return result;
}
}
}