2010-05-27 10 views
10

El generador de claves se inició con un tamaño de 1024, ¿por qué los tamaños impresos son 635 y 162?Intentando comprender el tamaño de la clave Java RSA

import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.NoSuchAlgorithmException; 
import java.security.NoSuchProviderException; 
import java.security.interfaces.RSAPrivateKey; 
import java.security.interfaces.RSAPublicKey; 

public class TEST { 

    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException, NoSuchProviderException { 
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC"); 
    keyPairGenerator.initialize(1024); 
    return keyPairGenerator.generateKeyPair(); 
    } 

    public static void main(String[] args) throws Exception { 

    KeyPair keyPair = generateKeyPair(); 
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); 
    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); 

    System.out.println("Size = " + privateKey.getEncoded().length); 
    System.out.println("Size = " + publicKey.getEncoded().length); 

    } 

} 

Respuesta

20

Las teclas RSA están hechas de módulo y exponente. El tamaño de la clave se refiere a los bits en el módulo. De modo que, incluso sin una sobrecarga de codificación, necesitará más de 128 bytes para almacenar claves de 1024 bits.

getEncoded() devuelve objetos codificados DER ASN.1. La clave privada incluso contiene parámetros CRT, por lo que es muy grande.

Para obtener tamaño de la clave, hacer algo como esto,

System.out.println("Key size = " + publicKey.getModulus().bitLength()); 

Éstos son los objetos ASN.1 pertinentes,

RSAPrivateKey ::= SEQUENCE { 
    version   Version, 
    modulus   INTEGER, -- n 
    publicExponent INTEGER, -- e 
    privateExponent INTEGER, -- d 
    prime1   INTEGER, -- p 
    prime2   INTEGER, -- q 
    exponent1   INTEGER, -- d mod (p-1) 
    exponent2   INTEGER, -- d mod (q-1) 
    coefficient  INTEGER, -- (inverse of q) mod p 
    otherPrimeInfos OtherPrimeInfos OPTIONAL 
} 


RSAPublicKey ::= SEQUENCE { 
    modulus   INTEGER, -- n 
    publicExponent INTEGER -- e 
} 
+0

entonces, ¿cómo puedo verificar su tamaño en el código de ejemplo? –

+0

Ver mis ediciones ...... –

4

Primera pista: 1024 bits = 128 bytes

Segunda pista: privateKey.getEncoded() devuelve un encoded representación (es decir, no en bruto).

+1

gracias por pista 2, así que ¿cómo puedo obtener el crudo? –

+2

El "tamaño de clave" significa diferentes cosas para diferentes codificadores, y no está relacionado trivialmente con la clave. En el caso de RSA, es el tamaño del módulo. (Deberías usar getModulus()) Ver la respuesta de ZZ Coder. – leonbloy

+0

hay algo mal, el getModulus devuelve un número de 309 dígitos. Si esto significa que el tamaño es 309, aún no es lo que había configurado (1024). –

Cuestiones relacionadas