signature – método preferido para generar k para DSA / ECDSA

Pregunta:

FIPS 186-4 , secciones B.2.1 y B.2.2, analizan dos métodos diferentes para generar k para DSA/ECDSA. A menos que me equivoque, RFC 6979 analiza otro método que utiliza HMAC_DRBG.

Entonces, ¿qué método es el método preferido?

FIPS 186-4 se publicó en julio de 2013. RFC 6979 se publicó en agosto de 2013. Por lo tanto, el RFC es más nuevo, pero no mucho más nuevo.

Respuesta:

La forma "normal" de generar el valor k es hacerlo al azar, que es lo que describe FIPS 186. FIPS 186-4 no se desvía conceptualmente de encarnaciones anteriores de FIPS 186 en ese sentido.

Sucede que tener un buen generador aleatorio es un requisito difícil; algunos sistemas (especialmente integrados) no tienen dicho generador; también puede ser bastante inconveniente hacer que un PRNG externo esté disponible para el motor de firma (es un parámetro adicional para pasar a través de varias capas de API).

Una característica particularmente desconcertante de la generación de números aleatorios es que no se puede probar. Si implementa ECDSA con un generador deficiente, la firma seguirá ocurriendo, los verificadores verificarán y todas las pruebas unitarias informarán que todo está bien. Esta es la configuración perfecta para errores a gran escala y, de hecho, sucedió .

La desaleatorización es una metodología genérica para solucionar tales problemas en los algoritmos de firma: elimina la necesidad de una fuente de aleatoriedad y, dado que hace que la firma sea determinista , se puede probar: la prueba unitaria no solo verificará que la firma generada sea válida. , sino también que es la firma válida la que se debe producir. RFC 6979 es una encarnación de la desaleatorización para DSA y ECDSA: las firmas generadas son totalmente compatibles con los verificadores DSA/ECDSA estándar, pero también son deterministas y, por lo tanto, se pueden probar con los vectores de prueba proporcionados en el RFC.

Escribí ese RFC por mi cuenta y lo presioné como "informativo"; no fue un mandato de NIST o ANSI o lo que sea, y no recibió ninguna bendición "oficial". Todavía pasó por algunas revisiones: el borrador ha existido desde marzo de 2011, los vectores de prueba se han verificado de forma independiente, la construcción interna usa HMAC_DRBG (que se ha revisado a fondo) y nadie encontró nada malo en él (desde un punto criptográfico de vista) * . RFC 6979 ha llegado a algunas bibliotecas criptográficas conocidas, como Crypto++ de Libgcrypt ; también se ha implementado en implementaciones de "carteras" de Bitcoin, luego de una serie de incidentes en los que se desviaron bitcoins debido a un PRNG deficiente.


Se puede notar que el mecanismo descrito en RFC 6979 sigue más o menos el método de generación descrito en la sección B.2.2 de FIPS 186-4: realmente funciona "probando candidatos", y los candidatos son producidos por un "RBG aprobado". (HMAC_DRBG es una de las construcciones PRNG aprobadas por NIST). La desviación real es que en RFC 6979, el PRNG no está sembrado por la entropía reunida, sino por la concatenación de la clave privada y el hash del mensaje firmado. Por lo tanto, se puede argumentar que puede implementar RFC 6979 y aún así cumplir con la letra de FIPS 186-4.

Es posible usar RFC 6979 con el HMAC_DRBG interno sembrado no solo con la clave privada y el mensaje hash, sino también con algo de entropía recopilada, momento en el cual las firmas ya no son deterministas y se pierde la capacidad de probar la implementación contra vectores de prueba. , pero luego está completamente de vuelta en el NIST, lo que podría ser conveniente si su objetivo es el cumplimiento formal total de algún conjunto de regulaciones.


(*) Se ha señalado que HMAC_DRBG es relativamente estricto con respecto al número de invocaciones de la función hash subyacente. En la práctica, los cálculos de la curva elíptica dominarán el costo total, siendo el costo de hashing típicamente menos del 10% del costo total.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım