最近在开发小程序,需要跟微信服务端交互,微信敏感数据都有加密返回,需要在服务端接收进行解密后再返回给客户端小程序,今天就通过C# 进行数据的解密,官方下载下来是Node、C++、php等,就是没有C# 代码,于是就上度娘,找到

https://blog.csdn.net/jasonsong2008/article/details/83586119

https://www.cnblogs.com/jetz/p/6384809.html

经过一番研究,搞定啦,其实就是用了aes加密方法。

下面把第一篇博文进行整理

如果你使用的Java,请访问这个地址(Java版本) https://blog.csdn.net/jasonsong2008/article/details/83588666
我们先来看一下微信官方的说明文档,以下直接文档来自微信小程序官方:

加密数据解密算法
接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和 unionId),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据(encryptedData) 进行对称解密。 解密算法如下:

对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
对称解密的目标密文为 Base64_Decode(encryptedData)。
对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。
一定要认真看官方提供的文档

session_key 是在 wx.login 中获取

1、先Base64_Decode encryptedData、session_key、iv

2、调用 TransformFinalBlock方法

    public class AesHelper
{
/// <summary>
/// AES加解密(C#版本)
/// Add by 张旺
/// https://www.cnblogs.com/zhangwang/
///
/// AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,
/// 是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
/// 严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),
/// 因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,
/// 密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,
/// 以128位为下限,256比特为上限。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB
/// </summary> #region 微信小程序 开放数据解密
/// <summary>
/// 微信小程序 开放数据解密
/// AES解密(Base64)
/// Add by 张旺
/// </summary>
/// <param name="encryptedData">已加密的数据</param>
/// <param name="sessionKey">解密密钥</param>
/// <param name="iv">IV偏移量</param>
/// <returns></returns>
public string DecryptForWeChatApplet(string encryptedData, string sessionKey, string iv)
{
var decryptBytes = Convert.FromBase64String(encryptedData);
var keyBytes = Convert.FromBase64String(sessionKey);
var ivBytes = Convert.FromBase64String(iv);
var outputBytes = DecryptByAesBytes(decryptBytes, keyBytes, ivBytes);
return Encoding.UTF8.GetString(outputBytes);
} #endregion #region AES加密 /// <summary>
/// AES加密
/// Add by 张旺
/// </summary>
/// <param name="encryptedBytes">待加密的字节数组</param>
/// <param name="keyBytes">加密密钥字节数组</param>
/// <param name="ivBytes">IV初始化向量字节数组</param>
/// <param name="cipher">运算模式</param>
/// <param name="padding">填充模式</param>
/// <returns></returns>
public static byte[] EncryptToAesBytes(byte[] encryptedBytes, byte[] keyBytes, byte[] ivBytes,
CipherMode cipher = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
if (encryptedBytes == null || encryptedBytes.Length <= 0)
throw new ArgumentNullException(nameof(encryptedBytes));
if (keyBytes == null || keyBytes.Length <= 0)
throw new ArgumentNullException(nameof(keyBytes));
if (ivBytes == null || ivBytes.Length <= 0)
throw new ArgumentNullException(nameof(ivBytes)); var des = new AesCryptoServiceProvider
{
Key = keyBytes,
IV = ivBytes,
Mode = cipher,
Padding = padding
};
var outputBytes = des.CreateEncryptor().TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
return outputBytes;
} #endregion #region AES解密
/// <summary>
/// AES解密
/// Add by 张旺
/// </summary>
/// <param name="decryptedBytes">待解密的字节数组</param>
/// <param name="keyBytes">解密密钥字节数组</param>
/// <param name="ivBytes">IV初始化向量字节数组</param>
/// <param name="cipher">运算模式</param>
/// <param name="padding">填充模式</param>
/// <returns></returns>
public static byte[] DecryptByAesBytes(byte[] decryptedBytes, byte[] keyBytes, byte[] ivBytes,
CipherMode cipher = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7)
{
if (decryptedBytes == null || decryptedBytes.Length <= 0)
throw new ArgumentNullException(nameof(decryptedBytes));
if (keyBytes == null || keyBytes.Length <= 0)
throw new ArgumentNullException(nameof(keyBytes));
if (ivBytes == null || ivBytes.Length <= 0)
throw new ArgumentNullException(nameof(ivBytes)); var aes = new AesCryptoServiceProvider
{
Key = keyBytes,
IV = ivBytes,
Mode = cipher,
Padding = padding
};
var outputBytes = aes.CreateDecryptor().TransformFinalBlock(decryptedBytes, 0, decryptedBytes.Length);
return outputBytes;
}
#endregion
}

  3、调用方法如下

 public void DecryptForWeChatAppletTest() {
//微信小程序返回的加密数据
const string encryptedData =
"tsyLVebikY1aLQ0aNpg10NHxCTV2Ar+FJHUZdwIchBXFbJU7hXyf5gbDibaLU+lT6bzzut/nVymRFp/U8MrF0c8yOCFbnK5aevyearR7vopeel2y929weVA/s16shDPnRMkIn9xiMfVY3LDmuptnBpy1loZfSW2CPfXFuKXQf2z+Kiruynve1cq2mnzAadNaw3/g/tjHRPzxBnTkMsu8sQ==";
//会话密钥
const string sessionKey = "vBwBswWRVmD0WQvRbdbMZg==";
//解密算法初始向量
const string iv = "8IzE0WUF0j5hXy4oIKuLHA=="; var result = AesHelper.DecryptForWeChatApplet(encryptedData, sessionKey, iv);
Console.Write(result);
}

