AES算法

这几天一直在处理不同算法的需求,前面俩篇有des、3des的基础源码。

因为初涉算法时间不长、不敢妄下定论,只能提供单一版。对于不同算法在不同语言、跨平台、弱密钥等等情况。我会尽自己最大努力学习、研究。

这几篇希望可以帮助初学者。

常见的算法模式一般为:

CBC模式 每个纯文本块在加密前,通过按位“异或”操作与前一个块的密码文本结合。这样确保了即使纯文本包含许多相同的块,这些块中的每一个也会加密为不同的密码文本块。     

ECB模式 是分组密码的一种最基本的工作模式。在该模式下,待处理信息被分为大小合适的分组,然后分别对每一分组独立进行加密或解密处理。ECB模式一般只适用于小数据量的字符信息的安全性保护,例如密钥保护。

当然key、iv在加密解密的时候是需要保持一致的。

 

下面的源码是C#版本的AES算法、CBC模式、128位。

  1 public class _AESEncrypt
  2     {
  3         /// <summary>
  4         /// 有密码的AES加密 
  5         /// </summary>
  6         /// <param name="text">加密字符</param>
  7         /// <param name="key">加密的密码</param>
  8         /// <param name="iv">密钥</param>
  9         /// <returns></returns>
 10         public static string AESEncrypt(string text, string key, string iv)
 11         {
 12             RijndaelManaged rijndaelCipher = new RijndaelManaged();
 13 
 14             rijndaelCipher.Mode = CipherMode.CBC;
 15 
 16             rijndaelCipher.Padding = PaddingMode.PKCS7;
 17 
 18             rijndaelCipher.KeySize = 128;
 19 
 20             rijndaelCipher.BlockSize = 128;
 21 
 22             byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
 23 
 24             byte[] keyBytes = new byte[16];
 25 
 26             int len = pwdBytes.Length;
 27 
 28             if (len > keyBytes.Length) len = keyBytes.Length;
 29 
 30             System.Array.Copy(pwdBytes, keyBytes, len);
 31 
 32             rijndaelCipher.Key = keyBytes;
 33 
 34 
 35             byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
 36             rijndaelCipher.IV = ivBytes;
 37 
 38             ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
 39 
 40             byte[] plainText = Encoding.UTF8.GetBytes(text);
 41 
 42             byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);
 43 
 44             return Convert.ToBase64String(cipherBytes);
 45 
 46         }
 47 
 48         /// <summary>
 49         /// 随机生成密钥
 50         /// </summary>
 51         /// <returns></returns>
 52         public static string GetIv(int n)
 53         {
 54             char[] arrChar = new char[]{
 55            'a','b','d','c','e','f','g','h','i','j','k','l','m','n','p','r','q','s','t','u','v','w','z','y','x',
 56            '0','1','2','3','4','5','6','7','8','9',
 57            'A','B','C','D','E','F','G','H','I','J','K','L','M','N','Q','P','R','T','S','V','U','W','X','Y','Z'
 58           };
 59 
 60             StringBuilder num = new StringBuilder();
 61 
 62             Random rnd = new Random(DateTime.Now.Millisecond);
 63             for (int i = 0; i < n; i++)
 64             {
 65                 num.Append(arrChar[rnd.Next(0, arrChar.Length)].ToString());
 66 
 67             }
 68 
 69             return num.ToString();
 70         }
 71 
 72         /// <summary>
 73         /// AES解密
 74         /// </summary>
 75         /// <param name="text"></param>
 76         /// <param name="key"></param>
 77         /// <param name="iv"></param>
 78         /// <returns></returns>
 79         public static string AESDecrypt(string text, string key, string iv)
 80         {
 81             RijndaelManaged rijndaelCipher = new RijndaelManaged();
 82 
 83             rijndaelCipher.Mode = CipherMode.CBC;
 84 
 85             rijndaelCipher.Padding = PaddingMode.PKCS7;
 86 
 87             rijndaelCipher.KeySize = 128;
 88 
 89             rijndaelCipher.BlockSize = 128;
 90 
 91             byte[] encryptedData = Convert.FromBase64String(text);
 92 
 93             byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);
 94 
 95             byte[] keyBytes = new byte[16];
 96 
 97             int len = pwdBytes.Length;
 98 
 99             if (len > keyBytes.Length) len = keyBytes.Length;
100 
101             System.Array.Copy(pwdBytes, keyBytes, len);
102 
103             rijndaelCipher.Key = keyBytes;
104 
105             byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
106             rijndaelCipher.IV = ivBytes;
107 
108             ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
109 
110             byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
111 
112             return Encoding.UTF8.GetString(plainText);
113 
114         }
115     }
AES
posted @ 2014-01-14 10:43  SummerA  阅读(1506)  评论(0编辑  收藏  举报