建议和反馈

请填写你的反馈内容

问答 > 密码学 > 问答详情
已解决

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

System.Security.Cryptography命名空间至少有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更好,但是文档并没有说任何地方建议用它来代替其他的。

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

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


2020-05-23
0
请先登陆或注册

卖拐卖拐2020-05-23

Aes是一个抽象类。我假设Aes.Create返回系统替代值。这可能是你想要使用的。让系统决定某些是可用的以及其中是最好的。

其他是实现类。

  • AesCryptoServiceProvider使用旧的加密API MS CAPI;

  • AesCng使用Windows Vista中约会的加密新一代API;

  • AesManaged在.NET中实现AES(在您的帖子中没有提到)。

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

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


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

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


投一票
评论(0)
赞赏(0)

求助中

解决了这个问题,预计可以帮助到

  • 0
  • 0
  • 5
  • 7
  • 8
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励