Я никогда не осознавал этого до этого вопроса, но вы правы. Конструктор имеет это:
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 ? Он должен работать, поскольку он использует реализацию FIPS AES на основе CAPI , встроенную в Windows.
Этот вопрос на форуме Microsoft .NET Base Class Library обсуждает, какие алгоритмы соответствуют FIPS и имеет хорошие ссылки.
Похоже, что Microsoft предпринимает последовательные усилия для соблюдения параметра HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Lsa \ FIPSAlgorithmPolicy на компьютерах, предшествующих Vista, и использования BCryptGetFipsAlgorithmMode API для пост-Vista.
Я полагаю, что сертификация реализации как FIPS-совместимой требует нетривиальных усилий, поэтому Microsoft, вероятно, не хочет повторять этот процесс и предлагает только AesCryptoServiceProvider для клиентов, которым абсолютно необходимо это требование.
В этом сообщении блога MSDN есть комментарий, который проясняет ситуацию:
Простой способ выяснить, если
алгоритм соответствует или нет
посмотрите на суффикс Ни один из
* Управляемые типы сертифицированы FIPS. * CryptoServiceProvider и * Cng
Типы однако, вполне может быть FIPS
проверенный. Если они реализуют
алгоритм, который позволяет FIPS, и являются
используя поставщиков Microsoft по умолчанию,
тогда они будут.
Например, SHA256Managed не является
(потому что это * Управляется).
SHA256CryptoServiceProvider и
SHA256Cng являются.
MD5CryptoServiceProvider не является
(потому что MD5 не алгоритм FIPS).