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

22

目前,在启用了 FIPS 本地安全设置的计算机上,我唯一能够让 RijndaelManaged 算法正常工作的方法是禁用它。鉴于这是一台政府计算机,我不确定这样做是否可行。我在MSDN 博客网站上看到了一些帖子称,他们正在开发符合 AES FIPS 标准的版本,但我似乎找不到更多信息。请问有人知道这可能会发生在什么时候吗?


相关问题:https://dev59.com/vkbRa4cB1Zd3GeqPwQTh - Jeff Moser
我读到过可以在配置文件中添加以下内容: <configuration> <runtime> <enforceFIPSPolicy enabled="false"/> <runtime> </configuration> 但是似乎没有起作用,应用程序仍然关闭了。 - SwDevMan81
1
好的,我已经成功启用了enforceFIPSPolicy标志,结果发现我需要将其添加到exe.config文件的配置部分中所有标记的下方,似乎无法在configSections和userSettings上方工作。希望这能帮助其他人。 - SwDevMan81
我认为找出你的AesCryptoServiceProvider代码为什么不起作用,而不是通过配置文件解决问题,仍然是有效的。我认为这样做会有更好的长期效果。 - Jeff Moser
我的网站必须在 .net 中获得 FIPS 合规豁免。 - Jeff Walker
显示剩余2条评论
3个回答

21

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

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实现。

这个问题在微软的.NET基类库论坛上讨论了哪些算法符合FIPS标准,并提供了很好的链接。

看起来Microsoft正在做出持续的努力遵守HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy的设置,在先前的Vista机器上使用BCryptGetFipsAlgorithmMode API。

我认为认证一个实现是否符合FIPS标准需要付出相当大的努力,这就是为什么Microsoft可能不想重复这个过程,只为那些绝对需要此要求的客户提供AesCryptoServiceProvider。

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

判断算法是否符合要求的简单方法是查看后缀。所有 *Managed 类型都未经过 FIPS 认证。*CryptoServiceProvider 和 *Cng 类型可能已经通过了 FIPS 认证。如果它们实现了 FIPS 允许的算法,并且使用默认的 Microsoft 提供程序,则可以通过认证。例如,SHA256Managed 不符合要求(因为它是 *Managed)。SHA256CryptoServiceProvider 和 SHA256Cng 符合要求。MD5CryptoServiceProvider 不符合要求(因为 MD5 不是 FIPS 算法)。

“结果”是指性能吗?看起来微软目前不想为超出其CAPI的东西进行实现验证过程。 微软显然费尽心思(可能)遵守联邦客户的要求,他们希望有一个单一的策略位,可以设置禁止非FIPS解决方案。如果您只想使用托管的FIPS实现,可以使用类似BouncyCastle(http://www.bouncycastle.org/csharp/index.html)的库来忽略此位。 - Jeff Moser
(附加信息的更新答案) - Jeff Moser
1
我的意思是,我们尝试使用相同的加密模式(CFB)、填充(None)、初始向量和密钥来使用 AesCryptoServiceProvider 和 RijndealManaged,它们产生了不同的加密结果。 - SwDevMan81
1
https://dev59.com/pnNA5IYBdhLWcg3wcddk - SwDevMan81
Utils.FipsAlgorithmPolicy 函数的正确代码是什么?谢谢! - Luke
显示剩余5条评论

12
这个问题比大多数回答者理解的要复杂得多。以下是为什么大多数人的答案行不通的真正原因(我刚刚花了将近48小时的马拉松会话来尝试理解和解决这个问题):
1. 在Windows下,C#基本上有3个加密提供程序“支持”AES:RijndaelManaged、AesManaged、AesCryptoServiceProvider。 2. RijndaelManaged实现了完整的Rijnadael算法(所有选项),因此它是AES功能的超集;但是,它没有获得FIPS认证(因为它能够执行不在FIPS批准的AES规范中的操作,例如具有128位以外的块大小) 3. AesManaged只是一个装饰器/包装器,用于限制RijndaelManaged的块大小为128位,但由于RijndaelManaged未获得FIPS认证,因此AesManaged也未获得FIPS认证 4. AesCryptoServiceProvider是AES在Windows上C库的C#包装器,已经获得FIPS认证;然而,在CFB模式下,它只支持8|16|24|32|40|48|56|64位的反馈大小(我找不到任何文件说明FIPS受到限制,因此AesCryptoServiceProvider如何通过FIPS认证是可疑的——可能有人与其他人打了午夜高尔夫,以便推动它通过认证) 5. 如果在Windows上启用了FIPS模式,则RijndaelManaged(因此AesManaged)将抛出异常,表示它们不符合FIPS标准,当你尝试实例化它们时。 6. 有些东西需要使用128位反馈大小的AES-128(例如RFC中的SNMPv3 AES)。
因此,如果您处于以下环境:
1. 您需要使用AES-128和CFB-128(例如SNMPv3) 2. 您需要使用C#执行加密,而不使用非Microsoft库 3. 您需要在操作系统上启用FIPS模式(例如政府要求)

那么,你唯一的选择(或者至少是我在广泛搜索和痛苦哀嚎之后找到的唯一选择)就是使用RijndaelManaged AND 并且在Application.exe.config文件中使用"<configuration> <runtime> <enforceFIPSPolicy enabled="false"/> <runtime> </configuration>",以关闭该特定应用程序的FIPS强制合规性。

真是个噩梦!我希望这个答案能帮助下一个不幸遇到这个问题的人。

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


1

如果操作系统本身经过认证并调用操作系统,则未经管理的AesCryptoServiceProvider也将获得认证。而且它的速度也会更快,但代价是跨平台兼容性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接