2010-06-21 30 views
16

Sorprendentemente, hay muy poca información en la web sobre el uso de la API liviana de Bouncy Castle. Después de mirar a su alrededor por un tiempo yo era capaz de armar un ejemplo básico:Bouncy Castle Generación de par de llaves RSA usando API liviana

RSAKeyPairGenerator generator = new RSAKeyPairGenerator(); 
generator.init(new RSAKeyGenerationParameters 
    (
     new BigInteger("10001", 16),//publicExponent 
     SecureRandom.getInstance("SHA1PRNG"),//prng 
     1024,//strength 
     80//certainty 
    )); 

AsymmetricCipherKeyPair keyPair = generator.generateKeyPair(); 

tengo una comprensión básica de RSA y las matemáticas que sucede detrás de las escenas, así que entiendo lo que publicExponent y strength son. Supongo que publicExponent se refiere a un coprime de phi(pq) y por lo que veo puede ser pequeño (como 3) siempre que se use el relleno adecuado. Sin embargo, no tengo idea de a qué se refiere certainty (en algún lugar se menciona que podría referirse a un porcentaje, pero quiero estar seguro). El uso de SecureRandom es autoexplicativo. El documentation of RSAKeyGenerationParameters es completamente inútil (no es sorpresa). Mi única conjetura es que tiene algo que ver con la precisión de las claves generadas, pero una vez más quiero estar seguro. Entonces mi pregunta es ¿cuáles son los valores apropiados para certainty y publicExponent?

P.S. No responda con "depende del contexto: qué tan segura quiere que sea la información". Es bastante seguro asumir el más alto nivel de seguridad (es decir, clave RSA de 4096 bits o superior) a menos que se especifique lo contrario ... También agradecería enlaces a fuentes que den buen ejemplo del uso de la API Lightweight de Bouncy Castle (no estoy en todos interesados ​​en la implementación de JCA o cualquier ejemplo relacionado con ella).

Respuesta

9

Usted está utilizando valores correctos para ambos.

El publicExponent debe ser un Fermat Number. 0x10001 (F4) es el valor recomendado actual. 3 (F1) también es seguro.

La generación de claves RSA requiere números primos. Sin embargo, es imposible generar números primos absolutos. Como cualquier otra biblioteca de cifrado, BC usa números primos probables. La certeza indica qué tan seguro quieres que el número sea primo. Cualquier cosa superior a 80 ralentizará considerablemente la generación de claves.

Tenga en cuenta que el algoritmo RSA aún funciona en el improbable caso de que el número primo no sea verdadero primo porque BC comprueba la relativa precocidad.

+0

Dado que el punto de la "prima probable" es que no se puede factorizar, ¿cómo se puede comprobar si es relativamente primo a otro número? ¿No es la verificación de la excelencia relativa simplemente otra verificación probabilística? – Jherico

+0

La exactitud relativa se puede comprobar fácilmente calculando GCD. Si es 1, 2 números son primos relativos. –

+0

* No * es imposible generar enteros primos comprobables, pero es más caro y se considera innecesario para RSA. Ueli Maurer dio un algoritmo rápido para esto hace muchos años. –

8

tendría que profundizar en su código fuente para ser "seguro", pero creo que el parámetro certainty se pasa directamente a la BigInteger constructor, que dice: "La probabilidad de que el nuevo BigInteger representa un número primo se exceda (1 - 1/2 certeza). El tiempo de ejecución de este constructor es proporcional al valor de este parámetro. "

Entonces, con un valor de 80, hay menos de 1 posibilidad en 2 de que el número no sea el primero. El comentario sugiere que el tiempo de generación de números primos es lineal con respecto a este parámetro, pero debe probarlo para asegurarse de que elija aumentarlo. Puede tener sentido utilizar un valor que sea coherente con el tamaño de la clave que está utilizando. Por ejemplo, NIST dice que una clave RSA de 1024 bits es tan fuerte como una clave simétrica de 80 bits. Para una clave RSA de 2048 bits, es posible que desee utilizar una certeza de 112 bits (el tamaño de clave simétrica de fuerza equivalente), y así sucesivamente.

Parece que eres consciente de la vulnerabilidad de usar 3 como el exponente público en casos especiales. El valor 65537 se usa casi universalmente ahora.

+2

Las "vulnerabilidades" de 3 como exponente público son principalmente un gran malentendido histórico. 65537 es un excelente ejemplo de culto a la carga en informática. 65537 no está mal, pero 3 tampoco es peor; si 3 conduce a debilidades, entonces estás haciendo algo diferente y, en cambio, usar 65537 probablemente no te salve. –

+0

@Thomas: Con respecto a establecer el valor del exponente público a 65537, sospeché mucho. También podría ser mayor que 65537, ¿verdad? Cualquier primo va a hacer? – Andrey

+2

@yamsha: el exponente público puede ser cualquier valor que sea _relativamente prime_ a p-1 y q-1 (donde pyq son los factores primos del módulo RSA). El generador de claves RSA usa el exponente público proporcionado como parámetro y selecciona py p apropiado. Esto descarta incluso los valores. Cualquier entero impar (excepto 1) se puede usar como exponente público; usar un primo solo lo hace un poco más simple para el generador de llaves. El costo de las operaciones de clave pública aumenta con el tamaño del exponente público, por lo que es probable que desee mantenerlo pequeño. –

3

Una buena referencia es FIPS PUB 186-3. En particular, la sección 3 del apéndice B tiene muchos parámetros de seguridad, así como algoritmos de generación principal.certainty es el número de iteraciones de la prueba de primalidad Miller-Rabin.

2

See this answer on crypto.stackexchange.com para obtener más información sobre cómo debe calcularse su valor de certeza.

de vista previa de la respuesta de Paulo Ebermann:

La certeza de x bits significa que la probabilidad de que algo (en este caso siendo p primo) no ser verdadera es menor que 2-x. Esta es la misma probabilidad que adivinar correctamente un valor de x-bit aleatorio en el primer intento de , de ahí el nombre.

¿Cómo seleccionar x? Queremos que la probabilidad de que p (yq) no sea prime sea lo suficientemente pequeña como para que una probabilidad de falla en este punto no sea mayor que otras formas en que el sistema podría romperse, como adivinar una clave simétrica , factorizar el módulo, etc.

Por lo tanto, aquí una tabla de correspondencia de tamaños de clave simétricos y asimétricos debería ayudar. http://www.keylength.com/ Elija la misma certeza máxima que elegiría un tamaño de clave simétrica que acompaña al uso de su clave pública.

Cuestiones relacionadas