The System.Security.Cryptography namespace至少有3种看似可互换的方式来获取将执行AES加密/解密的对象:
using (var aes = Aes.Create())
或
using (var aes = new AesCryptoServiceProvider())
或
using (var aes = new AesCng())
前两个是在.NET framework 3.5版中引入的。第三是更新;它是在4.6.2版本中引入的。因此人们可能会怀疑它比其他2更好,但the documentation没有说任何地方建议用它代替其他的。
前两个都有代码示例。这两个样本看起来基本相同。
我应该使用哪一个?为什么?
答案 0 :(得分:1)
Aes
是一个抽象类。我假设Aes.Create
返回系统默认值。这可能是你想要使用的。让系统决定哪些可用,哪些最好用。
其他是实施类。
AesCryptoServiceProvider
使用旧的加密API MS CAPI; AesCng
使用Windows Vista中引入的加密新一代API; AesManaged
在.NET中实现AES(在帖子中未提及)。您还可以使用Aes.Create(string)
选择其中一个实现。如果可能的话,我会尽量避免直接使用实现类。
如果您知道明确需要使用特定类,或者实际上,如果抽象Aes
类不可用,则仅使用实现类。
请注意,Microsoft在类型系统中公开加密实现具有明显的缺点;选择特定提供商可能更难,基于密钥的实现选择可能更难(硬件加密),并且最终用户可能被欺骗写入不兼容或低效的代码。
Java中的CipherSpi
实现类,例如隐藏在视野之外;这些是从通用Cipher
类调用的。