C#AES算法何时符合FIPS标准?

SwD*_*n81 17 c# security fips rijndael rijndaelmanaged

现在,我可以让RijndaelManaged算法在打开FIPS的本地安全设置的计算机上工作的唯一方法就是禁用它.这是一台政府计算机,所以我不确定它会如何飞行.我在msdn博客网站上看过他们说他们正在开发AES FIPS兼容版本的帖子,但我似乎无法找到更多.有谁知道这可能发生的时间?

Jef*_*ser 16

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

你试过System.Security.Cryptography.AesCryptoServiceProvider吗?它应该工作,因为它使用Windows内置的基于CAPI的FIPS AES实现.

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

似乎Microsoft正在努力遵守 Vista之前的机器上HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy 的设置以及在Vista之后使用BCryptGetFipsAlgorithmMode API.

我认为将实现认证为符合FIPS标准需要付出非常重要的努力,这就是微软可能不想重复该过程并且仅为绝对需要此要求的客户提供AesCryptoServiceProvider的原因.

这篇MSDN博客文章的评论更加清晰:

判断算法是否合规的简单方法是查看后缀.*托管类型均未通过FIPS认证.但是,*CryptoServiceProvider和*Cng类型可能已通过FIPS认证.如果他们实现了FIPS允许的算法,并且正在使用默认的Microsoft提供程序,那么它们将是.

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


G B*_*ler 7

这个问题比大多数响应者所理解的要复杂得多。这是大多数人的答案不起作用的真正原因(我刚刚花了近 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# 包装器,用于 FIPS 批准的 AES;但是,在 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