目前,在启用了 FIPS 本地安全设置的计算机上,我唯一能够让 RijndaelManaged 算法正常工作的方法是禁用它。鉴于这是一台政府计算机,我不确定这样做是否可行。我在MSDN 博客网站上看到了一些帖子称,他们正在开发符合 AES FIPS 标准的版本,但我似乎找不到更多信息。请问有人知道这可能会发生在什么时候吗?
目前,在启用了 FIPS 本地安全设置的计算机上,我唯一能够让 RijndaelManaged 算法正常工作的方法是禁用它。鉴于这是一台政府计算机,我不确定这样做是否可行。我在MSDN 博客网站上看到了一些帖子称,他们正在开发符合 AES FIPS 标准的版本,但我似乎找不到更多信息。请问有人知道这可能会发生在什么时候吗?
在看到这个问题之前,我从未意识到这一点,但你是正确的。构造函数有这个:
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 算法)。那么,你唯一的选择(或者至少是我在广泛搜索和痛苦哀嚎之后找到的唯一选择)就是使用RijndaelManaged AND 并且在Application.exe.config文件中使用"<configuration> <runtime> <enforceFIPSPolicy enabled="false"/> <runtime> </configuration>
",以关闭该特定应用程序的FIPS强制合规性。
真是个噩梦!我希望这个答案能帮助下一个不幸遇到这个问题的人。
关键词:Cisco IOS SNMPv3 FIPS AES 128 CFB 128 AesCryptoServiceProvider Rijndael
如果操作系统本身经过认证并调用操作系统,则未经管理的AesCryptoServiceProvider也将获得认证。而且它的速度也会更快,但代价是跨平台兼容性。