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

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

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

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控制台

这是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 没问题 就是时间有点久 加密解密每次差不多都要一秒

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

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

好吧 我知道你也没看懂

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

之前查了一堆资料 都说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);}
打完收工

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

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

  1. java aes ebc_Delphi XE2+标准AES加解密算法(AES/EBC,CBC/PKCS5Padding-base64)

    [实例简介] 实现了AES/ECB/PKCS5Padding.AES/CBC/PKCS5Padding 密钥长度128/192/256bit,密钥0填充.是标准的AES算法,支持在线AES加解密网站互 ...

  2. java对数据加解密_java 使用AES对数据进行加密和解密

    public class AESUtil { private static String key= "123456"; /** * 加密 * @param content待加密内容 ...

  3. 程序猿成长之路番外篇之前后端加解密(rsa+aes混合加解密算法)

    今年国庆前夕接手一个外部项目,说是要保障接口数据安全,数据安全相对容易些,接口安全嘛emmmmm, 这个要考虑加解密算法.白名单之类的问题了.于是打算今天搞一期接口安全为题的成长之路番外篇. 为什么要 ...

  4. SM4、AES,RSA,DES等加解密,以及一些其他常用工具方法整理

    工作中接触到了SM4,AES,RSA等算法的加解密,这里整理下来,以备后续其他地方需要使用到. 主要用到的第三方包为hutool 后台引入依赖的方式为: <!-- hutool工具包 --> ...

  5. delphi7aes加密解密与java互转_跨语言(java vs python vs nodejs)的RSA加解密问题探讨

    多次被问到这样的问题: java服务端的rsa加密操作已经完成,返回一个16进制的字符串给python平台,但是在python进行私钥解密的时候发现行不通.... 前端python加密,后端用java ...

  6. aes加密php源码,AES加解密类源码 · ThinkPHP5高阶实战教程 --诠释为API开发而生 · 看云...

    # AES加解密类源码 > 根据网络整理 ~~~ /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017 ...

  7. node 加密解密模块_跨语言(java vs python vs nodejs)的RSA加解密问题探讨

    多次被问到这样的问题: java服务端的rsa加密操作已经完成,返回一个16进制的字符串给python平台,但是在python进行私钥解密的时候发现行不通.... 前端python加密,后端用java ...

  8. Python实现AES中ECB模式pkcs5padding填充加密/解密(需要加密文档中可以有中文)

    Python实现AES中ECB模式pkcs5padding填充加密/解密(需要加密文档中可以有中文) 一.本文主要解决的问题 二.完整版代码 结果: 三.遇到的问题 1.填充格式错误 2.传入类型错误 ...

  9. Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密

    之前文章Java里面生成AES加密,c++里面AES解密介绍了Java代码加密,c++代码解密.本文介绍:Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密 一.Ja ...

  10. php5.0 aes加解密,PHP的aes加解密算法

    说明: 1. php的aes算法,加密时会存在空格,0,\0等方式进行补长,所以解密后需要进行trim操作,才能得到原数据串 2. aes加密后进行base64_encode,但是解密时,直接用aes ...

最新文章

  1. 甲骨文们是怎么被干掉的
  2. 用Keras进行手写字体识别(MNIST数据集)
  3. 学习笔记101— word 如何给某一页后面所有页增加行号
  4. 企业大型网络架构怎么做到零攻击?
  5. 【大话Hibernate】hibernate事务管理
  6. Odoo访问权限(一)
  7. 分布式数据层中间件详解:如何实现分库分表+动态数据源+读写分离
  8. 游标迭代器(过滤器)——Scan
  9. 碎片试自学软件测试?我靠自己整理的这套方,案既充实了自己也得到了涨薪
  10. 渲染科研入门到入土(Chinagraph2020闫令琪老师分享)
  11. 使用selenium模拟登陆163邮箱
  12. 发力1小时到家服务,山姆与京东到家共建前置仓获10倍坪效、60%月复购率...
  13. LATEX--页边距设置
  14. 优雅高效的多边形对称性判定算法
  15. 【巴比特前端校招+笔试/一面/二面】
  16. REST Assured 17 - 设置默认的RequestSpecification
  17. 最详细的SQL注入语句
  18. 中国雅虎——长在阿里巴巴脸上的青春痘
  19. 微信小程序分析送积分功能如何实现_微信小程序积分商城系统如何裂变营销购物?...
  20. PS手绘滤镜插件:Alien Skin Snap Art 4 for Mac对系统的要求

热门文章

  1. 【转载】移动端布局概念总结
  2. 路由器架设虚拟服务器让外网访问到本地网站
  3. Java+Oracle实现事务——JDBC事务
  4. Java基础--访问权限控制符
  5. gitlab使用git sourcetree时候的命令
  6. windows文件与Linux文件互转
  7. 3.Contructor(构造器)模式—精读《JavaScript 设计模式》Addy Osmani著
  8. numpy统计分布显示
  9. jq挑战30天——打字机效果+小程序
  10. CentOS7.0 安装 tomcat-9.0