以下是网上普遍能收到的JAVA AES加密解密方法。

因为里面用到了KeyGenerator 和 SecureRandom,但是.NET 里面没有这2个类。无法使用安全随机数生成KEY。

我们在接收JAVA发送的AES加密字符串后,在.NET没有对应的KeyGenerator 和 SecureRandom去生成AES 的 KEY值,导致无法直接解密。

 import java.security.SecureRandom;
import java.util.Base64; import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; public class javaaes {
public static void main(String[] args) throws Exception{
byte[] a = AesEncrypt("123456".getBytes(),"abcd1234");
System.out.println(new String(Base64.getEncoder().encodeToString(a)));
}
//AES加密
public static byte[] AesEncrypt(byte[] byteContent, String password) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
kgen.init(128, secureRandom); SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();//AES加密实际的Key值
//如果直接enCodeFormat=password.getBytes(),那.NET直接就可以解密 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(byteContent);
}
//AES解密
public static byte[] AesDecrypt(byte[] byteContent, String password) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
kgen.init(128, secureRandom); 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);
return cipher.doFinal(byteContent);
} }

第一种方法是,在JAVA中将AES的密钥直接生成出实际的key值,在.NET中用这个实际的key去解密。

     public static void main(String[] args) throws Exception{
String password = "1234567890";//AES的密钥
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
kgen.init(128, secureRandom); SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();//AES加密实际的Key值
System.out.println(new String(Base64.getEncoder().encodeToString(enCodeFormat)));
}
         /// <summary>
/// AES解密
/// </summary>
/// <param name="data"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string DeAES(byte[] content, string key)
{
using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
{
aesProvider.Key = Convert.FromBase64String(key);
aesProvider.Mode = CipherMode.ECB;
aesProvider.Padding = PaddingMode.PKCS7;
using (ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor())
{
byte[] inputBuffers = content;
byte[] results = cryptoTransform.TransformFinalBlock(inputBuffers, , inputBuffers.Length);
aesProvider.Clear();
return Encoding.UTF8.GetString(results);
}
}
}

第二种方法是,下载IKVM,解压缩后在VS的项目中引用bin目录下的IKVM.Runtime.dll、IKVM.OpenJDK.Core.dll、IKVM.OpenJDK.Security.dll

 using java.security;
using javax.crypto;
using System.Security.Cryptography;
using System.Text;
using System; public class Program
{
public static void Main()
{
byte[] a = Convert.FromBase64String("W0fSdgixanavXMiDdPXa/Q==");
string result = DeAES(a, "abcd1234");
Console.WriteLine(result);
Console.Read();
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="data"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string DeAES(byte[] content, string key)
{
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(Encoding.ASCII.GetBytes(key));
kgen.init(, secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded(); using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
{
aesProvider.Key = enCodeFormat;
aesProvider.Mode = CipherMode.ECB;
aesProvider.Padding = PaddingMode.PKCS7;
using (ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor())
{
byte[] inputBuffers = content;
byte[] results = cryptoTransform.TransformFinalBlock(inputBuffers, , inputBuffers.Length);
aesProvider.Clear();
return Encoding.UTF8.GetString(results);
}
}
} }

下载地址:https://github.com/zhu-xb/AES-Cryptography

C# 实现 JAVA AES加密解密[原创]的更多相关文章

  1. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  2. Java AES加密解密工具 -- GUI 、在线传输文件

    原理 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位.分组之后将分别对每个128位的明文分组进行加密. 对于每个128位长度的明文分组的加密过程如下:     (1)将128位AES ...

  3. C#与Java AES 加密解密

    参考文档:https://www.cnblogs.com/xbzhu/p/7064642.html 前几天对接Java接口,需要C#加密参数,Java解密.奈何网上找了一堆大同小异的加解密方法都跟Ja ...

  4. JAVA AES加密解密

    import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java ...

  5. java AES 加密解密工具(Advanced Encryption Standard)发现明文相同但每次重启服务后密文就会不同于是有了改进

    1.通用方法 package com.qlkj.hzd.commom.utils; import javax.crypto.*; import java.io.UnsupportedEncodingE ...

  6. C#, Java, PHP, Python和Javascript几种语言的AES加密解密实现[转载]

    原文:http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php c#里面的AES加密 ...

  7. java使用AES加密解密 AES-128-ECB加密

    java使用AES加密解密 AES-128-ECB加密 import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; impo ...

  8. AES加密解密——AES在JavaWeb项目中前台JS加密,后台Java解密的使用

    一:前言 在软件开发中,经常要对数据进行传输,数据在传输的过程中可能被拦截,被监听,所以在传输数据的时候使用数据的原始内容进行传输的话,安全隐患是非常大的.因此就要对需要传输的数据进行在客户端进行加密 ...

  9. php与java通用AES加密解密算法

    AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...

随机推荐

  1. mysql建立索引的一些小规则

    1.表的主键.外键必须有索引: 2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段,应该建立索引: ...

  2. 修改linux的ssh默认端口号22的方法

    一.修改配置文件 vi /etc/ssh/sshd_config 找到#Port 22 修改为自己要使用的端口号:Port 26000 然后 :x  退出保存 二.重启ssh服务 /etc/init. ...

  3. APIX招聘

  4. [转]Webpack 入门教程

    本文转自:http://www.runoob.com/w3cnote/webpack-tutorial.html Webpack 是一个前端资源加载/打包工具.它将根据模块的依赖关系进行静态分析,然后 ...

  5. 数据结构与算法--最短路径之Bellman算法、SPFA算法

    数据结构与算法--最短路径之Bellman算法.SPFA算法 除了Floyd算法,另外一个使用广泛且可以处理负权边的是Bellman-Ford算法. Bellman-Ford算法 假设某个图有V个顶点 ...

  6. 常见对象(int和String类型的相互转换)

    public class Test03 { //基本数据类型包装类有八种,其中其中都有parsexxx的方法 //可以加将这七种字符串表现形式转换成基本数据类型 //char的包装类Character ...

  7. 修改VS类模板自动添加public修饰符和版权注释信息

    在开发过程中,我们经常需要给类或接口添加public修饰符(默认没有)和一些相关的注释信息,这个工作是机械而枯燥的,而这个简单的需求其实是可以通过修改VS自带的类模板来实现的,下面是详细的修改步骤. ...

  8. 字符串按首字母分组并ToDictionary的实现

    这是一道面试题目,要求实现字符串按首字母分组并ToDictionary输出,当时没有做出来,后面研究了一下,现在将这道题的几种实现方式记录下来. 首先初始化数据源,是一个List<string& ...

  9. 开源框架--NFine.Framework学习(01)

    框架底层采用经典DDD架构,UI层采用jQuery+Bootstrap打造而成的一套符合中国式操作习惯的快速开发框架. 前后端使用技术 1.前端技术 JS框架:jquery-2.1.1.Bootstr ...

  10. BZOJ2337: [HNOI2011]XOR和路径(期望 高斯消元)

    题意 题目链接 Sol 期望的线性性对xor运算是不成立的,但是我们可以每位分开算 设\(f[i]\)表示从\(i\)到\(n\)边权为1的概率,统计答案的时候乘一下权值 转移方程为 \[f[i] = ...