加密算法分为对称加密和非对称加密算法。对称加密算法有AES、DES等。非对称加密算法有RSA加密算法。
本文简单记录使用C#实现AES加密算法的过程,不涉及太底层原理。
首先定义AesModel,用于承载AES加密的参数。
public class AesModel
{
/// <summary>
/// 需要加密/解密的数据
/// </summary>
public byte[] Data { get; set; }
/// <summary>
/// 密钥
/// </summary>
public string Key { get; set; }
/// <summary>
/// 向量
/// </summary>
public string IV { get; set; }
/// <summary>
/// 加密模式
/// </summary>
public CipherMode Mode { get; set; }
/// <summary>
/// 填充模式
/// </summary>
public PaddingMode Padding { get; set; }
}
其中
加密模式分为
ECB、CBC、CFB。(以下2点来源于网络)
1)ECB是最简单和最早的模式,首先是密钥扩展,将加密的数据按照16字节的大小分成若干组,对每组都用同样的密钥加密。
2)CBC和ECB的区别就是添加了一个初始向量(16字节),在将密钥分成若干组之后,第一组与初始化向量异或之后再进行与ECB相同的加密流程,后面的每一组都与上一组的密文进行异或之后再与密钥加密。
填充模式分为以下几种:
None:不填充
PKCS7:缺几个字节就填几个缺的字节数
Zeros:全部填充0x00,无论缺多少全部填充0x00
ANSIX923:跟ISO 10126很像,只不过ANSI X9.23其他字节填的都是0而不是随机数
ISO10126:最后一个字节是填充的字节数(包括最后一字节),其他全部填随机数
加密主要函数:
/// <summary>
/// AES加密
/// </summary>
/// <param name="aesModel"></param>
/// <returns></returns>
public static byte[] Encrypt(AesModel aesModel)
{
//使用32位密钥
byte[] key32 = new byte[32];
//如果我们的密钥不是32为,则自动补全到32位
byte[] byteKey = Encoding.UTF8.GetBytes(aesModel.Key.PadRight(key32.Length));
//复制密钥
Array.Copy(byteKey, key32, key32.Length);
//使用16位向量
byte[] iv16 = new byte[16];
//如果我们的向量不是16为,则自动补全到16位
byte[] byteIv = Encoding.UTF8.GetBytes(aesModel.IV.PadRight(iv16.Length));
//复制向量
Array.Copy(byteIv, iv16, iv16.Length);
// 创建加密对象,Rijndael 算法
RijndaelManaged RijndaelAes = new RijndaelManaged();
RijndaelAes.Mode = aesModel.Mode;
RijndaelAes.Padding = aesModel.Padding;
RijndaelAes.Key = key32;
RijndaelAes.IV = iv16;
byte[] result = null;
try
{
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream EncryptStream = new CryptoStream(ms, RijndaelAes.CreateEncryptor(), CryptoStreamMode.Write))
{
EncryptStream.Write(aesModel.Data, 0, aesModel.Data.Length);
EncryptStream.FlushFinalBlock();
result = ms.ToArray();
}
}
}
catch { }
return result;
}
下载码:E3F9640E6D
下载码是啥?如何下载=》点击查看