AES加密

         在開發過程當中遇到了使用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                16regexp

   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         }
相關文章
相關標籤/搜索