c# security rijndaelmanaged rijndael fips

¿Cuándo será compatible el algoritmo C#AES con FIPS?



security rijndaelmanaged (4)

En este momento, la única forma en que puedo hacer que el algoritmo RijndaelManaged funcione en una computadora con la configuración de seguridad local para FIPS activada, es desactivarla . Es una computadora del gobierno, así que no estoy seguro de cómo volará. He visto publicaciones en los sitios de blogs msdn que dicen que están trabajando en una versión compatible con AES FIPS, pero parece que no puedo encontrar nada más. ¿Alguien sabe cuando esto puede suceder?


El AesCryptoServiceProvider no administrado está certificado si el propio sistema operativo está certificado como lo llama el sistema operativo. Y también será un sitio web más rápido, a costa de la compatibilidad multiplataforma.


Este problema es mucho más complejo de lo que la mayoría de los que respondieron entienden. Esta es la verdadera razón por la que la mayoría de las respuestas de las personas no funcionan (acabo de pasar una sesión de maratón de casi 48 horas tratando de entender y solucionar este problema):

  1. C # En Windows tiene básicamente 3 proveedores de cifrado que "admiten" AES: RijndaelManaged, AesManaged, AesCryptoServiceProvider.
  2. RijndaelManaged implementa el algoritmo completo de Rijnadael (todas las opciones), por lo que es un superconjunto de capacidades AES; sin embargo, no está certificado como compatible con FIPS (porque es capaz de hacer cosas que no están en la especificación AES aprobada por FIPS, como tener un tamaño de bloque diferente a 128 bits)
  3. AesManaged no es más que un decorador / envoltorio sobre RijndaelManaged que lo restringe a un tamaño de bloque de 128 bits, pero, como RijndaelManaged no está aprobado por FIPS, tampoco AesManaged
  4. AesCryptoServiceProvider es un contenedor C # sobre la biblioteca C en Windows para AES que está aprobado por FIPS; sin embargo, en el modo CFB, solo es compatible con 8 | 16 | 24 | 32 | 40 | 48 | 56 | 64 bits para FeedbackSize (no puedo encontrar documentación que indique que FIPS está restringido de este modo, por lo tanto, es cuestionable cómo AesCryptoServiceProvider pasó el Certificación FIPS: probablemente alguien jugó golf de medianoche con otra persona para que se aprobara la certificación)
  5. Si el modo FIPS está activado en Windows, RijndaelManaged (y, por lo tanto, AesManaged) lanzará una excepción diciendo que no son compatibles con FIPS cuando intenta crear una instancia de ellos.
  6. Algunas cosas requieren AES-128 con CFB de FeedbackSize de 128 bits (por ejemplo, SNMPv3 AES de acuerdo con el RFC).

Por lo tanto, si se encuentra en un entorno donde se cumple lo siguiente:

  1. Necesita AES-128 con CFB-128 (SNMPv3 por ejemplo)
  2. Debe hacer el Crypto de C # sin usar Libs que no sean de Microsoft
  3. Debe tener el modo FIPS activado en el sistema operativo (requisitos del gobierno, por ejemplo)

Entonces, tu ÚNICA opción (o al menos la única que pude encontrar después de una búsqueda exhaustiva y mucho lamento y crujir de dientes) es usar RijndaelManaged Y usar la " <configuration> <runtime> <enforceFIPSPolicy enabled="false"/> <runtime> </configuration> "en Application.exe.config para desactivar el cumplimiento forzado de FIPS para esa aplicación en particular.

¡Qué pesadilla! Espero que esta respuesta ayude a la próxima alma desafortunada a encontrarse con este problema.

Palabras clave: Cisco IOS SNMPv3 FIPS AES 128 CFB 128 AesCryptoServiceProvider Rijndael


Mi sitio tuvo que obtener una vacilación de conformidad con FIPS en .net.


Nunca me di cuenta de esto antes de esta pregunta, pero tienes razón. El constructor tiene esto:

public RijndaelManaged() { if (Utils.FipsAlgorithmPolicy == 1) { throw new InvalidOperationException(Environment.GetResourceString("Cryptography_NonCompliantFIPSAlgorithm")); } }

System.Security.Cryptography.AesManaged tiene algo similar:

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; }

¿Has probado System.Security.Cryptography.AesCryptoServiceProvider ? Debería funcionar ya que utiliza la implementación de FIPS AES basada en CAPI integrada en Windows.

Esta pregunta en el foro de .NET Base Class Library de Microsoft explica qué algoritmos son compatibles con FIPS y tienen buenos enlaces.

Parece que Microsoft está haciendo un esfuerzo constante para obedecer la configuración de HKEY_LOCAL_MACHINE / System / CurrentControlSet / Control / Lsa / FIPSAlgorithmPolicy en máquinas pre-Vista y el uso de la API BCryptGetFipsAlgorithmMode para post-Vista.

Asumo que hay un esfuerzo no trivial involucrado en la certificación de una implementación que cumple con FIPS, es por eso que Microsoft probablemente no quiere repetir el proceso y solo ofrece el AesCryptoServiceProvider para los clientes que absolutamente necesitan este requisito.

Esta publicación del blog de MSDN tiene un comentario que lo aclara:

La manera fácil de averiguar si un algoritmo es compatible o no es mirar el sufijo. Ninguno de los * Tipos administrados están certificados por FIPS. Sin embargo, los tipos * CryptoServiceProvider y * Cng pueden estar certificados por FIPS. Si implementan un algoritmo que FIPS permite, y están utilizando los proveedores de Microsoft predeterminados, entonces lo estarán.

Por ejemplo, SHA256Managed no lo es (porque es * Managed). SHA256CryptoServiceProvider y SHA256Cng son.
MD5CryptoServiceProvider no lo es (porque MD5 no es un algoritmo FIPS).