如下是網上廣泛能收到的JAVA AES加密解密方法。java
由於裏面用到了KeyGenerator 和 SecureRandom,可是.NET 裏面沒有這2個類。沒法使用安全隨機數生成KEY。git
咱們在接收JAVA發送的AES加密字符串後,在.NET沒有對應的KeyGenerator 和 SecureRandom去生成AES 的 KEY值,致使沒法直接解密。github
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.dlldom
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 }