Pregunta

Sorprendentemente hay muy poca información en la web sobre el uso de la API de peso ligero de castillo hinchable. Después de mirar a su alrededor por un tiempo yo era capaz de armar un ejemplo básico:

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 un conocimiento básico de RSA y las matemáticas que sucede detrás de las escenas, así que entiendo lo que publicExponent y strength son. Supongo publicExponent se refiere a un primos entre sí de phi(pq) y de lo que se reúnen que puede ser pequeña (como 3) siempre que se utiliza relleno apropiado. Sin embargo, no tengo ni idea de lo que se refiere a certainty (algún lugar mencionó que podría referirse a un porcentaje pero quiero estar seguro). El uso de SecureRandom es auto-explicativo. El documentación de RSAKeyGenerationParameters es completamente inútil (no hay sorpresa). Mi única suposición es que tiene algo que ver con la exactitud de las claves generadas, pero una vez más quiero estar seguro. Así que mi pregunta es ¿cuáles son los valores apropiados para certainty y publicExponent?

P.S. No responda con "depende del contexto - cómo asegurar desea que la información sea". Es bastante seguro asumir más alto grado de seguridad (es decir, la clave RSA de 4096 bits o superior) a menos que se especifique lo contrario ... También agradecería enlaces a fuentes que dan buen ejemplo del uso de la API de peso ligero del Castillo Hinchable (no estoy en todos los interesados ??en la aplicación JCA o cualquier ejemplos pertenecientes a ella).

¿Fue útil?

Solución

Está utilizando valores correctos para ambos.

El publicExponent debe ser un Número de Fermat . 0x10001 (F4) es el valor actual recomendado. 3 (F1) se sabe que es seguro también.

La generación de claves RSA requiere números primos. Sin embargo, es imposible generar números primos absolutos. Al igual que cualquier otra biblioteca de cifrado, BC utiliza números primos probables. La certeza indican cómo ciertos desea que el número sea primo. Cualquier cosa por encima de 80 se ralentizará considerablemente la generación de claves.

Tenga en cuenta que el algoritmo RSA todavía funciona en el improbable caso de que el número primo no es cierto primo porque cheques BC para primalidad relativa.

Otros consejos

Me tendría que profundizar en su código fuente para ser "seguro", pero yo 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 superará (1 - 1/2 certeza ).. el tiempo de ejecución de este constructor es proporcional al valor de este parámetro "

Por lo tanto, con un valor de 80, hay menos probabilidad de 1 en 2 80 de que el número no será primer. El comentario sugiere que la hora de máxima audiencia de generación de números es lineal con respecto a este parámetro, pero se debe probar que para ser seguro si usted elige para aumentarlo. Podría tener sentido utilizar un valor que es consistente con el tamaño de la clave que está utilizando. Por ejemplo, el 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 del 112 bits (el tamaño de clave simétrica resistencia equivalente), y así sucesivamente.

Parece que usted es consciente de la vulnerabilidad de la utilización de 3 como el exponente público en casos especiales. El valor 65537 se utiliza casi universalmente ahora.

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

Ver esta respuesta en crypto.stackexchange.com para obtener más información sobre cómo se debe calcular el valor de certeza .

Vista preliminar de la respuesta de Paulo Ebermann:

  

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

     

¿Cómo seleccionar x? Queremos que la probabilidad de p (y q) no ser primer   sea ??lo suficientemente pequeño que una probabilidad de fallo en este punto no es   más grandes que otras formas en que el sistema podría ser roto - como adivinar una   clave simétrica, factoring el módulo, etc.

     

Así que aquí una tabla de correspondencia de los tamaños de clave simétrica y asimétrica   debería ayudar. http://www.keylength.com/ Escoge la misma certeza primordial como lo haría elegir una   tamaño de la clave simétrica que acompaña a su uso de la clave pública.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top