AES密码编写
要编写AES算法,首先了解AES算法原理,AES算法是一个对称分组密码算法。数据分组长度必须是 128 bits,使用的密钥长度为 128,192 或 256 bits。对于三种不同密钥长度的 AES 算法,分别称为“AES-128”、“AES-192”、“AES-256”。AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混(MixColumns)和轮密钥加(AddRoundKey)。
从AES的加密和解密的流程图中可知:解密算法的每一步分别对应加密算法的逆操作。加解密所有操作的顺序正好是相反的,正是这样才保证了算法的正确性。加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到,算法中16字节的明文、密文和轮子密钥都以一个4x4的矩阵表示。
下面提供一种C#方式实现的工具类:
///
/// AES加解密字符串
///
public static class AESCryptoTextProvider
{
#region 方法
///
/// 加密
/// IV等于Key且Key和IV将被转换为MD5值
///
/// 密钥
/// 原文
/// 密文(Base64字符串)
public static string Encrypt(string key, string sourceText)
{
return Encrypt(key, key, sourceText);
}
///
/// 加密
/// Key和IV将被转换为MD5值
///
/// 密钥
/// 初始化向量
/// 原文
/// 密文(Base64字符串)
public static string Encrypt(string key, string IV, string sourceText)
{
if (key == null)
throw new ArgumentNullException(nameof(key));
if (IV == null)
throw new ArgumentNullException(nameof(IV));
if (sourceText == null)
throw new ArgumentNullException(nameof(sourceText));
using (SHA512 sha512 = SHA512.Create())
{
return Convert.ToBase64String(Encrypt(sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)), sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(IV)), sourceText));
}
}
///
/// 加密
///
/// 密钥
/// 初始化向量
/// 原文
/// 密文
public static byte[] Encrypt(byte[] rgbKey, byte[] rgbIV, string sourceText)
{
if (rgbKey == null)
throw new ArgumentNullException(nameof(rgbKey));
if (rgbIV == null)
throw new ArgumentNullException(nameof(rgbIV));
if (sourceText == null)
throw new ArgumentNullException(nameof(sourceText));
using (MemoryStream memoryStream = new MemoryStream())
{
using (Aes aes = Aes.Create())
using (ICryptoTransform transform = aes.CreateEncryptor(rgbKey, rgbIV))
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write))
using (StreamWriter streamWriter = new StreamWriter(cryptoStream))
{
streamWriter.Write(sourceText);
streamWriter.Flush();
}
return memoryStream.ToArray();
}
}
///
/// 解密
/// IV等于Key且Key和IV将被转换为MD5值
///
/// 密钥
/// 密文(Base64字符串)
/// 原文
public static string Decrypt(string key, string cipherText)
{
return Decrypt(key, key, cipherText);
}
///
/// 解密
/// Key和IV将被转换为MD5值
///
/// 密钥
/// 初始化向量
/// 密文(Base64字符串)
/// 原文
public static string Decrypt(string key, string IV, string cipherText)
{
if (key == null)
throw new ArgumentNullException(nameof(key));
if (IV == null)
throw new ArgumentNullException(nameof(IV));
if (cipherText == null)
throw new ArgumentNullException(nameof(cipherText));
using (SHA512 sha512 = SHA512.Create())
{
return Decrypt(sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)), sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(IV)), Convert.FromBase64String(cipherText));
}
}
///
/// 解密
/// IV等于Key
///
/// 密钥
/// 密文
/// 原文
public static string Decrypt(string key, byte[] cipherBuffer)
{
return Decrypt(key, key, cipherBuffer);
}
///
/// 解密
///
/// 密钥
/// 初始化向量
/// 密文
/// 原文
public static string Decrypt(string key, string IV, byte[] cipherBuffer)
{
if (key == null)
throw new ArgumentNullException(nameof(key));
if (IV == null)
throw new ArgumentNullException(nameof(IV));
if (cipherBuffer == null)
throw new ArgumentNullException(nameof(cipherBuffer));
using (SHA512 sha512 = SHA512.Create())
{
return Decrypt(sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)), sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(IV)), cipherBuffer);
}
}
///
/// 解密
///
/// 密钥
/// 初始化向量
/// 密文
/// 原文
public static string Decrypt(byte[] rgbKey, byte[] rgbIV, byte[] cipherBuffer)
{
if (rgbKey == null)
throw new ArgumentNullException(nameof(rgbKey));
if (rgbIV == null)
throw new ArgumentNullException(nameof(rgbIV));
if (cipherBuffer == null)
throw new ArgumentNullException(nameof(cipherBuffer));
using (MemoryStream stream = new MemoryStream(cipherBuffer))
{
return Decrypt(rgbKey, rgbIV, stream);
}
}
///
/// 解密
/// IV等于Key
///
/// 密钥
/// 密文
/// 原文
public static string Decrypt(string key, Stream cipherStream)
{
return Decrypt(key, key, cipherStream);
}
///
/// 解密
///
/// 密钥
/// 初始化向量
/// 密文
/// 原文
public static string Decrypt(string key, string IV, Stream cipherStream)
{
if (key == null)
throw new ArgumentNullException(nameof(key));
if (IV == null)
throw new ArgumentNullException(nameof(IV));
if (cipherStream == null)
throw new ArgumentNullException(nameof(cipherStream));
using (SHA512 sha512 = SHA512.Create())
{
return Decrypt(sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)), sha512.ComputeHash(System.Text.Encoding.UTF8.GetBytes(IV)), cipherStream);
}
}
///
/// 解密
///
/// 密钥
/// 初始化向量
/// 密文
/// 原文
public static string Decrypt(byte[] rgbKey, byte[] rgbIV, Stream cipherStream)
{
if (rgbKey == null)
throw new ArgumentNullException(nameof(rgbKey));
if (rgbIV == null)
throw new ArgumentNullException(nameof(rgbIV));
if (cipherStream == null)
throw new ArgumentNullException(nameof(cipherStream));
using (Aes aes = Aes.Create())
using (ICryptoTransform transform = aes.CreateDecryptor(rgbKey, rgbIV))
using (CryptoStream cryptoStream = new CryptoStream(cipherStream, transform, CryptoStreamMode.Read))
using (StreamReader streamReader = new StreamReader(cryptoStream))
{
return streamReader.ReadToEnd();
}
}
#endregion
}