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

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

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

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正在努力遵守 Vista之前机器上HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Lsa \ FIPSAlgorithmPolicy的设置以及使用BCryptGetFipsAlgorithmMode API进行后Vista。

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

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

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

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

如果操作系统本身已通过操作系统认证,则非托管AesCryptoServiceProvider经过认证。 而且,以跨平台兼容性为代价,它也将是一个更快的网站。

我的网站不得不在.net中对FIPS合规性感到不满。

这个问题比大多数响应理解的要复杂得多。 这就是为什么大多数人的答案都不起作用的真正原因(我只是花了将近48小时的马拉松赛程来试图理解和解决这个问题):

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

因此,如果您所处的环境如下:

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

然后,你的ONLY选项(或者至少是我经过广泛搜索后可以找到的唯一的烦恼和咬牙切齿)是使用RijndaelManaged并使用“ Application.exe.config中的 “关闭该特定应用程序的FIPS强制合规性。

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

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