2010-05-27 15 views

Respuesta

22

Usted podría intentar esto:

key.getModulus().bitLength(); 
4

El tamaño de una clave RSA es el número de bits en su módulo, por lo que desea myRSAKey.getModulus().bitLength().

4

(EDIT: escribí esta respuesta antes de entender las restricciones impuestas a los enteros primos que se generan para una clave RSA. http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf Creo que cualquier generador de llaves debe garantizar que el módulo esté entre 2^(n- 1) y 2^n-1. Por lo tanto, la representación mínima de dos complementos del módulo siempre tendrá exactamente el número de bits que se especificaron para la longitud de la clave en el momento de la creación de la clave. Por ejemplo, si crea una Clave de 2048 bits, luego key.getModulus(). BitLength() siempre devolverá 2048.)

¿Perdón, pero no key.getModulus().bitLength() devuelve un valor incorrecto cuando el bit más significativo del módulo es un 0? Por ejemplo, para una clave de 2048 bits, si el bit más significativo del módulo es 0, entonces key.getModulus().bitLength() devolverá 2047 (o menos si más bits son 0). Yo creo que el resultado deseado en tal caso sería en realidad 2048.

La documentación para BigInteger.bitLength() dice lo siguiente:

Devuelve el número de bits en la representación mínima en complemento a dos de esta BigInteger, excluyendo un signo de bit. Para BigIntegers positivos, esto es equivalente al número de bits en la representación binaria ordinaria. (? Calcula (ceil (log2 (esto < 0 -esta:. Este + 1))))

me temo que uno tiene que hacer algunas suposiciones acerca de lo que el tamaño de la clave podría ser. Vas a tener que asumir, por ejemplo, que sólo se va a ver nunca, llaves 1024 2048, o 4096 bits y luego hacer algo como:

int keySize; 
int bitLength = key.getModulus().bitLength(); 
if (bitLength <= 512) { 
    throw new IllegalArgumentException(...) 
} 
else if (bitLength <= 1024) { 
    keySize = 1024; 
} 
else if (bitLength <= 2048) { 
    keySize = 2048; 
} 
else if (bitLength <= 4096) { 
    keySize = 4096; 
} 
else { 
    throw new IllegalArgumentException(...) 
} 
return keySize; 

Este código todavía puede estar equivocado en el (muy raro) ocasión, por ejemplo, cuando los primeros 1048 bits de una clave de 2048 bits son todos 0. Sin embargo, creo que no es algo de lo que preocuparse.

+0

Este código es incorrecto en cada ocasión. 'key.getModulus(). bitLength()' ES el valor definido por los términos "tamaño de clave" o "longitud de clave". Reemplazarlo con valores arbitrarios elegidos es completamente erróneo. –

+0

Oleg, tienes razón, por supuesto. Agregué el EDIT para explicar mi malentendido sobre las restricciones en los factores principales que entran en la generación de claves. –

+0

Si aún está paranoico con los generadores de claves pésimos, se puede usar el redondeo: keySize = ((bitLength + 127)/128) * 128. Mejor que adivinar. Y la posibilidad de que los 128 bits altos sean todos ceros es, bueno, del orden de 1 en 2^128. –

Cuestiones relacionadas