【原创】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包。

贴图图片-ikvm



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框架|后端框架|服务端框架


.NET WebApi开发框架|MVC框架|后端框架|服务端框架-标准版V1.0



版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
发表评论

评论内容
昵称:
关联文章

C# IKVM加密解密AES对称加密模式AES-128-ECB,补码方式 PKCS5Padding
KeyProvider.KeyProviderRijndael对称加密算法使用|开发框架加密工具
CSFrameworkV5.DemoTester测试加密解密工具
加密解密tb_DataSet/tb_MyUser表的密码|C/S框架网
关于C/S快速开发框架采用的文本加密解密策略|C/S框架网
C# Rijndael Encrypt加密/Decrypt解密算法
如何修改C/S框架默认的对称加密(Rijndael)密码?
登录账号的密码加密方式和数据库的加密一样的吗?
C#.NET史上最全字符串加密/解密/数字签名工具(CryptoHelper.cs)
WebApi接口使用HttpGet方式实现接受实体类参数()
CS系统三层架构扩展支持WCF及策略模式应用()
C# MD5字符串文本加密
StrUtils类:字符串处理/加密解密函数库
C#.Net B/S简单框架结构示例[]
C#.Net局域网版本自动升级解决方案()
基于标准三层逻辑扩展的C/S架构Winform开发平台()
C#框架推荐-C/S框架网快速开发平台系列产品
关于大数据量访问,是否考虑数据脱缓存的模式
[]无线监控系统之二-------C#实现(续)
C/S架构开源软件 - C#.NET+Winform+Dev+SQL快速开发框架