用C#实现AES加密和解密

时间:2022-09-05 21:10:50

    AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。

需要加入引用   using System.Security.Cryptography;

  
  
  
/// <summary>
/// 有密码的AES加密
/// </summary>
/// <param name="text"> 加密字符 </param>
/// <param name="password"> 加密的密码 </param>
/// <param name="iv"> 密钥 </param>
/// <returns></returns>
public static string AESEncrypt( string text, string password, string iv)
{
RijndaelManaged rijndaelCipher
= new RijndaelManaged();

rijndaelCipher.Mode
= CipherMode.CBC;

rijndaelCipher.Padding
= PaddingMode.PKCS7;

rijndaelCipher.KeySize
= 128 ;

rijndaelCipher.BlockSize
= 128 ;

byte [] pwdBytes = System.Text.Encoding.UTF8.GetBytes(password);

byte [] keyBytes = new byte [ 16 ];

int len = pwdBytes.Length;

if (len > keyBytes.Length) len = keyBytes.Length;

System.Array.Copy(pwdBytes, keyBytes, len);

rijndaelCipher.Key
= keyBytes;


byte [] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
rijndaelCipher.IV
= ivBytes;

ICryptoTransform transform
= rijndaelCipher.CreateEncryptor();

byte [] plainText = Encoding.UTF8.GetBytes(text);

byte [] cipherBytes = transform.TransformFinalBlock(plainText, 0 , plainText.Length);

return Convert.ToBase64String(cipherBytes);

}

/// <summary>
/// 随机生成密钥
/// </summary>
/// <returns></returns>
public static string GetIv( int n)
{
char [] arrChar = new char []{
' 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 ' ,
' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' ,
' 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 '
};

StringBuilder num
= new StringBuilder();

Random rnd
= new Random(DateTime.Now.Millisecond);
for ( int i = 0 ; i < n; i ++ )
{
num.Append(arrChar[rnd.Next(
0 , arrChar.Length)].ToString());

}

return num.ToString();
}

/// <summary>
/// AES解密
/// </summary>
/// <param name="text"></param>
/// <param name="password"></param>
/// <param name="iv"></param>
/// <returns></returns>
public static string AESDecrypt( string text, string password, string iv)
{
RijndaelManaged rijndaelCipher
= new RijndaelManaged();

rijndaelCipher.Mode
= CipherMode.CBC;

rijndaelCipher.Padding
= PaddingMode.PKCS7;

rijndaelCipher.KeySize
= 128 ;

rijndaelCipher.BlockSize
= 128 ;

byte [] encryptedData = Convert.FromBase64String(text);

byte [] pwdBytes = System.Text.Encoding.UTF8.GetBytes(password);

byte [] keyBytes = new byte [ 16 ];

int len = pwdBytes.Length;

if (len > keyBytes.Length) len = keyBytes.Length;

System.Array.Copy(pwdBytes, keyBytes, len);

rijndaelCipher.Key
= keyBytes;

byte [] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
rijndaelCipher.IV
= ivBytes;

ICryptoTransform transform
= rijndaelCipher.CreateDecryptor();

byte [] plainText = transform.TransformFinalBlock(encryptedData, 0 , encryptedData.Length);

return Encoding.UTF8.GetString(plainText);

}