【原创】C# IKVM加密解密机AES对称加密模式AES-128-ECB,补码方式 PKCS5Padding
【原创】C# IKVM加密解密机AES对称加密模式AES-128-ECB,补码方式 PKCS5Padding
最近对接Haier海尔集团某子系统,对方后台接口基于JAVA语言开发的,部署在Apache服务器,而我们对接的客户系统是基于C#语言开发的,WebApi接口的数字签名采用AES对称加密算法,对比提供的JAVA源码,C#的AES加密算法差异巨大,加解密结果不一致! 搞了1天!!! 百度找到对应JAVA语言的AES算法-IKVM包。在NuGet,搜索 IKVM ,安装BuGet包。 C# Code: /// <summary> /// AES加密 /// </summary> /// <param name="content">明文</param> /// <param name="sKey">密钥</param> /// <param name="urlEncode">加密结果是否需要UrlEncoded</param> /// <returns></returns> public static string AES_Encrypt(string content, string sKey, bool urlEncode = false) { KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); random.setSeed(Encoding.UTF8.GetBytes(sKey)); //random.setSeed(Encoding.ASCII.GetBytes(sKey)); kgen.init(128, random); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器 byte[] byteContent = Encoding.UTF8.GetBytes(content); cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 byte[] encryptResult = cipher.doFinal(byteContent); //加密后接口 //string result = Convert.ToBase64String(encryptResult, 0, encryptResult.Length); string result = Convert.ToBase64String(encryptResult); if (urlEncode) return java.net.URLEncoder.encode(java.net.URLEncoder.encode(result, "utf-8"), "utf-8");//进行url编码防止http传输过程出现异常 else return result; } //来源:C/S框架网(www.csframework.com) QQ:23404761 C# Code: /// <summary> /// AES解密 /// </summary> /// <param name="content">AES加密的文本</param> /// <param name="sKey">密钥</param> /// <param name="isUrlEncoded">AES加密的文本是否UrlEncoded</param> /// <returns></returns> public static string AES_Decrypt(string content, string sKey, bool isUrlEncoded = false) { if (isUrlEncoded) content = java.net.URLDecoder.decode(java.net.URLDecoder.decode(content, "utf-8"), "utf-8");//进行url解码 byte[] contentByte = Convert.FromBase64String(content);// 先用base64解密 KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); random.setSeed(Encoding.UTF8.GetBytes(sKey)); kgen.init(128, random); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器 cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 byte[] result = cipher.doFinal(contentByte); return System.Text.Encoding.UTF8.GetString(result); } //来源:C/S框架网(www.csframework.com) QQ:23404761 部署客户端依赖5个dll文件: IKVM.OpenJDK.Core.dll IKVM.OpenJDK.Security.dll IKVM.OpenJDK.Tools.dll IKVM.OpenJDK.Util.dll IKVM.Runtime.dll 我们对接的后台采用WebApi架构: .NET WebApi开发框架|MVC框架|后端框架|服务端框架
参考文档:
StrUtils类:字符串处理/加密解密函数库 C#.NET史上最全字符串加密/解密/数字签名工具(CryptoHelper.cs) 加密解密tb_DataSet/tb_MyUser表的密码|C/S框架网 关于C/S快速开发框架采用的文本加密解密策略|C/S框架网 LianLian Pay 连连支付C#客户端测试程序-全网原创首发 原创Winform快速开发框架平台Oracle版本(三层架构+C#.NET+Oracle数据库) 【原创】C# Winform进销存系统快速开发框架 【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆 【原创】C# Dev用户自定义组件,自动下拉弹框表格过滤数据组件ucMyLookUpEdit 【原创】C# Winform Dev自动下拉弹框筛选数据PopupContainerEdit组件 CSFrameworkV5.DemoTester测试加密解密工具 原创:C#源码 GridMovetor按回车自动跳到下一列或自动新增记录(www.csframework.com) 【原创】进销存软件开发模板基于C/S架构快速开发框架C#+Winform+DevExpress C# Rijndael Encrypt加密/Decrypt解密算法 CSFramework.COM原创:全球国家名称列表国旗图标库导入程序(C#+VS2015)
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |