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

你可能感兴趣的:(aes)