¿Cuántas iteraciones de Rabin-Miller deben usarse para generar primos seguros criptográficos?

13

Estoy generando un primo seguro de 2048 bits para una clave tipo Diffie-Hellman, p, de manera que p y (p-1) / 2 son primos.

¿Cuántas iteraciones de Rabin-Miller puedo usar tanto en p como en (p-1) / 2 y sigo confiando en una clave criptográficamente fuerte? En la investigación que he hecho, he escuchado de 6 a 64 iteraciones para números primos ordinarios de 1024 bits, por lo que estoy un poco confundido en este punto. Y una vez que está establecido, ¿cambia el número si está generando un primo seguro en lugar de uno común?

El tiempo de cómputo es escaso, por lo que esta es una pregunta práctica. Básicamente me pregunto cómo averiguar el número más bajo posible de pruebas que puedo realizar y al mismo tiempo mantener casi la seguridad garantizada.

    
pregunta jnm2 13.06.2011 - 13:24
fuente

3 respuestas

4

( t = 40 ) las iteraciones de M-R con bases aleatorias son completamente innecesarias para p (1024, t) < (2 ^ -80). No más de 1/4 de los valores impares compuestos son SPRP a una base aleatoria. El ((1/4) ^ t) es extremadamente pesimista, y los documentos DLP , < a href="http://www.ams.org/journals/mcom/1996-65-213/S0025-5718-96-00695-3/S0025-5718-96-00695-3.pdf"> RBJ (este último también prueba la conjetura DLP: p (k, t) < (1/4) ^ t, para k > = 2, t > = 1), combina resultados que prueben que ( t = 3 ) las iteraciones son suficientes para producir: p(1024, t) < 2^-80 . Consulte también: Manual de criptografía aplicada ch.4, tabla.4.4. Este mismo valor ( t = 3 ) se usa para valores de 1024 bits en la biblioteca OpenSSL.

    
respondido por el Brett Hale 10.03.2012 - 21:19
fuente
15

Acabo de responder a la misma pregunta en stackoverflow, por lo que duplicaré mi respuesta aquí (no creo que la duplicación sea el camino a seguir; tal vez la pregunta debería migrarse):

Supongamos que seleccionas un primer p seleccionando valores aleatorios hasta que encuentres uno para el que Miller-Rabin dice: ese parece un primo. Usas rondas de n como máximo para la prueba de Miller-Rabin. (Para un llamado "primer seguro", las cosas no se cambian, excepto que se ejecutan dos pruebas anidadas).

La probabilidad de que un entero de 1024 bits aleatorio sea primo es aproximadamente 1/900. Ahora, no desea hacer nada estúpido por lo que genera solo valores impares (se garantiza que un entero par de 1024 bits no es primo) y, en general, solo ejecuta la prueba de Miller-Rabin Si el valor no es "obviamente" no primo, es decir, se puede dividir por un primo pequeño. Así que terminas probando unos 300 valores con Miller-Rabin antes de alcanzar un prime (en promedio). Cuando el valor no es primo, Miller-Rabin lo detectará con una probabilidad de 3/4 en cada ronda, por lo que el número de rondas de Miller-Rabin que ejecutará en promedio para un solo valor no primo es de 1+ (1/4 ) + (1/16) + ... = 4/3. Para los 300 valores, esto significa aproximadamente 400 rondas de Miller-Rabin, independientemente de lo que elija para n .

( Editar: en realidad, para un no primo elegido al azar, Miller-Rabin funciona mejor que eso (consulte la respuesta de @Brett) y el número promedio de rondas será más cercano a 300 de 400. No cambia sustancialmente mi argumento.)

Entonces, si selecciona n como, por ejemplo, 40, entonces el costo implícito por n es inferior al 10% del costo computacional total. El proceso de selección de primos aleatorios está dominado por la prueba en primos, que no se ven afectados por el valor de n que elija. Hablé aquí sobre los enteros de 1024 bits; para números más grandes, la elección de n es incluso menos importante ya que los números primos se vuelven más dispersos a medida que aumenta el tamaño (para enteros de 2048 bits, el "10%" de arriba se convierte en "5%").

Por lo tanto, puedes elegir n = 40 y estar contento con él (o al menos saber que reducir n no te comprará mucho de todos modos). Por otro lado, usar un n mayor de 40 no tiene sentido, porque esto te llevaría a probabilidades más bajas que el riesgo de una simple falta de cómputo. Las computadoras son hardware, pueden tener fallas aleatorias. Por ejemplo, una función de prueba de primalidad podría devolver "verdadero" para un valor no primo porque un rayo cósmico (una partícula de alta energía que circula a través del Universo a alta velocidad) llega a golpear el transistor correcto en el momento adecuado, volteando el devuelva el valor de 0 ("falso") a 1 ("verdadero"). Esto es muy poco probable, pero no menos probable que sea la probabilidad 2-80 . Consulte esta respuesta de stackoverflow para más detalles. La conclusión es que, independientemente de cómo se asegure de que un entero sea primo, todavía tenga un elemento probabilístico inevitable, y 40 rondas de Miller-Rabin ya le dan lo mejor que puede esperar.

Para resumir, usa 40 rondas.

    
respondido por el Thomas Pornin 13.06.2011 - 14:04
fuente
1

El factor más importante para acelerar Miller-Rabin es usar una prueba de divisibilidad simple sobre un conjunto de primos pequeños primero, y solo recurrir a Miller-Rabin si eso pasa.

  

Si un entero impar de k-bit aleatorio n es divisible por un primo pequeño, es menos costoso computacionalmente descartar al candidato n por división de prueba que al usar la prueba de Miller-Rabin. Dado que la probabilidad de que un entero aleatorio n tenga un divisor primo pequeño es relativamente grande, antes de aplicar la prueba de Miller-Rabin, el candidato n debe someterse a pruebas para divisores pequeños debajo de un límite predeterminado B ".

enlace (4.1.1)

    
respondido por el Jared Deckard 28.09.2017 - 17:38
fuente

Lea otras preguntas en las etiquetas