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