记一次Java AES 加解密 对应C# AES加解密 的一波三折

最近在跟三方对接 对方采用AES加解密 作为一个资深neter Ctrl CV 是我最大的优点 所以我义正言辞的问他们要了demo

1541998119616

java demo代码:
public class EncryptDecryptTool
{private static final String defaultCharset = "UTF-8";private static final String KEY_AES = "AES";private static final String KEY_MD5 = "MD5";private static MessageDigest md5Digest;static {try {md5Digest = MessageDigest.getInstance(KEY_MD5);} catch (NoSuchAlgorithmException e) {//}}public String encrypt(String message, String key) throws Exception
{return doAES(message, key, Cipher.ENCRYPT_MODE);
}public String decrypt(String message, String key) throws Exception
{return doAES(message, key, Cipher.DECRYPT_MODE);
}/*** 加解密** @param data* @param key* @param mode* @return* @throws NoSuchPaddingException * @throws NoSuchAlgorithmException */
private static String doAES(String data, String key, int mode) throws Exception
{if (StringUtils.isBlank(data) || StringUtils.isBlank(key)) {return null;}boolean encrypt = mode == Cipher.ENCRYPT_MODE;byte[]content;if (encrypt) {content = data.getBytes(defaultCharset);} else {content = Base64.decodeBase64(data.getBytes());}SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(key.getBytes(defaultCharset)), KEY_AES);Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器
cipher.init(mode, keySpec);// 初始化byte[] result = cipher.doFinal(content);if (encrypt) {return new String(Base64.encodeBase64(result, false), defaultCharset);} else {return new String(result, defaultCharset);}}
}EncryptDecryptTool tool = new EncryptDecryptTool();try{//这里key的位数是个坑   之前找的一堆资料   java C#通用版啥的   都说key一定要是16位的   结果后来我发现 靠String msg = tool.decrypt("{\"Name\":\"20180122T155221\",\"OrderNo\":\"Test1000012059021180000008153\"}", "64个英文字母");System.out.println(msg);}catch (Exception e){// TODO Auto-generated catch blocke.printStackTrace();}
哇咔咔 这不是大名鼎鼎的java嘛 但这难不倒我 不是还有IKVM 照样Ctrl CV

1542000611421

新建一个.NET Standard项目NuGet 安装IKVM

1536719957239

C#主要代码
public class EncryptDecryptTool{private static readonly string KEY_AES = "AES";private static readonly string KEY_MD5 = "MD5";private static MessageDigest md5Digest;static EncryptDecryptTool(){try{md5Digest = MessageDigest.getInstance(KEY_MD5);}catch (NoSuchAlgorithmException e){//}}public string encrypt(string message, string key){return doAES(message, key, Cipher.ENCRYPT_MODE);}public string decrypt(string message, string key){return doAES(message, key, Cipher.DECRYPT_MODE);}/// <summary>/// /// </summary>/// <param name="data"></param>/// <param name="key"></param>/// <param name="mode"></param>/// <returns></returns>private static string doAES(string data, string key, int mode){bool encrypt = mode == Cipher.ENCRYPT_MODE;byte[] content;if (encrypt){content = Encoding.UTF8.GetBytes(data);}else{content = Convert.FromBase64String(data);}SecretKeySpec keySpec = new SecretKeySpec(md5Digest.digest(Encoding.UTF8.GetBytes(key)), KEY_AES);Cipher cipher = Cipher.getInstance(KEY_AES);// 创建密码器cipher.init(mode, keySpec);// 初始化byte[] result = cipher.doFinal(content);if (encrypt){return Convert.ToBase64String(result);}else{return Encoding.UTF8.GetString(result);}}}static void Main(string[] args){var encryptDecryptTool = new EncryptDecryptTool();Console.WriteLine(encryptDecryptTool.encrypt("jack","64位密钥"));}
运行NetCore控制台

1542001527509

1542001571646

这是Net Framework Net Core以及IKVM不得不说的故事了 但是下午就要联调了 总不能给三方讲一千零一夜 没事这难不倒我 新建一个Net Framework控制台
   static void Main(string[] args){try{var argsLength = args.Length;if (argsLength > 1){EncryptDecryptTool tool = new EncryptDecryptTool();string result = string.Empty;if (args[0] == "encrypt"){result = tool.encrypt(args[1]);}else{result = tool.decrypt(args[1]);}Console.WriteLine(result);}}catch (Exception ex){Console.WriteLine(ex.Message);}}
Net Core调用
      string path = @"D:\WebSite\AESTool.exe";var method="encrypt";var msg="this is msg";string fileName = path;Process p = new Process();p.StartInfo.UseShellExecute = false;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.FileName = fileName;p.StartInfo.CreateNoWindow = true;p.StartInfo.Arguments = $"{method} {msg}";//参数以空格分隔p.Start();var output = await p.StandardOutput.ReadToEndAsync();
测试ok 没问题 就是时间有点久 加密解密每次差不多都要一秒

1542005197418

就这样跑了一段时间 今天闲下来 想起上次的一秒

1542013331412

嗯 写好辞职申请 备份 好的 我要开始重构了 嗯 知己知彼百战不殆 那我们先去维密上大概了解一下AES

1542014447595

好吧 我知道你也没看懂

1542014542480

我们还是看代码吧 作为一个资深程序员的直觉

1542014881987

之前查了一堆资料 都说java C# AES加解密通用版 key的位都必须是16位 害的笨菜鸟陷入了思维误区 我们再看上面那段代码 Debug进去看 发现是用MD5算法根据key生成长度16的byte数据 16啊 多么敏感的数字 就是哈希计算 靠
果断google,Ctrl CV
  public static class EncryptDecryptTool{private const string key = "qCOHfwhXgsZFBFSeZeGOlXtZbKOzApLBuZoWxrQjcmoxYHfrWZzdyFbvGuMcZqmC";/// <summary>/// MD5哈希计算/// </summary>/// <param name="key"></param>/// <returns></returns>public static byte[] ConvertStringToMD5(string key){byte[] ByteData = Encoding.UTF8.GetBytes(key);MD5 oMd5 = MD5.Create();       byte[] HashData = oMd5.ComputeHash(ByteData);return HashData;}/// <summary>/// AES加密 /// </summary>/// <param name="toEncrypt"></param>/// <returns></returns>public static string Encrypt(string toEncrypt){byte[] keyArray = ConvertStringToMD5(key);byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.Mode = CipherMode.ECB;rDel.Padding = PaddingMode.PKCS7;ICryptoTransform cTransform = rDel.CreateEncryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Convert.ToBase64String(resultArray, 0, resultArray.Length);}/// <summary>/// AES解密/// </summary>/// <param name="toDecrypt"></param>/// <returns></returns>public static string Decrypt(string toDecrypt){byte[] keyArray = ConvertStringToMD5(key);byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);RijndaelManaged rDel = new RijndaelManaged();rDel.Key = keyArray;rDel.Mode = CipherMode.ECB;rDel.Padding = PaddingMode.PKCS7;ICryptoTransform cTransform = rDel.CreateDecryptor();byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Encoding.UTF8.GetString(resultArray);}
打完收工

1542016198377

转载于:https://www.cnblogs.com/aishangyipiyema/p/9948011.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zemax评价函数编辑器_ZEMAX与光学设计案例:激光扩束系统详细设计与公差分析(二)...

目前超过两千人的光学与光学设计方面的微信公众号&#xff0c;欢迎您的到来&#xff01;激光扩束系统公差分析ZEMAX与光学设计案例&#xff1a;激光扩束系统详细设计与公差分析(二)作者&#xff1a;墨子川上10倍扩束系统在上篇已经设计好了&#xff0c;接下来就是进行系统的公差…

UiPath: Selectors repair 选择器的修复,即被选择的按钮发生改变如何选择第二按钮...

实现批量注册用户功能时&#xff0c;出现第一个用户注册完时&#xff0c;弹出确认按钮&#xff0c;点击即可&#xff0c;但是第二个用户注册完成时&#xff0c;弹出的按钮与第一个有差异&#xff0c;图形用户界面元素及其父元素的属性都发生改变。所以就点不了按钮&#xff0c;…

《C专家编程》一1.6 它很棒,但它符合标准吗

本节书摘来自异步社区《C专家编程》一书中的第1章&#xff0c;第1.6节&#xff0c;作者 【美】Perter Van Der Linde&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 它很棒&#xff0c;但它符合标准吗 不要添乱——立即解散ISO工作小组。 ——匿名人士 …

abap al设置单元格可编辑 oo_excel表格操作: 图形和图表编辑技巧汇总(二)

1. 快速选取图表元素图表创建好以后&#xff0c;我们还需要对某些图表元素进行编辑和格式化。图表区包括整个图表和它的全部元素&#xff0c;当你选取图表区后&#xff0c;你就可以看到8个黑色小方块。要想调整单个的图表对象&#xff0c;首先必须选取该对象&#xff0c;然后更…

我的北航故事

我的北航故事 致 沙航的我 既然是故事&#xff0c;那就一定少不了我们耳熟能详的时间&#xff0c;地点&#xff0c;人物&#xff0c;事件&#xff0c;发展&#xff0c;高潮&#xff0c;结局。经过反复的琢磨&#xff0c;我觉得还是写成日记形式比较适合&#xff0c;一是为了掩盖…

CDB和PDB的创建、连接、启动、关闭

CDB和PDB的创建、连接、启动、关闭 一、CDB和PDB基本管理 基本概念&#xff1a; Multitenant Environment&#xff1a;多租户环境 CDB&#xff08;Container Database&#xff09;&#xff1a;数据库容器 PD&#xff08;Pluggable Database&#xff09;&#xff1a;可插拔数据库…

控制usb扫码枪_无线也可以很牢靠-世达SATA热熔胶枪评测

作为一名喜欢动手制作的手工达人&#xff0c;往往乐趣就在于动手过程中的成就感。而在对零件进行固定时&#xff0c;热熔胶由于可以包裹裸露的电线线头&#xff0c;固定效果也非常好&#xff0c;相比电焊也更加的简单易操作&#xff0c;因而被很多人选择。但是&#xff0c;多数…

Anaconda管理多版本的python环境

通过Conda的环境管理功能&#xff0c;我们能同时安装多个不同版本的Python&#xff0c;并能根据需要自由切换。下面我将给大家分享一下&#xff0c;新增Python版本&#xff0c;切换&#xff0c;再切回主版本的详细过程。 方法/步骤 1首先确保你的系统里已经安装了Conda&#xf…

父子沪c转大牌过户_机动车异地过户(转籍)

最近我家换了一辆车&#xff0c;导航后台数据统计是去足浴城最多的车主&#xff0c;尬&#xff01;从想起这个品牌到付定金&#xff0c;也就半天时间&#xff0c;买之前没了解这么透彻。不过&#xff0c;到手驾驶&#xff0c;还是比之前的车舒适很多的&#xff0c;就是容易在不…

android安卓系统2.3 使用说明书,Android2.3操作界面

Android2.3操作界面摩托罗拉XT882的界面相对于原生的Gingerbread还是有了不小的变化&#xff0c;首先最大的感觉就是主色调亮了很多。默认背景在qHD分辨率下非常的清晰&#xff0c;同时整个界面仍然采用了多分屏界面。下方由中国电信定制&#xff0c;状态栏加入了全新的单个状态…

Linux 下 nginx反向代理与负载均衡

前面几篇记录下nginx的基本运功&#xff0c;代理服务器的访问&#xff0c;这里来试验下nginx的反向代理。 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;并将从服…

android 8.1没声音,Android 8.1重大改变!耳机孔不见了

原标题&#xff1a;Android 8.1重大改变&#xff01;耳机孔不见了今天上午&#xff0c;Android Police爆料称&#xff0c;下一代的Pixel 2将首发Android 8.1。更重要的是&#xff0c;在这个新系统中&#xff0c;谷歌已经做好了放弃3.5mm耳机插口的准备&#xff0c;并将在底层优…

Leetcode:0002(两数之和)

LeetCode&#xff1a;0002&#xff08;两数之和&#xff09; 题目描述&#xff1a;给定两个非空链表来表示两个非负整数。位数按照逆序方式存储&#xff0c;它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外&#xff0c;这两个数字都不会…

《Excel 职场手册:260招菜鸟变达人》一第 13 招 利用数据验证给单元格添加注释,不用批注...

本节书摘来异步社区《Excel 职场手册&#xff1a;260招菜鸟变达人》一书中的第1章&#xff0c;第13节&#xff0c;作者&#xff1a; 聂春霞 , 佛山小老鼠 责编&#xff1a; 王峰松&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 第 13 招 利用数据验证给单…

《机器人学经典教程》——2.2 控制论

本节书摘来异步社区《机器人学经典教程》一书中的第2章&#xff0c;第2.2节&#xff0c;作者&#xff1a;【美】Maja J. Matarić&#xff08;马娅•马塔里奇&#xff09;&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.2 控制论 随着控制理论的不断发展…

《CCIE路由和交换认证考试指南(第5版) (第1卷)》——1.6节虚拟交换系统

本节书摘来自异步社区《CCIE路由和交换认证考试指南&#xff08;第5版&#xff09; &#xff08;第1卷&#xff09;》一书中的第1章&#xff0c;第1.6节虚拟交换系统&#xff0c;作者 【美】Narbik Kocharians&#xff08;那比克 科查理安&#xff09; , 【斯洛伐克】Peter Pal…

远程执行漏洞修复方案_请马上修复!SaltStack远程命令执行漏洞

【漏洞预警】SaltStack远程命令执行漏洞(CVE-2020-11651、CVE-2020-11652)2020年5月3日&#xff0c;阿里云应急响应中心监测到近日国外某安全团队披露了SaltStack存在认证绕过致命令执行漏洞以及目录遍历漏洞。漏洞描述SaltStack是基于Python开发的一套C/S架构配置管理工具。国…

html设置模块宽度为200像素,css 宽度(CSS width)

DIV CSS宽度width样式属性CSS 宽度是指通过CSS 样式设置对应div宽度&#xff0c;以下我们了解传统html宽度、宽度自适应百分比、固定宽度等宽度知识。传统Html 宽度属性单词&#xff1a;width 如width"300";CSS 宽度属性单词&#xff1a;width 如width:300px;一、Wid…

jquery 样式获取设置值_jQuery获取样式中的背景颜色属性值/颜色值

天使用jQuery获取样式中的background-color的值时发现在获取到的颜色值在IE中与Chrome、Firefox显示的格式不一样&#xff0c;IE中是以HEX格式显示#ffff00&#xff0c;而Chrome、Firefox中则是以GRB格式显示rgb(255,0,0)&#xff0c;由于需要将颜色值存储到数据库中&#xff0c…

《思科数据中心I/O整合》一2.11 活动-活动连接(Active-Active)

本节书摘来自异步社区《思科数据中心I/O整合》一书中的第2章&#xff0c;第2.11节&#xff0c;作者【美】Silvano Gai , Claudio DeSanti&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看 2.11 活动-活动连接&#xff08;Active-Active&#xff09; 思科数据中…