最近在跟三方对接 对方采用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 block
e.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);
}
打完收工

记一次Java AES 加解密 对应C# AES加解密 的一波三折的更多相关文章

  1. 记一次解决cmd中执行java提示"找不到或无法加载主类"的问题

    今天遇到一个问题:在cmd命令行中,用javac编译java文件可以成功,但是用java执行却提示“找不到或无法加载主类”.现将该问题的原因以及解决办法记录一下. 先理解一下系统变量path和clas ...

  2. Java和C/C++进行DES/AES密文传输(借鉴)

    Java和C/C++进行DES/AES密文传输 声明:对于新手来说很难解决的一个问题,终于在非常煎熬之后找到这篇文章,所以借鉴过来.原文地址http://blog.sina.com.cn/s/blog ...

  3. c# aes,des,md5加密等解密算法

    一:可逆加密,即是能加密也能解密 对称可逆加密:加密后能解密回原文,加密key和解密key是一个 加密算法都是公开的,密钥是保密的, 即使拿到密文 你是推算不了密钥 也推算不了原文 加密解密的速度快, ...

  4. RSA der加密 p12解密以及配合AES使用详解

    在前面的文章中我有说过AES和RSA这两种加密方式,正好在前段时间再项目中有使用到,在这里再把这两种加密方式综合在一起写一下,具体到他们的使用,以及RSA各种加密文件的生成. 一: RSA各种加密相关 ...

  5. Java中主类中定义方法加static和不加static的区别

     Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在主方法调用(类名.方法),后者必须先实例化后用实例调用) 知识点:1.Getter and Setter 的应用 ...

  6. Java常用加密方案及实现——AES和DES

    AES和DES都是对称加密算法,其中DES全称为Data Encryption Standard,AES全称为Advanced Encryption Standard即高级加密标准. DES现在已经不 ...

  7. Java类中各种静态变量的加载顺序的学习

    最近在补<thinking in java>...有一节提到了加载类需要做的一些准备...我照着书本敲了一下代码...同时稍微修改了一下书本上的代码.... package charpte ...

  8. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  9. Java 错误: 找不到或无法加载主类,问题集合

      正确编译命令: javac Hello.java 正确运行命令: java Hello   错误1:H:\code>java Hello.java 错误: 找不到或无法加载主类 Hello. ...

  10. 重读《深入理解Java虚拟机》四、虚拟机如何加载Class文件

    1.Java语言的特性 Java代码经过编译器编译成Class文件(字节码)后,就需要虚拟机将其加载到内存里面执行字节码所定义的代码实现程序开发设定的功能. Java语言中类型的加载.连接(验证.准备 ...

随机推荐

  1. ip网段变更

    背景 公司网络跟集团靠拢,先走第一步:IP网段变更.从XX网段切换到OO网段 方法 1. 准备工作 a. 保证IPMI连接正常 b. 获得新IP并核对对应主机名.旧IP是否相符 2. 确认网卡名称 # ...

  2. LOJ#3048. 「十二省联考 2019」异或粽子(trie树+堆)

    题面 传送门 题解 我们先把它给前缀异或和一下,然后就是要求前\(k\)大的\(a_i\oplus a_j\).把\(k\)乘上个\(2\),变成前\(2k\)大的\(a_i\oplus a_j\), ...

  3. 异常处理,约束,MD5加密日志处理

    程序运行过程中产生的错误, 不正常 def chufa(a, b): try: # 尝试执行xxx代码 ret = a/b # 如果这里出现了错误. 异常. 系统内部会产生一个异常对象. 系统会把这个 ...

  4. C++ 执行Windows cmd命令

    #include <windows.h> #include <iostream> #include <cstdio> using namespace std; vo ...

  5. win7 docker 挂载共享目录

    在 win7 下用 docker 不像 win10 那样方便,安装包都不一样. 在 win7 下共享一个目录的方法如下: 1. 先设置 win7 到 VirtualBox 中 docker 用的那个虚 ...

  6. 阿里云mysql数据库备份还原

    1.下载备份包 在rds的备份恢复中点击下载,在弹出的窗口中复制内网下载地址(前提是目标服务器与rds内网互通,否则请复制外网地址) 在目标服务器中执行如下命令进行下载: wget -c '复制的地址 ...

  7. Freemarker实例教程

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任.作者:永恒の_☆ 地址:http://blog.csdn.net/chenghui0317/a ...

  8. 利用koa实现mongodb数据库的增删改查

    概述 使用koa免不了要操纵数据库,现阶段流行的数据库是mongoDB,所以我研究了一下koa里面mongoDB数据库的增删改查,记录下来,供以后开发时参考,相信对其他人也有用. 源代码请看:我的gi ...

  9. Postgres 的 deferrable

    仅 Postgres 支持 deferrable deferrable 即 推迟约束 一.定义字段时指定 定义:exam考试表里 subject_iddddd 字段关联了 subject 科目表的 i ...

  10. <c:if test=""></c:if>如何判断空(使用例子)

    <c:if test=""></c:if>如何判断空(使用例子) 标签: session / 前端 / c-if userName是登录的时候放到sessi ...