Aes和AesManaged有什么区别

时间:2017-08-03 02:35:42

标签: c# encryption aes

我在C#中找到了两个与 AES 相关的课程,而MSDN提供的示例代码是相似的,这两个课程有什么区别?

Aes Class

https://msdn.microsoft.com/en-us/library/system.security.cryptography.aes(v=vs.110).aspx

AesManaged Class

https://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged(v=vs.110).aspx

3 个答案:

答案 0 :(得分:8)

System.Security.Cryptography.Aes是一个抽象类,仅代表AES-ness的概念。 AesManagedAesCryptoServiceProviderAesCng是托管代码中AES的具体实现,使用Windows CAPI,并分别使用Windows CNG。 (在.NET Core上,这是谎言:AesManaged和AesCryptoServiceProvider都只使用自动隐藏类,它使用Windows CNG,macOS Security.framework或OpenSSL,如果可用)

如果您不清楚自己想要哪一个,则需要通过Aes.Create()创建实例并仅使用基本类型。唯一真正的例外是将AesCng与命名密钥一起使用时(非常罕见)。

答案 1 :(得分:6)

虽然我知道已经有了一个可以接受的答案,我认为这是一个很好的开始,但它让我想更多地了解为什么在.Net中有多个Aes实现似乎都在做同样的事情。因此,我决定深入研究。

如上所述,Aes class是一个抽象类,因此您不能仅通过调用“ Create”静态方法来新建该类的实现。这种静态方法根据CryptoConfig设置创建AES的实现,据我所知,该方法允许您在计算机配置中指定特定的实现,否则默认为AesCryptoServiceProvider

AesCryptoServiceProvider将依次为您提供本机加密应用程序编程接口(CAPI)句柄。

AesManaged使用一项关键信息来确定为您提供哪种实现,即AllowOnlyFipsAlgorithms flag。根据文档,它“表明运行时是否应强制执行策略以仅创建经联邦信息处理标准(FIPS)认证的算法”。如果是真的,那么您将获得AesCryptoServiceProvider,否则将获得RijndaelManaged。

最后,AesCng是原始帖子中未提及的内容。根据Microsoft的说法,CNG是geared toward cloud usage scenarios的CAPI的“下一代”。

答案 2 :(得分:1)

AES是抽象基类,而AESManaged是基于Rijndael对称算法的AES的托管实现,具有固定的块大小和迭代计数。