我在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
答案 0 :(得分:8)
System.Security.Cryptography.Aes
是一个抽象类,仅代表AES-ness的概念。 AesManaged
,AesCryptoServiceProvider
和AesCng
是托管代码中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的托管实现,具有固定的块大小和迭代计数。