¿Cuál es la diferencia entre los generadores Diffie Hellman 2 y 5?

23

La generación de parámetros de Diffie Hellman en OpenSSL se puede hacer de la siguiente manera:

$ openssl dhparam -out dh2048.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time 
[...]

El "generador 2" llamó mi atención allí. Parece que puedo elegir entre los generadores 2 y 5 como lo indica la página del manual ( man dhparam ):

-2, -5
   The generator to use, either 2 or 5. 2 is the default. If present then the input file
   is ignored and parameters are generated instead.
  • ¿Qué es el generador 2 y 5?
  • ¿Cómo afecta la seguridad elegir 5 en lugar de 2?
  • ¿Es esto específico para OpenSSL?
pregunta gertvdijk 28.03.2014 - 14:17
fuente

2 respuestas

17

Diffie-Hellman funciona en un subgrupo de enteros modulo a prime p . Es decir, tiene un generador g , que es un módulo de enteros convencional p . Ese generador tiene un orden r que es el entero positivo más pequeño, tal que g r = 1 mod p . Los dos sistemas que participan en DH eligen las claves privadas a y b respectivamente como enteros en un rango determinado, y las claves públicas de DH correspondientes (que intercambian a través del cable) son ga mod p y gb mod p .

DH es seguro siempre que:

  • p es "adecuado": lo suficientemente grande (al menos 1024 bits) y no se produce con una "estructura especial" que hace que logaritmo discreto fácil. Un primo generado aleatoriamente del tamaño correcto estará bien.
  • El mayor divisor principal de r tiene un tamaño de al menos 2k bits, cuando se dirige a un nivel de seguridad de " k bits". Básicamente, el mayor divisor principal de r debe ser un número entero primo de tamaño de al menos 160 bits (los estándares actuales preferirían 200 bits o más).
  • Las claves privadas DH se generan en un rango de tamaño al menos 22k o menos. Básicamente, a y b también deben ser 2k -bit enteros.

El valor exacto del generador g no importa, siempre que ambas partes utilicen el mismo valor. Se puede demostrar que si alguien puede calcular un logaritmo discreto en relación con un generador g , puede calcularlo con la misma facilidad con relación a cualquier generador g ' del mismo subgrupo. Por lo tanto, lo que importa es el orden de subgrupos , no el generador. Puede utilizar 2 o 5 , no cambiará la seguridad.

El uso de un generador corto tiene algunos (leves) beneficios para el rendimiento, por lo que se prefieren. Sin embargo, la diferencia de rendimiento entre 2 y 5 será despreciable. En algunos protocolos, el generador se acuerda a nivel de protocolo, es decir, no se transmite a través del cable; Está codificado en ambos sistemas. Por lo tanto, algunos protocolos exigen el uso de 2 , otros quieren usar 5 , por razones históricas y tradicionales. OpenSSL, como una biblioteca de propósito general, puede generar parámetros para ambos casos.

Sin embargo, hay detalles . Asegurarse de que el generador elegido tenga un pedido con un divisor principal lo suficientemente grande puede ser complicado. De forma predeterminada, openssl dhparam generará un llamado "primo seguro", es decir, genera primos aleatorios q hasta que encuentre uno tal que p = 2q + 1 también sea un entero primo El orden de cualquier g módulo q es siempre un divisor de p-1 . Por lo tanto, al utilizar Safe Prime, OpenSSL tiene garantizado que el orden r de cualquier generador g en el rango 2..p-2 ( en particular 2 y 5 ) serán iguales a q o 2q , por lo tanto siempre es un múltiplo de q , que es lo suficientemente grande como primo.

Si OpenSSL generó un p aleatorio sin asegurarse de que era un "primo seguro", entonces el orden real de g = 2 o 5 sería difícil de calcular exactamente (implicaría factorizar p-1 , que es caro).

En algunos contextos que no son DH, es decir, el algoritmo de firma DSA, uno debe tener un subgrupo similar a DH tal que el orden del generador sea exactamente igual a un número primo no demasiado grande dado q , en lugar de ser simplemente un múltiplo de q . En ese caso, OpenSSL (con el interruptor de línea de comando -dsaparam ) generará primero q , luego p = qt + 1 para valores aleatorios de t hasta que se encuentra un primo; y el generador se obtendrá tomando un s modulo p al azar y calculando g = s t modulo p (esto necesariamente da como resultado 1 o un número entero de orden exactamente q ). Al generar parámetros DSA, el generador no puede ser forzado (o en absoluto) a ser un entero pequeño específico como 2 o 5 . Para DSA, el generador es "grande".

    
respondido por el Tom Leek 28.03.2014 - 14:56
fuente
12
  

¿Qué es el generador 2 y 5?

Comprender esto requiere cierta cantidad de antecedentes matemáticos. Diffie-Hellmann opera en grupos cíclicos . Todos estos grupos tienen en común que hay al menos un generador , es decir, un elemento que puede se utilizará para generar todos los demás elementos del grupo.

Veamos un ejemplo:

Z_11 *: Conjunto de enteros i = 0,1, ..., 10 para los cuales gcd (i, 11) = 1. Este es un grupo abeliano bajo el módulo de multiplicación 11.

Generador: a = 2

a^1  =           2 mod 11,
a^2  =           4 mod 11,
a^3  =           8 mod 11,
a^4  = (  16 =)  5 mod 11, 
a^5  = (  32 =) 10 mod 11,
a^6  = (  64 =)  9 mod 11,
a^7  = ( 128 =)  7 mod 11,
a^8  = ( 256 =)  3 mod 11,
a^9  = ( 512 =)  6 mod 11,
a^10 = (1024 =)  1 mod 11

Como puede ver, generamos todo el grupo, es decir, tenemos cada elemento como resultado. Sin embargo, tenga en cuenta que esto funcionará en todo tipo de grupos, y no se limita a un grupo multiplicativo de enteros módulo p.

  

¿Cómo afecta a la seguridad elegir 5 en lugar de 2?

No, el problema Diffie-Hellman tiene que ver con el tamaño del grupo cíclico, no sobre los elementos que generan el grupo . Entonces, cuando ambos elementos son generadores para un grupo, no hay diferencia. Sin embargo, elegir 2 como generador tiene un par de ventajas, ya que puede implementar los algoritmos subyacentes de manera más eficiente.

Personalmente, no cambiaría el valor predeterminado aquí, a menos que haya una muy buena razón para hacerlo. Obviamente, este no es el caso, de lo contrario no tendría que preguntar;).

  

¿Es esto específico para OpenSSL?

No, esto se deduce de las matemáticas de los grupos cíclicos en sí.

    
respondido por el Karol Babioch 28.03.2014 - 14:47
fuente

Lea otras preguntas en las etiquetas