在開發過程當中遇到了使用AES加密的地方,須要使用C#方法加密,java方法解密,涉及到AES加密和RSA加密,本文先作一下AES加密筆錄。java
AES加密算法即密碼學中的高級加密標準(Advanced Encryption Standard,AES),又稱Rijndael加密法。AES已經變成目前對稱加密中最流行算法之一;AES能夠使用12八、19二、和256位密鑰,而且用128位分組加密和解密數據。算法
AES有五種加密模式:CBC, CFB, ECB,OFB,PCBC;有三種填充模式:NoPadding,PKCS5Padding,ISO10126Padding。從網上查到已經有人總結了一些AES加密模式和填充方式,以下:dom
算法/模式/填充 16字節加密後數據長度 不滿16字節加密後長度
ide
AES/CBC/NoPadding 16 不支持
編碼
AES/CBC/PKCS5Padding 32 16
加密
AES/CBC/ISO10126Padding 32 16
spa
AES/CFB/NoPadding 16 原始數據長度
rest
AES/CFB/PKCS5Padding 32 16
code
AES/CFB/ISO10126Padding 32 16
regexp
AES/ECB/NoPadding 16 不支持
AES/ECB/PKCS5Padding 32 16
AES/ECB/ISO10126Padding 32 16
AES/OFB/NoPadding 16 原始數據長度
AES/OFB/PKCS5Padding 32 16
AES/OFB/ISO10126Padding 32 16
AES/PCBC/NoPadding 16 不支持
AES/PCBC/PKCS5Padding 32 16
AES/PCBC/ISO10126Padding 32 16
不帶模式和填充來獲取AES算法的時候,其默認使用ECB/PKCS5Padding。
我使用的是默認的ECB模式,PKCS5Padding填充,使用base64轉碼。
Java和C#加密解密是互通的,能相互加密解密,統一採用UTF-8編碼
模式:Java的ECB模式對應C#的System.Security.Cryptography.CipherMode.ECB
填充方法:Java的PKCS5Padding對應C#的System.Security.Cryptography.PaddingMode.PKCS7
Java代碼以下:
1 package cn.wutian.util; 2 3 import java.security.NoSuchAlgorithmException; 4 import java.security.SecureRandom; 5 6 import javax.crypto.*; 7 import javax.crypto.spec.SecretKeySpec; 8 9 import sun.misc.*; 10 11 @SuppressWarnings("restriction") 12 public class EncryptUtil { 13 14 public static String aesEncrypt(String str, String key) throws Exception { 15 if (str == null || key == null) return null; 16 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 17 cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES")); 18 byte[] bytes = cipher.doFinal(str.getBytes("utf-8")); 19 return new BASE64Encoder().encode(bytes); 20 } 21 22 public static String aesDecrypt(String str, String key) throws Exception { 23 if (str == null || key == null) return null; 24 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 25 cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES")); 26 byte[] bytes = new BASE64Decoder().decodeBuffer(str); 27 bytes = cipher.doFinal(bytes); 28 return new String(bytes, "utf-8"); 29 } 30 }
C#代碼以下:
1 using System; 2 using System.Security.Cryptography; 3 using System.Text; 4 5 namespace CSharp.Util.Security 6 { 7 8 /// <summary> 9 /// AES 加密 10 /// </summary> 11 /// <param name="str"></param> 12 /// <param name="key"></param> 13 /// <returns></returns> 14 public static string AesEncrypt(string str, string key) 15 { 16 if (string.IsNullOrEmpty(str)) return null; 17 Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str); 18 19 System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged 20 { 21 Key = Encoding.UTF8.GetBytes(key), 22 Mode = System.Security.Cryptography.CipherMode.ECB, 23 Padding = System.Security.Cryptography.PaddingMode.PKCS7 24 }; 25 26 System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor(); 27 Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 28 29 return Convert.ToBase64String(resultArray, 0, resultArray.Length); 30 } 31 32 /// <summary> 33 /// AES 解密 34 /// </summary> 35 /// <param name="str"></param> 36 /// <param name="key"></param> 37 /// <returns></returns> 38 public static string AesDecrypt(string str, string key) 39 { 40 if (string.IsNullOrEmpty(str)) return null; 41 Byte[] toEncryptArray = Convert.FromBase64String(str); 42 43 System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged 44 { 45 Key = Encoding.UTF8.GetBytes(key), 46 Mode = System.Security.Cryptography.CipherMode.ECB, 47 Padding = System.Security.Cryptography.PaddingMode.PKCS7 48 }; 49 50 System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor(); 51 Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 52 53 return Encoding.UTF8.GetString(resultArray); 54 } 55 } 56 }
我這裏的key值是由str通過MD5加密獲得。
Java代碼以下:
1 public static String EncoderByMd5(String str) 2 throws Exception 3 { 4 MessageDigest md5 = MessageDigest.getInstance("MD5"); 5 String newstr = new BASE64Encoder().encode(md5.digest(str.getBytes("UTF-8"))); 6 return newstr; 7 }
C#代碼以下:
1 public static string EncoderByMd5(string str) 2 { 3 MD5 md5 = new MD5CryptoServiceProvider(); 4 var byteText = md5.ComputeHash(Encoding.UTF8.GetBytes(str)); 5 return Convert.ToBase64String(byteText); 6 }