微信小程序开放数据解密 AES-128-CBC 解密(C#版本)的更多相关文章

  1. 微信小程序请求数据

    微信小程序请求数据,在页面展示,可以在onLoad生命周期中进行请求. 1.新建目录http,新建文件http.js 2.在js文件中暴露需要使用的变量 var baseUrl = 'http://1 ...

  2. 微信小程序之数据缓存

    关于缓存,举个示例,假定我不是通过微信授权登录的方式,小程序又是如何识别我登录后的身份呢???效果图: 这个功能我是通过缓存实现的. 关键核心代码如下: wx.setStorage({ key: 'u ...

  3. 微信小程序用户数据解密

    概述 通过微信web开发者工具创建登录,获取用户信息,发送至后台,进行用户数据解密 详细 代码下载:http://www.demodashi.com/demo/10705.html 一.准备工作 1. ...

  4. 微信小程序 开放能力学习

    1. 用户信息小程序登录使用微信的个人信息快速搭建用户体系,登录逻辑:小程序向微信获取code 给服务端生成用户. 说明1. 小程序端调用 wx.login() 获取临时登录凭证 code,并传到服务 ...

  5. 微信小程序开放公测了 晚上又可以通宵搞代码了

    就在刚刚22:15分,微信公众平台的服务号发来好消息说小程序开放公测了,喜大普奔啊!!!码农们晚上又可以通宵搞测试了.之前还猜测16日微信小论坛小程序专场上会公布,没想到提前了那么多天,效率挺高的,而 ...

  6. 微信小程序动态数据跑马灯组件编写

    开发必备:熟悉微信小程序组件开发 开发思路:如果只有一条数据,直接用css3关键帧动画:如果有多条数据,则在当前动画运动到一定时间的时候,将其数据替换掉,使之在视觉效果上有一个从下到上播放的状态.数组 ...

  7. 20171018 微信小程序客户端数据和服务器交互

    -- 时常在想,怎么样才能把知识写的清晰,其实是我理解的不够清晰 微信小程序其实是一个客户端页面,也是需要和服务器交互才能体现数据. 1 --服务器搭建Web API :MVC4 中的一个模板, 如下 ...

  8. 【微信小程序】数据与界面UI不同步,不能直接操作Page.data

    问题:数据层与UI不同步 微信小程序也采用UI绑定数据源的形式,根据以前做WPF的经验,直觉上认为修改了数据层(Page.data)后,UI会自动更新,然而实验发现数据层修改后UI层未修改,导致数据层 ...

  9. 微信小程序 --- 缓存数据

    保存数据  /  读取数据  /  删除数据  /  数据异步操作 每一个微信小程序都可以有自己的本地缓存,可以通过wx.setStorage( wx.setStorageSync) ,wx.getS ...

随机推荐

  1. 3D布局

    <!DOCTYPE html> <html> <head> <title>3D布局</title> <style type=" ...

  2. 移动web开发—页面头部 META 总结

    meta指元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. 标签位于文档的头部,不包含任何内容. 标签的属性定义了与文档相关联的名称/值对. ...

  3. Server.MapPath和Request.PhysicalApplicationPath的异同

    很多人对它们都不陌生,在众多的WEB程序中,使用Server.MapPath和Request.PhysicalApplicationPath来操作目录/文件的几率参半,我曾经也经常混用,然而时间久了. ...

  4. Autofac 一个使用Demo

    一:接口 二:实现: 三:调用: 首先上图: 一:接口代码 public interface IPersonDa { PersonEntity Get(int id); } 二:实现 public c ...

  5. 1. 用U盘安装Centos6.5 + Win7 双系统

    一. 用U盘安装Centos6.5 + Win7 双系统 准备工作:U盘(8G).需要安装的Centos6.5系统(64bit).EasyBCD(用来修复引导,否则开机只有一个系统).         ...

  6. Canvas 旋转风车绘制

    写在前面:   亲爱的朋友们大家好,鄙人自学前端,第一次写博客,写的不好的地方,烦请同学们谅解,如果本文对你有一丁点帮助,还请劳驾您给我点个赞,您的认可将是我坚持下去的强大动力!谢谢! 在进行教学之前 ...

  7. [LeetCode] 二叉树相关题目(不完全)

    最近在做LeetCode上面有关二叉树的题目,这篇博客仅用来记录这些题目的代码. 二叉树的题目,一般都是利用递归来解决的,因此这一类题目对理解递归很有帮助. 1.Symmetric Tree(http ...

  8. 【Java框架型项目从入门到装逼】第六节 - 用ajax请求后台数据

    这一节我们来说一下如何用ajax提交请求? 我们先不讲ajax的原理,还是先以实战为主,看一下这个东西到底怎么用的? form表单: <!-- 采用post表单提交 --> <for ...

  9. python之six用法

    six.PY2 返回一个表示当前运行环境是否为python2的boolean值 six.PY3 返回一个表示当前运行环境是否为python3的boolean值 import six,sys print ...

  10. python全栈开发day111-flask路由及其参数,Flask配置,蓝图,几个装饰器、闪现、send_file、jsonify

    1.endpoint参数,解决视图函数重名问题(包括装饰后重名问题) http://www.cnblogs.com/eric-nirnava/p/endpoint.html 每个应用程序app都有一个 ...