DSA, algoritmo de firma digital | |
---|---|
Creador | NIST |
Creado | 1991 |
publicado | 1998 |
Tamaño de clave | cerrado: 160-256 bits, abierto: 1024-3072 bits |
Tamaño de la firma | dos números de 160-256 bits |
DSA ( algoritmo de firma digital - algoritmo de firma digital ): un algoritmo criptográfico que utiliza una clave privada (de un par de claves: <pública; privada>) para crear una firma electrónica , pero no para el cifrado (a diferencia de RSA y el esquema ElGamal ). La firma se crea en secreto (clave privada) pero se puede verificar públicamente (clave pública). Esto significa que solo un sujeto puede crear una firma de mensaje, pero cualquiera puede verificar que sea correcta. El algoritmo se basa en la complejidad computacional de tomar logaritmos en campos finitos .
El algoritmo fue propuesto por el Instituto Nacional de Estándares y Tecnología ( EE . UU .) en agosto de 1991 y está patentado [1] (autor de la patente: David W. Kravitz), NIST puso esta patente a disposición para su uso sin regalías . DSA es parte del DSS ( Digital Signature Standard), publicado por primera vez el 15 de diciembre de 1998 (documento FIPS-186 [2] ( Federal Information Processing Standards ) . El estándar ha sido actualizado varias veces [3] [4] , la última versión es FIPS-186-4 [5] . (Julio 2013).
DSA incluye dos algoritmos (S, V): para crear una firma de mensaje (S) y para verificarla (V).
Ambos algoritmos calculan primero el hash del mensaje utilizando una función hash criptográfica . El algoritmo S usa el hash y la clave secreta para crear la firma, el algoritmo V usa el hash del mensaje, la firma y la clave pública para verificar la firma.
Vale la pena enfatizar que no es el mensaje (de longitud arbitraria) lo que realmente está firmado, sino su hash (160 - 256 bits), por lo que las colisiones son inevitables y una firma, en general, es válida para varios mensajes con el mismo hash. . Por lo tanto, la elección de una función hash suficientemente "buena" es muy importante para todo el sistema en su conjunto. La primera versión del estándar usó la función hash SHA-1 [6] [2] ( Secure Hash Algorithm - algoritmo hash seguro) , en la última versión también puede usar cualquier algoritmo de la familia SHA-2 [6] [5 ] . En agosto de 2015, se publicó FIPS-202 [7] , que describe la nueva función hash SHA-3 . Pero hoy en día no está incluido en el estándar DSS [5] .
El sistema requiere una base de correspondencia entre los datos reales del autor (puede ser un individuo o una organización) y las claves públicas , así como todos los parámetros necesarios del esquema de firma digital (función hash, números primos ). Por ejemplo, una autoridad de certificación puede servir como base .
Para construir un sistema de firma digital, debe realizar los siguientes pasos:
Como se mencionó anteriormente, el parámetro principal del esquema de firma digital es la función hash criptográfica utilizada para convertir el texto del mensaje en un número para el cual se calcula la firma. Una característica importante de esta función es la longitud en bits de la secuencia de salida, indicada como N a continuación . En la primera versión del estándar DSS , se recomienda la función SHA-1 [2] y, en consecuencia, la longitud de bits del número con signo es de 160 bits. Ahora SHA-1 ya no es lo suficientemente seguro [8] [9] . La norma especifica los siguientes posibles pares de valores para los números L y N :
Las funciones hash de la familia SHA-2 se recomiendan bajo este estándar . Las organizaciones del gobierno de los EE. UU. deben usar una de las tres primeras opciones, las CA deben usar un par que sea igual o mayor que el par que usan los suscriptores [5] . El diseñador del sistema puede elegir cualquier función hash válida. Por lo tanto, no se centrará más atención en el uso de una función hash particular.
La fuerza de un criptosistema basado en DSA no supera la fuerza de la función hash utilizada y la fuerza del par (L,N), cuya fuerza no es mayor que la fuerza de cada uno de los números por separado. También es importante considerar cuánto tiempo debe permanecer seguro el sistema. Actualmente, para los sistemas que deben ser persistentes hasta 2010 ( 2030 ), se recomienda una longitud de 2048 (3072) bits. [5] [10]
Los parámetros públicos son números (p, q, g, y) . Solo hay un parámetro privado: el número x . En este caso, los números (p, q, g) pueden ser comunes para un grupo de usuarios, y los números x e y son las claves pública y privada de un usuario en particular, respectivamente. Al firmar un mensaje, se utilizan números secretos x y k , y el número k debe elegirse aleatoriamente (en la práctica, pseudoaleatoriamente) al calcular la firma de cada mensaje siguiente.
Dado que (p, q, g) puede utilizarse para varios usuarios, en la práctica los usuarios suelen dividirse según algunos criterios en grupos con el mismo (p, q, g) . Por lo tanto, estos parámetros se denominan Parámetros de Dominio. [5]
La firma del mensaje se realiza de acuerdo con el siguiente algoritmo [5] :
Las operaciones computacionalmente complejas son módulo de exponenciación (cálculo ), para el cual existen algoritmos rápidos , cálculo hash , donde la complejidad depende del algoritmo hash elegido y del tamaño del mensaje de entrada, y encontrar el elemento inverso usando, por ejemplo, el euclidiano extendido algoritmo o pequeño teorema de Fermat en forma .
La verificación de la firma se realiza de acuerdo con el algoritmo [5] :
1 Cálculo 2 Cálculo 3 Cálculo 4 Cálculo 5 La firma es correcta siCuando está marcada, las operaciones computacionalmente complejas son dos exponenciaciones , un cálculo hash y la búsqueda del elemento inverso .
Este esquema de firma digital es correcto en la medida en que una persona que desee verificar la autenticidad de la firma siempre recibirá un resultado positivo en caso de autenticidad. Vamos a mostrarlo:
Primero, si , entonces por el Pequeño Teorema de Fermat se sigue que . Dado que g > 1 y q es primo, entonces g debe tener el orden multiplicativo q módulo p .
Para firmar un mensaje, calcula
Por lo tanto
Como g es de orden q , obtenemos
Finalmente, la corrección del esquema DSA se sigue de
[5]Demos un ejemplo de cómo funciona el algoritmo para números pequeños. Dejemos el valor hash de nuestro mensaje .
El algoritmo DSA se basa en la dificultad de calcular logaritmos discretos y es una modificación del esquema clásico de ElGamal [11] , en el que se agrega hash de mensajes y todos los logaritmos se calculan mediante , lo que hace posible que la firma sea más corta en comparación con los análogos. [12] . Con base en el esquema de ElGamal, también se construyeron otros algoritmos, por ejemplo, el ruso GOST 34.10-94 , que ahora se considera obsoleto. Fue reemplazado por el estándar GOST R 34.10-2012 [13] , que utiliza un grupo de puntos de una curva elíptica .
Tal modificación, i.e. la transición del grupo multiplicativo módulo un número primo al grupo de puntos de curva elíptica también existe para DSA - ECDSA [14] ( Algoritmo de firma digital de curva elíptica - algoritmo de firma digital en curvas elípticas) . Se utiliza, por ejemplo, en la criptomoneda bitcoin para confirmar transacciones. Esta traducción le permite reducir el tamaño de las claves sin sacrificar la seguridad: en el sistema bitcoin, el tamaño de la clave privada es de 256 bits y la clave pública correspondiente es de 512 bits.
Otro algoritmo común de clave pública (utilizado tanto para el cifrado como para la firma digital), RSA (llamado así por los autores: Rivest , Shamir , Adleman ), se basa en la dificultad de factorizar números grandes.
Cualquier ataque al algoritmo se puede describir de la siguiente manera: un atacante recibe todos los parámetros de la firma pública y un determinado conjunto de pares (mensaje, firma) e intenta, utilizando este conjunto, crear una firma válida para un nuevo mensaje no representado en el conjunto. .
Estos ataques se pueden dividir condicionalmente en dos grupos: en primer lugar, un atacante puede intentar recuperar la clave secreta e inmediatamente tiene la oportunidad de firmar cualquier mensaje y, en segundo lugar, puede intentar crear una firma válida para un nuevo mensaje sin recuperar directamente la clave secreta.
La distribución uniforme del parámetro aleatorio es muy importante para la seguridad del sistema. Si se conocen varios bits de parámetros consecutivos para una serie de firmas, la clave secreta se puede recuperar con una alta probabilidad. [quince]
Repetir el parámetro para dos mensajes conduce a una simple piratería del sistema. Esto puede suceder cuando se utiliza un generador de números pseudoaleatorios defectuoso . Esta vulnerabilidad en el sistema PlayStation 3 permitía firmar cualquier programa en nombre de Sony . En algunas implementaciones del sistema bitcoin para Android, un atacante podría acceder a la billetera. [16] [17] Ambos ejemplos utilizaron el sistema ECDSA [14] .
Si se usó el mismo parámetro para dos mensajes , entonces sus firmas tendrán la misma pero diferente , llamémoslos .
De la expresión para podemos expresar el total :
.
Y equiparar común para diferentes mensajes:
Desde aquí es fácil expresar la clave secreta :
Algunos algoritmos de firma digital pueden ser atacados por una falsificación existente (falsificación existencial) . Se encuentra en el hecho de que para una firma (ya sea aleatoria o creada de acuerdo con alguna regla) es posible crear un mensaje correcto (que, sin embargo, generalmente no tiene sentido) utilizando solo parámetros públicos.
Para el esquema DSA, la firma , en cualquier caso , es válida para un mensaje con hash .
Esta es una de las razones para codificar el mensaje de entrada. Si la función hash se elige correctamente, el algoritmo DSA está protegido de este ataque, porque la inversión de la función hash criptográfica (es decir, para un hallazgo dado tal que ) es computacionalmente difícil. [Dieciocho]
la condición de corrección de la firma se puede reescribir en una forma diferente:
esta ecuación es equivalente (porque el orden multiplicativo de g módulo p es igual a q)
por lo que podemos suponer que para recuperar la clave, el atacante necesita resolver un sistema de ecuaciones de la forma
pero en este sistema es incógnita y nada más , lo que quiere decir que el número de incógnitas es una más que las ecuaciones, y para cualquiera existen las que satisfacen el sistema. Dado que q es un número primo grande, se requerirá un número exponencial de pares (mensaje, firma) para la recuperación. [una]
Puedes intentar falsificar una firma sin conocer la clave secreta, es decir, intentar resolver la ecuación
con respecto a y . Para cada fijo , la ecuación es equivalente a calcular el logaritmo discreto. [una]
Los términos de la licencia le permiten implementar el algoritmo en software y hardware. NIST creó DSAVS [19] ( Ing. The Digital Signature Algorithm Validation System - un sistema para verificar el algoritmo de firma digital ). DSAVS consta de varios módulos de prueba de cumplimiento que prueban cada componente del sistema independientemente de los demás. Componentes de implementación probados:
Para probar la implementación, el desarrollador debe enviar una solicitud para probar su implementación al laboratorio CMT ( Laboratorio de Pruebas de Módulos Criptográficos ) . [5]
El algoritmo DSA requiere dos primos ( y ), por lo que se necesita un generador de primos o pseudo -primos .
El algoritmo de Shaw-Taylor [20] se utiliza para generar números primos .
Los pseudoprimos se generan usando una función hash y la prueba probabilística de Miller-Rabin se usa para probar la primalidad . Se le puede agregar una sola prueba de primalidad de Luke . [5]
El número requerido de iteraciones depende de la longitud de los números utilizados y del algoritmo de verificación [5] :
opciones | solo prueba M-R | Prueba M-R + prueba de Luke |
---|---|---|
p: 1024 bits
q: 160 bits probabilidad de error |
40 | pag: 3
q:19 |
p: 2048 bits
q: 224 bits probabilidad de error |
56 | pag: 3
q:24 |
p: 2048 bits
q: 256 bits probabilidad de error |
56 | pag: 3
q:27 |
p: 3072 bits
q: 256 bits probabilidad de error |
64 | pag: 2
q:27 |
El algoritmo también requiere un generador de números aleatorios o pseudoaleatorios . Este generador es necesario para generar una clave privada de usuario x , así como para generar un parámetro aleatorio secreto .
El estándar ofrece varias formas de generar números pseudoaleatorios utilizando cifrados de bloques o funciones hash. [5] [21]