C#实现AES加密解密


先上代码,注意输出格式

 1   /// <summary>
 2         /// AES 加密 输出hex格式
 3         /// </summary>
 4         /// <param name="str">明文(待加密)</param>
 5         /// <param name="key">秘钥</param>
 6         /// <param name="iv">向量</param>
 7         /// <returns>加密后的字符串</returns>
 8         public static string AesEncrypt(string str, string key, string iv)
 9         {
10             if (string.IsNullOrEmpty(str)) return null;
11             Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
12 
13             RijndaelManaged rm = new RijndaelManaged
14             {
15                 Key = Encoding.UTF8.GetBytes(key),
16                 IV = Encoding.UTF8.GetBytes(iv),
17                 Mode = CipherMode.CBC,
18                 Padding = PaddingMode.PKCS7 //加密什么格式对应改为就行,基本的话应该为PKCS7
19             };
20 
21             ICryptoTransform cTransform = rm.CreateEncryptor();
22             Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
23 
24             //return Convert.ToBase64String(resultArray, 0, resultArray.Length);//返回Base64
25             return ByteArrayToHexString(resultArray);
26         }
27 
28         /// <summary>
29         /// AES解密
30         /// </summary>
31         /// <param name="str">需要解密的字符串</param>
32         /// <param name="key">32位密钥</param>
33         /// <param name="iv">向量(一定要问问对面要用什么向量)</param>
34         /// <returns>解密后的字符串</returns>
35         public static string Decrypt(string str, string key, string iv)
36         {
37             byte[] keyArray = Encoding.UTF8.GetBytes(key);
38             byte[] toEncryptArray = Convert.FromBase64String(str);
39             var rijndael = new RijndaelManaged
40             {
41                 Key = keyArray,
42                 Mode = CipherMode.CBC,
43                 Padding = PaddingMode.PKCS7,
44                 IV = Encoding.UTF8.GetBytes(iv)
45             };
46             ICryptoTransform cTransform = rijndael.CreateDecryptor();
47             byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
48             return Encoding.UTF8.GetString(resultArray);
49         }
50 
51         /// <summary>
52         /// 将一个byte数组转换成一个格式化的16进制字符串
53         /// </summary>
54         /// <param name="data">byte数组</param>
55         /// <returns>格式化的16进制字符串</returns>
56         public static string ByteArrayToHexString(byte[] data)
57         {
58             StringBuilder sb = new StringBuilder(data.Length * 3);
59             foreach (byte b in data)
60             {
61                 sb.Append(Convert.ToString(b, 16).PadLeft(2, '0'));
62             }
63             return sb.ToString().ToUpper();
64         }
65 
66         /// <summary>
67         /// 讲16进制字符串转换成byte数组
68         /// </summary>
69         /// <param name="hexString">16进制字符串</param>
70         /// <returns></returns>
71         public static byte[] HexStringToByteArray(string hexString)
72         {
73             var byteArray = new byte[hexString.Length / 2];
74             for (var x = 0; x < byteArray.Length; x++)
75             {
76                 var i = Convert.ToInt32(hexString.Substring(x * 2, 2), 16);
77                 byteArray[x] = (byte)i;
78             }
79             return byteArray;
80         }
View Code

带偏移的

  1         /// <summary>
  2         /// AES加密 
  3         /// </summary>
  4         /// <param name="text">加密字符</param>
  5         /// <param name="password">加密的密码</param>
  6         /// <param name="iv">密钥</param>
  7         /// <returns></returns>
  8         public string AESEncrypt(string data, string key, string iv, int num)
  9         {
 10             RijndaelManaged rijndaelCipher = new RijndaelManaged
 11             {
 12                 Mode = CipherMode.CBC,
 13                 Padding = PaddingMode.PKCS7,
 14                 KeySize = 128,
 15                 BlockSize = 128,
 16                 Key = Encoding.UTF8.GetBytes(key),
 17                 IV = Encoding.UTF8.GetBytes(iv)
 18             };
 19 
 20             ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
 21             byte[] plainText = Encoding.UTF8.GetBytes(data);
 22             byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
 23 
 24             string a = Convert.ToBase64String(cipherBytes);
 25             string b = ReplaceA(a.TrimEnd('='));
 26             return shiftToFront(b, num);
 27 
 28         }
 29 
 30         /// <summary>
 31         /// AES解密
 32         /// </summary>
 33         /// <param name="text"></param>
 34         /// <param name="password"></param>
 35         /// <param name="iv"></param>
 36         /// <returns></returns>
 37         public string AESDecrypt(string data, string key, string iv, int num)
 38         {
 39             RijndaelManaged rijndaelCipher = new RijndaelManaged
 40             {
 41                 Mode = CipherMode.CBC,
 42                 Padding = PaddingMode.PKCS7,
 43                 KeySize = 128,
 44                 BlockSize = 128,
 45                 Key = Encoding.UTF8.GetBytes(key),
 46                 IV = Encoding.UTF8.GetBytes(iv)
 47             };
 48             data = shiftToBack(ReplaceB(data), num);
 49             byte[] encryptedData = null;
 50             try
 51             {
 52                 encryptedData = Convert.FromBase64String(data);
 53             }
 54             catch(Exception ex)
 55             {
 56                 try
 57                 {
 58                     data += "=";
 59                     encryptedData = Convert.FromBase64String(data);
 60                 }
 61                 catch
 62                 {
 63                     try
 64                     {
 65                         data += "=";
 66                         encryptedData = Convert.FromBase64String(data);
 67                     }
 68                     catch
 69                     {
 70                         data += "=";
 71                         encryptedData = Convert.FromBase64String(data);
 72                     }
 73                 }
 74             }
 75 
 76             ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
 77             byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
 78 
 79             return Encoding.UTF8.GetString(plainText);
 80         }
 81 
 82         private static String shiftToBack(String ret, int num)
 83         {
 84             if ((num < 1) || (ret == null))
 85                 return ret;
 86 
 87             return ret.Substring(num) + ret.Substring(0, num);
 88         }
 89 
 90         private static String shiftToFront(String ret, int num)
 91         {
 92             if ((num < 1) || (ret == null))
 93                 return ret;
 94 
 95             int index = ret.Length - num;
 96             if (index < 1)
 97                 return ret;
 98 
 99             return ret.Substring(index) + ret.Substring(0, index);
100         }
101 
102         public string ReplaceA(string s)
103         {
104             return s.Replace('+', '-').Replace('/', '_');
105         }
106 
107         public string ReplaceB(string s)
108         {
109             return s.Replace('-', '+').Replace('_', '/');
110         }
View Code

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM