我应该使用 System.Security.Cryptography 命名空间中的哪个 AES 类?

Ham*_*ite 8 .net c# cryptography aes

System.Security.Cryptography 命名空间至少有 3 种不同的看似可互换的方法来获取将执行 AES 加密/解密的对象:

using (var aes = Aes.Create())
Run Code Online (Sandbox Code Playgroud)

或者

using (var aes = new AesCryptoServiceProvider())
Run Code Online (Sandbox Code Playgroud)

或者

using (var aes = new AesCng())
Run Code Online (Sandbox Code Playgroud)

前两个是在 .NET 框架 3.5 版中引入的。第三个要新得多。它是在 4.6.2 版中引入的。因此,人们可能会怀疑它比其他两个更好,但文档没有说明建议使用它代替其他两个。

前两个各有一个代码示例。两个样品看起来基本相同。

我应该使用哪一种,为什么?

Maa*_*wes 5

Aes是一个抽象类。我假设Aes.Create返回系统默认值。这可能是您想要使用的。让系统决定哪些可用,哪些最适合使用。

其他是实现类。

  • AesCryptoServiceProvider 使用 MS CAPI,旧的加密 API;
  • AesCng 使用 Windows Vista 中引入的加密新一代 API;
  • AesManaged 在 .NET 中实现 AES(您的帖子中未提及)。

您还可以使用Aes.Create(string)选择其中一种实现。如果可能,我会尽量避免直接使用实现类。

如果您知道明确需要使用特定类,或者实际上抽象Aes类不可用,则仅使用实现类。


请注意,Microsoft 在类型系统中公开加密实现有明显的缺点;选择特定的提供者可能更难,基于密钥的实现选择可能更难(硬件加密),最终用户可能会被诱骗编写不兼容或效率低下的代码。

CipherSpi例如,Java 中的实现类在视图中是隐藏的;这些是从泛型Cipher类调用的。