Когда алгоритм C # AES будет соответствовать FIPS? - PullRequest
16 голосов
/ 02 июня 2009

Прямо сейчас единственный способ заставить алгоритм RijndaelManaged работать на компьютере с включенным параметром локальной безопасности для FIPS - это отключить его . Это правительственный компьютер, поэтому я не уверен, как он будет летать. Я видел сообщения на сайтах MSDN , в которых говорится, что они работают над версией, совместимой с AES FIPS, но, похоже, я больше ничего не могу найти. Кто-нибудь знает, когда это может произойти?

Ответы [ 4 ]

16 голосов
/ 02 июня 2009

Я никогда не осознавал этого до этого вопроса, но вы правы. Конструктор имеет это:

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).

1 голос
/ 25 февраля 2010

Мой сайт должен был отказаться от соответствия FIPS в .net.

1 голос
/ 02 июня 2009

Неуправляемый AesCryptoServiceProvider сертифицируется, если сама ОС сертифицирована так, как она вызывает ОС. И это будет чертовски быстрый сайт за счет кросс-платформенной совместимости.

0 голосов
/ 12 апреля 2018

Эта проблема намного сложнее, чем понимают большинство респондентов. Вот истинная причина, по которой ответы большинства людей просто не сработают (я просто провел почти 48-часовую сессию марафона, пытаясь понять и решить эту проблему):

  1. C # Под Windows в основном 3 поставщика шифрования, которые «поддерживают» AES: RijndaelManaged, AesManaged, AesCryptoServiceProvider.
  2. RijndaelManaged реализует полный алгоритм Rijnadael (все параметры) и, таким образом, представляет собой супер-набор возможностей AES; тем не менее, он не сертифицирован FIPS-совместимым (поскольку он способен выполнять действия, не соответствующие спецификации AES, одобренной FIPS, например иметь размер блока, отличный от 128 бит)
  3. AesManaged - это не что иное, как декоратор / оболочка над RijndaelManaged, который ограничивает его размером блока до 128 бит, но, поскольку RijndaelManaged не одобрен FIPS, ни AesManaged
  4. AesCryptoServiceProvider - это оболочка C # поверх C-библиотеки в Windows для AES, одобренная FIPS; однако в режиме CFB он поддерживает только 8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 битов для FeedbackSize (я не могу найти документацию, в которой говорится, что FIPS ограничен таким образом, поэтому сомнительно, как AesCryptoServiceProvider прошел Сертификация FIPS - возможно, кто-то играл в гольф в полночь с кем-то еще, чтобы пройти сертификацию)
  5. Если в Windows включен режим FIPS, то RijndaelManaged (и, следовательно, AesManaged) будет выдавать исключение, сообщающее, что они не соответствуют FIPS, когда вы пытаетесь их создать.
  6. Для некоторых вещей требуется AES-128 с CFB 128-битной FeedbackSize (например, SNMPv3 AES согласно RFC).

Итак, если вы находитесь в среде, где верно следующее:

  1. Вам нужен AES-128 с CFB-128 (например, SNMPv3)
  2. Вам нужно сделать Crypto из C # без использования библиотек сторонних разработчиков
  3. Вам нужно включить режим FIPS в ОС (например, требования правительства)

Тогда ваш ЕДИНСТВЕННЫЙ вариант (или, по крайней мере, единственный, который я смог найти после тщательного поиска, большого количества стона и скрежета зубов) - это использовать RijndaelManaged И использовать «<configuration> <runtime> <enforceFIPSPolicy enabled="false"/> <runtime> </configuration>» в Application.exe.config, чтобы включить выключено FIPS принудительное соответствие для данного конкретного приложения.

Какой кошмар! Я надеюсь, что этот ответ поможет следующей несчастной душе столкнуться с этой проблемой.

Ключевые слова: Cisco IOS SNMPv3 FIPS AES 128 CFB 128 AesCryptoServiceProvider Rijndael

...