20

现在,我可以让RijndaelManaged算法在打开 FIPS 的本地安全设置的计算机上运行的唯一方法是禁用它。这是一台政府计算机,所以我不确定它会如何运行。我在msdn 博客网站上看到帖子说他们正在开发符合 AES FIPS 的版本,但我似乎无法找到更多信息。有谁知道这什么时候会发生?

4

3 回答 3

19

在这个问题之前我从未意识到这一点,但你是对的。构造函数有这个:

public RijndaelManaged()
{
    if (Utils.FipsAlgorithmPolicy == 1)
    {
        throw new InvalidOperationException(Environment.GetResourceString("Cryptography_NonCompliantFIPSAlgorithm"));
    }
}

System.Security.Cryptography.AesManaged有类似的东西:

public AesManaged()
{
    if (CoreCryptoConfig.EnforceFipsAlgorithms)
    {
        throw new InvalidOperationException(SR.GetString("Cryptography_NonCompliantFIPSAlgorithm"));
    }
    this.m_rijndael = new RijndaelManaged();
    this.m_rijndael.BlockSize = this.BlockSize;
    this.m_rijndael.KeySize = this.KeySize;
}

您是否尝试过System.Security.Cryptography.AesCryptoServiceProvider?它应该可以工作,因为它使用Windows 内置的基于CAPI的 FIPS AES 实现。

Microsoft 的 .NET 基类库论坛上的这个问题讨论了哪些算法符合 FIPS 并具有良好的链接。

微软似乎一直在努力遵守pre-Vista 机器上的 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy 的设置,并为 post-Vista 使用BCryptGetFipsAlgorithmMode API。

我认为在将实现认证为符合 FIPS 时需要付出不小的努力,这就是为什么 Microsoft 可能不想重复该过程而只为绝对需要此要求的客户提供 AesCryptoServiceProvider。

这篇 MSDN 博客文章有一条评论,使其更加清晰:

确定算法是否兼容的简单方法是查看后缀。*托管类型均未通过 FIPS 认证。但是,*CryptoServiceProvider 和 *Cng 类型很可能已通过 FIPS 认证。如果他们实现了 FIPS 允许的算法,并且使用默认的 Microsoft 提供程序,那么他们将是。

例如,SHA256Managed 不是(因为它是 *​​Managed)。SHA256CryptoServiceProvider 和 SHA256Cng 是。
MD5CryptoServiceProvider 不是(因为 MD5 不是 FIPS 算法)。

于 2009-06-02T11:53:46.167 回答
9

这个问题比大多数响应者理解的要复杂得多。这是大多数人的答案不起作用的真正原因(我刚刚花了近 48 小时的马拉松式会议试图理解和解决这个问题):

  1. Windows 下的 C# 基本上有 3 个“支持”AES 的加密提供程序:RijndaelManaged、AesManaged、AesCryptoServiceProvider。
  2. RijndaelManaged 实现了完整的 Rijnadael 算法(所有选项),因此它是 AES 功能的超集;但是,它没有经过 FIPS 认证(因为它能够做 FIPS 批准的 AES 规范中没有的事情,例如块大小不是 128 位)
  3. AesManaged 只不过是 RijndaelManaged 上的装饰器/包装器,将其限制为 128 位的块大小,但是,由于 RijndaelManaged 未经 FIPS 批准,AesManaged 也不是
  4. AesCryptoServiceProvider 是 Windows 上 C 库的 C# 包装器,用于 AES,已获得 FIPS 批准;但是,在 CFB 模式下,它仅支持 8|16|24|32|40|48|56|64 位的 FeedbackSize(我找不到任何说明 FIPS 受到限制的文档,因此,AesCryptoServiceProvider 如何通过FIPS 认证 - 可能有人与其他人一起打了午夜高尔夫球以使其通过认证)
  5. 如果在 Windows 上打开了 FIPS 模式,则当您尝试实例化它们时,RijndaelManaged(以及 AesManaged)将抛出异常并指出它们不符合 FIPS。
  6. 有些事情需要 AES-128 和 128 位反馈大小的 CFB(例如,根据 RFC 的 SNMPv3 AES)。

因此,如果您处于满足以下条件的环境中:

  1. 您需要 AES-128 和 CFB-128(例如 SNMPv3)
  2. 您需要在不使用非 Microsoft Libs 的情况下从 C# 进行加密
  3. 您需要在操作系统上打开 FIPS 模式(例如政府要求)

然后,您唯一的选择(或者至少是我在大量搜索和大量哭泣和咬牙切齿之后能找到的唯一选择)是使用 RijndaelManaged 并使用<configuration> <runtime> <enforceFIPSPolicy enabled="false"/> <runtime> </configuration>Application.exe.config 中的“”来关闭 FIPS 强制合规性特定的应用。

什么样的恶梦!我希望这个答案能帮助下一个不幸的灵魂遇到这个问题。

关键字: Cisco IOS SNMPv3 FIPS AES 128 CFB 128 AesCryptoServiceProvider Rijndael

于 2018-04-12T01:18:55.337 回答
1

如果操作系统本身在调用操作系统时经过认证,则非托管 AesCryptoServiceProvider 也经过认证。而且它也将成为一个更快的站点,但代价是跨平台兼容性。

于 2009-06-02T12:05:01.747 回答