【问题标题】:Which of the AES classes in the System.Security.Cryptography namespace should I use?我应该使用 System.Security.Cryptography 命名空间中的哪个 AES 类?
【发布时间】:2018-01-08 16:35:11
【问题描述】:

The System.Security.Cryptography namespace 至少有 3 种不同的看似可互换的方式来获取执行 AES 加密/解密的对象:

using (var aes = Aes.Create())

using (var aes = new AesCryptoServiceProvider())

using (var aes = new AesCng())

前两个是在 .NET 框架 3.5 版中引入的。第三个要新得多;它是在 4.6.2 版本中引入的。因此有人可能会怀疑它比其他 2 更好,但 the documentation 并没有在任何地方说建议使用它来代替其他 2。

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

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

【问题讨论】:

标签: c# .net cryptography aes


【解决方案1】:

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

其他的是实现类。

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

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

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


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

Java 中的CipherSpi 实现类,例如隐藏在视线之外;这些是从通用 Cipher 类中调用的。

【讨论】:

  • AesCng 当且仅当打开 CNG 持久 AES 密钥时才应使用。否则应使用Aes.Create()。 .NET Core 1.0 删除了通过任何其他方式使用 AES 的能力,但随后为 2.0 带来了公共类型(只是为了与 .NET Framework 的 API 表面兼容性)
  • Maarten - Aes.Create() 在我的开发机器上运行的实验代码中使用时返回一个 AesCryptoServiceProvider。
  • @bartonjs 我想您也可以将Create("AesCng") 构造函数用于CNG 持久化AES 密钥?
  • @Hammerite 这是有道理的,使用快速的本机代码来实际执行 AES。
  • @MaartenBodewes Nah,标识符的长度比这更长。 (Aes.Create(typeof(AesCng).GetName()) => Aes.Create("System.Security.Cryptography.AesCng, System.Core, PublicKeyToken=31bf[etc], [etc]"))。几乎所有使用 [Algorithm].Create(string) 的人都有一种更简单的方法来做他们想做的事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多