加密
1. 使用ICryptoTransform直接处理(推荐使用)
SymmetricAlgorithm algorithm = CreateAesAlgorithm(strKey);
ICryptoTransform cTransform = algorithm.CreateEncryptor();
return cTransform.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);
2. 使用CryptoStream处理
SymmetricAlgorithm algorithm = CreateAesAlgorithm(strKey);
ICryptoTransform cTransform = algorithm.CreateEncryptor();
// way 2
using MemoryStream ms = new MemoryStream();
using CryptoStream cs = new CryptoStream(ms, cTransform, CryptoStreamMode.Write);
using var inputStream = new MemoryStream(inputByteArray);
inputStream.Seek(0, SeekOrigin.Begin);
inputStream.CopyTo(cs);
cs.FlushFinalBlock(); //必须处理,否则不完整
return ms.ToArray();//得到加密后的字节数组
解密
1. 使用ICryptoTransform直接处理(推荐使用)
SymmetricAlgorithm algorithm = CreateAesAlgorithm(strKey);
ICryptoTransform decryptor = algorithm.CreateDecryptor();
// way 1
return decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
2. 使用CryptoStream处理
SymmetricAlgorithm algorithm = CreateAesAlgorithm(strKey);
ICryptoTransform decryptor = algorithm.CreateDecryptor();
// way 2
using MemoryStream cipherMs = new MemoryStream(cipherText);
using CryptoStream cs = new CryptoStream(cipherMs, decryptor, CryptoStreamMode.Read);
using var resultMs = new MemoryStream();
cs.CopyTo(resultMs);
return resultMs.ToArray();
总结
通过对比两段代码, ICryptoTransform.TransformFinalBlock是最简洁的方式.
示例中的Aes加密方法
private static Aes CreateAesAlgorithm(string strKey)
{
var des = Aes.Create();
des.Key = GetKey(strKey);
des.BlockSize = 128;
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;
return des;
}