【问题标题】:What is the difference between Aes and AesManagedAes和AesManaged有什么区别
【发布时间】:2020-10-15 23:18:00
【问题描述】:

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

Aes 类

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

AesManaged 类

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

【问题讨论】:

    标签: c# encryption aes


    【解决方案1】:

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

    如果你不清楚你想要哪个,你想通过Aes.Create() 创建一个实例并且只使用基本类型。唯一真正的例外是在将 AesCng 与命名键一起使用时(这种情况非常罕见)。

    【讨论】:

      【解决方案2】:

      虽然我知道已经有一个公认的答案,我觉得这是一个好的开始,但它让我想更多地了解为什么 .Net 中有几种 Aes 实现似乎都在做同样的事情。所以,我决定再深入一点。

      如前所述,Aes class 是一个抽象类,因此您不能只调用“Create”静态方法来新建此类的实现。此静态方法基于 CryptoConfig 设置创建 AES 实现,据我所知,它允许您在机器配置中指定特定实现,否则默认为您提供 AesCryptoServiceProvider

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

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

      最后,原帖中没有提到的是AesCng。根据 Microsoft 的说法,CNG 是“下一代”CAPI,即geared toward cloud usage scenarios

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2016-02-21
          • 2010-11-02
          • 1970-01-01
          • 1970-01-01
          • 2014-12-10
          • 2010-10-02
          • 2011-12-12
          • 2010-09-16
          相关资源
          最近更新 更多