【原创】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
/// <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
/// <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框架|后端框架|服务端框架
参考文档:
[原创]C#植入友商网在线服务并实现同步用户注册接口(三)
TMS-物流运输管理系统《系统详细设计说明书》docx下载(原创文档)
【原创】WCF开发框架 - 采用wsHttpBinding及basicHttpBinding连接https协议的WCF服务
原创C/S架构开源软件 - C#.NET+Winform+Dev+SQL快速开发框架
CSFramework.COM原创:全球国家名称列表国旗图标库导入程序(C#+VS2015)
原创:SQLJOB作业自动备份数据库并自动清除备份历史记录
【原创产品】自己开发MES系统软件,MES开发架构及MES客户端快速开发框架平台
【原创】进销存软件开发模板基于C/S架构快速开发框架C#+Winform+DevExpress
原创:C#源码 GridMovetor按回车自动跳到下一列或自动新增记录(www.csframework.com)
原创:C/S架构快速开发框架通用可配置的数据修改日志解决方案
【原创】WebApi开发框架:Token生成、Token缓存原理、Token验证、令牌机制与原理
【原创】C# Winform Dev自动下拉弹框筛选数据PopupContainerEdit组件
【原创】C# Dev用户自定义组件,自动下拉弹框表格过滤数据组件ucMyLookUpEdit
【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
【原创】简单快速软件开发平台,C/S架构二次开发平台
【原创】C# Winform进销存系统快速开发框架
[原创]C#植入友商网在线服务并实现同步用户注册接口(三)
TMS-物流运输管理系统《系统详细设计说明书》docx下载(原创文档)
【原创】WCF开发框架 - 采用wsHttpBinding及basicHttpBinding连接https协议的WCF服务
原创C/S架构开源软件 - C#.NET+Winform+Dev+SQL快速开发框架
CSFramework.COM原创:全球国家名称列表国旗图标库导入程序(C#+VS2015)
原创:SQLJOB作业自动备份数据库并自动清除备份历史记录
【原创产品】自己开发MES系统软件,MES开发架构及MES客户端快速开发框架平台
【原创】进销存软件开发模板基于C/S架构快速开发框架C#+Winform+DevExpress
原创:C#源码 GridMovetor按回车自动跳到下一列或自动新增记录(www.csframework.com)
原创:C/S架构快速开发框架通用可配置的数据修改日志解决方案
【原创】WebApi开发框架:Token生成、Token缓存原理、Token验证、令牌机制与原理
【原创】C# Winform Dev自动下拉弹框筛选数据PopupContainerEdit组件
【原创】C# Dev用户自定义组件,自动下拉弹框表格过滤数据组件ucMyLookUpEdit
【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
【原创】简单快速软件开发平台,C/S架构二次开发平台
【原创】C# Winform进销存系统快速开发框架
其它资料:
什么是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内容管理系统 |
什么是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内容管理系统 |
在线客服

