2010-05-27 6 views
10

Le générateur de clé a été initialisé avec une taille de 1024, alors pourquoi les tailles imprimées sont-elles 635 et 162?Essayer de comprendre la taille de la clé 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); 

    } 

} 

Répondre

20

Les clés RSA sont composées de modules et d'exposants. La taille de la clé fait référence aux bits du module. Ainsi, même sans surcharge d'encodage, vous aurez besoin de plus de 128 octets pour stocker les clés de 1024 bits. GetEncoded() renvoie les objets codés DER ASN.1. La clé privée contient même des paramètres CRT, c'est donc très grand.

Pour obtenir la taille des clés, faire quelque chose comme ça,

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

Voici les objets ASN.1 pertinents,

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

alors, comment puis-je vérifier sa taille dans l'exemple de code? –

+0

Voir mes modifications ...... –

4

Première indication: 1024 bits = 128 bytes

Deuxième indice: privateKey.getEncoded() retourne une représentation encoded (à savoir non brut).

+1

merci pour 2 indice, alors comment puis-je obtenir l'état brut? –

+2

La "taille de clé" signifie différentes choses pour différents codeurs, et n'est pas trivialement liée à la clé. Dans le cas de RSA, c'est la taille du module. (Vous devriez utiliser getModulus()) Voir la réponse de ZZ Coder. – leonbloy

+0

il y a quelque chose qui ne va pas, le getModulus retourne un nombre de 309 chiffres. Si cela signifie que la taille est de 309, ce n'est toujours pas ce que l'on a fait (1024). –

Questions connexes