• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#实现JAVAAES加密解密[原创]

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

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

 1 import java.security.SecureRandom;
 2 import java.util.Base64;
 3 
 4 import javax.crypto.Cipher;
 5 import javax.crypto.KeyGenerator;
 6 import javax.crypto.SecretKey;
 7 import javax.crypto.spec.SecretKeySpec;
 8 
 9 public class javaaes {
10     public static void main(String[] args) throws Exception{
11         byte[] a = AesEncrypt("123456".getBytes(),"abcd1234");
12         System.out.println(new String(Base64.getEncoder().encodeToString(a)));
13     }
14     //AES加密
15     public static byte[] AesEncrypt(byte[] byteContent, String password) throws Exception {
16         
17         KeyGenerator kgen = KeyGenerator.getInstance("AES");
18         SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
19         secureRandom.setSeed(password.getBytes());
20         kgen.init(128, secureRandom);
21 
22         SecretKey secretKey = kgen.generateKey();
23         byte[] enCodeFormat = secretKey.getEncoded();//AES加密实际的Key值        
24         //如果直接enCodeFormat=password.getBytes(),那.NET直接就可以解密
25 
26         SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
27 
28         Cipher cipher = Cipher.getInstance("AES");
29 
30         cipher.init(Cipher.ENCRYPT_MODE, key);
31         return cipher.doFinal(byteContent);
32     }
33     //AES解密
34     public static byte[] AesDecrypt(byte[] byteContent, String password) throws Exception {
35         KeyGenerator kgen = KeyGenerator.getInstance("AES");
36         SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
37         secureRandom.setSeed(password.getBytes());
38         kgen.init(128, secureRandom);
39         
40         SecretKey secretKey = kgen.generateKey();
41         byte[] enCodeFormat = secretKey.getEncoded();
42         
43         SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
44         Cipher cipher = Cipher.getInstance("AES");
45         cipher.init(Cipher.DECRYPT_MODE, key);
46         return cipher.doFinal(byteContent);
47     }
48 
49 }


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

 1     public static void main(String[] args) throws Exception{
 2         String password = "1234567890";//AES的密钥
 3         KeyGenerator kgen = KeyGenerator.getInstance("AES");
 4         SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
 5         secureRandom.setSeed(password.getBytes());
 6         kgen.init(128, secureRandom);
 7 
 8         SecretKey secretKey = kgen.generateKey();
 9         byte[] enCodeFormat = secretKey.getEncoded();//AES加密实际的Key值
10         System.out.println(new String(Base64.getEncoder().encodeToString(enCodeFormat)));
11     }
 1         /// <summary>
 2         /// AES解密
 3         /// </summary>
 4         /// <param name="data"></param>
 5         /// <param name="key"></param>
 6         /// <returns></returns>
 7         public static string DeAES(byte[] content, string key)
 8         {
 9             using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
10             {
11                 aesProvider.Key = Convert.FromBase64String(key);
12                 aesProvider.Mode = CipherMode.ECB;
13                 aesProvider.Padding = PaddingMode.PKCS7;
14                 using (ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor())
15                 {
16                     byte[] inputBuffers = content;
17                     byte[] results = cryptoTransform.TransformFinalBlock(inputBuffers, 0, inputBuffers.Length);
18                     aesProvider.Clear();
19                     return Encoding.UTF8.GetString(results);
20                 }
21             }
22         }


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

 1 using java.security;
 2 using javax.crypto;
 3 using System.Security.Cryptography;
 4 using System.Text;
 5 using System;
 6 
 7 public class Program
 8 {
 9     public static void Main()
10     {
11         byte[] a = Convert.FromBase64String("W0fSdgixanavXMiDdPXa/Q==");
12         string result = DeAES(a, "abcd1234");
13         Console.WriteLine(result);
14         Console.Read();
15     }
16     /// <summary>
17     /// AES解密
18     /// </summary>
19     /// <param name="data"></param>
20     /// <param name="key"></param>
21     /// <returns></returns>
22     public static string DeAES(byte[] content, string key)
23     {
24         KeyGenerator kgen = KeyGenerator.getInstance("AES");
25         SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
26         secureRandom.setSeed(Encoding.ASCII.GetBytes(key));
27         kgen.init(128, secureRandom);
28         SecretKey secretKey = kgen.generateKey();
29         byte[] enCodeFormat = secretKey.getEncoded();
30 
31         using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
32         {
33             aesProvider.Key = enCodeFormat;
34             aesProvider.Mode = CipherMode.ECB;
35             aesProvider.Padding = PaddingMode.PKCS7;
36             using (ICryptoTransform cryptoTransform = aesProvider.CreateDecryptor())
37             {
38                 byte[] inputBuffers = content;
39                 byte[] results = cryptoTransform.TransformFinalBlock(inputBuffers, 0, inputBuffers.Length);
40                 aesProvider.Clear();
41                 return Encoding.UTF8.GetString(results);
42             }
43         }
44     }
45 
46 }

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#HttpClientHelper请求发布时间:2022-07-18
下一篇:
简单代码实现C#中运行另外一个程序发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap