初次遇到需要數據解密的地方是在“獲取手機號”,前端組件調用后獲得的是加密數據,需要發送到服務端進行解密。
對於解密算法,微信官方文檔有以下說明:
- 對稱解密使用的算法為 AES-128-CBC,數據采用PKCS#7填充。
- 對稱解密的目標密文為 Base64_Decode(encryptedData)。
- 對稱解密秘鑰 aeskey = Base64_Decode(session_key), aeskey 是16字節。
- 對稱解密算法初始向量 為Base64_Decode(iv),其中iv由數據接口返回。
官方文檔提供了一些示例,但是沒有C#的,不過沒關系,此算法 .NET Core BCL包含了的,使用非常簡單。下面我封裝了一個方法:
/// <summary>
/// 解密微信數據
/// </summary>
/// <param name="encryptedData">加密的數據</param>
/// <param name="encryptIv">iv向量</param>
/// <param name="sessionKey">調用 wx auth.code2Session 來獲得</param>
/// <returns></returns>
public static string WechatDecrypt(string encryptedData, string encryptIv, string sessionKey)
{
//base64解碼為字節數組
var encryptData = Convert.FromBase64String(encryptedData);
var key = Convert.FromBase64String(sessionKey);
var iv = Convert.FromBase64String(encryptIv);
//創建aes對象
var aes = Aes.Create();
if (aes == null)
{
throw new InvalidOperationException("未能獲取Aes算法實例");
}
//設置模式為CBC
aes.Mode = CipherMode.CBC;
//設置Key大小
aes.KeySize = 128;
//設置填充
aes.Padding = PaddingMode.PKCS7;
aes.Key = key;
aes.IV = iv;
//創建解密器
var de = aes.CreateDecryptor();
//解密數據
var decodeByteData = de.TransformFinalBlock(encryptData, 0, encryptData.Length);
//轉換為字符串
var data = Encoding.UTF8.GetString(decodeByteData);
return data;
}
需要注意的點:
1.SessionKey是小程序登錄過程中,調用 auth.code2Session 接口返回的。
2.加密數據和iv向量是微信一起返回的
3.這三個值必須匹配,一個不對都會造成解密失敗