SymmetricAlgorithm加解密的方式

108 阅读1分钟

加密

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;
}