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

时间:2009-06-02 11:37:06

标签: c# security rijndaelmanaged rijndael fips

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

4 个答案:

答案 0 :(得分:16)

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

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基类库论坛上的

This question讨论了哪些算法符合FIPS并且链接良好。

似乎Microsoft正在Vista之前的计算机上制作a consistent effort to obey the setting HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Lsa \ FIPSAlgorithmPolicy,并在Vista之后使用BCryptGetFipsAlgorithmMode API。

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

This MSDN blog post有一条评论更清晰:

  

找出一个简单的方法   算法是否符合要求   看一下后缀。没有任何一个   *托管类型通过FIPS认证。 * CryptoServiceProvider和* Cng   但是,类型很可能是FIPS   认证。如果他们实施了   FIPS允许的算法,并且是   使用默认的Microsoft提供程序,   然后他们会。

     

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我的网站必须在.net中获得FIPS合规性的豁免。

答案 3 :(得分:0)

这个问题要比大多数回答理解的问题复杂得多。这就是为什么大多数人的答案都行不通的真正原因(我刚刚花了将近48小时的马拉松式课程试图理解并解决这个问题):

  1. C#在Windows下基本上有3个“支持”AES的加密提供商:RijndaelManaged,AesManaged,AesCryptoServiceProvider。
  2. RijndaelManaged实现了完整的Rijnadael算法(所有选项),因此它是一套超级的AES功能;但是,它不符合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)将抛出异常并说它们不符合FIPS。
  6. 有些东西需要AES-128,CFB为128位FeedbackSize(例如根据RFC的SNMPv3 AES)。
  7. 因此,如果您所处的环境如下:

    1. 您需要AES-128和CFB-128(例如SNMPv3)
    2. 您需要在不使用非Microsoft Libs的情况下从C#执行加密操作
    3. 您需要在操作系统上启用FIPS模式(例如,政府要求)
    4. 然后,您的ONLY选项(或者至少是我经过广泛搜索后可以找到的唯一的选择,并且需要大量的嚎叫和咬牙切齿)是使用RijndaelManaged并使用Application.exe.config中的“<configuration> <runtime> <enforceFIPSPolicy enabled="false"/> <runtime> </configuration>”来关闭FIPS强制遵守该特定应用程序。

      真是个噩梦!我希望这个答案有助于下一个不幸的灵魂遇到这个问题。

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