2010-07-03 23 views
3

Lorsque je crée une paire de clés RSA devrais-je être en train de fairePublicKey vs RSAPublicKeySpec

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(2048); 
KeyPair kp = kpg.genKeyPair(); 
PublicKey publicKey = kp.getPublic(); 
PrivateKey privateKey = kp.getPrivate(); 

save("public.key",publicKey.getEncoded()) 
save("private.key",privateKey.getEncoded()) 

OU

KeyFactory fact = KeyFactory.getInstance("RSA"); 
RSAPublicKeySpec pub = fact.getKeySpec(kp.getPublic(),RSAPublicKeySpec.class); 
RSAPrivateKeySpec priv = fact.getKeySpec(kp.getPrivate(),RSAPrivateKeySpec.class); 

saveToFile("public.key", pub.getModulus(),pub.getPublicExponent()); 
saveToFile("private.key", priv.getModulus(),priv.getPrivateExponent()); 

Ce qui est mieux et quelle est la différence?

Répondre

4

Pour les clés publiques, cela ne fait pas beaucoup de différence. Pour les clés privées, getEncoded() renvoie beaucoup plus d'informations que la clé privée.

Voici le schéma ASN.1 pour clé privée RSA,

-- 
-- Representation of RSA private key with information for the CRT algorithm. 
-- 
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 
} 

Version ::= INTEGER { two-prime(0), multi(1) } 
    (CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --}) 

OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo 


OtherPrimeInfo ::= SEQUENCE { 
    prime    INTEGER, -- ri 
    exponent   INTEGER, -- di 
    coefficient  INTEGER -- ti 
} 

Ces paramètres supplémentaires permettront d'accélérer considérablement les opérations clés privées. Donc, vous devriez toujours utiliser getEncoded().

+0

Salut, j'ai un petit doute. J'ai le module et l'exposant. J'ai besoin de créer PublicKey. pouvez-vous s'il vous plaît laissez-moi savoir comment créer "PublicKey" sur "module" et "exposant" donné. – Andhravaala

0

Les méthodes getEncoded() renvoient des codages pour les clés publiques et privées qui sont «plus» standard et donc plus susceptibles d'être interopérables avec d'autres systèmes. Autrement dit, ils utilisent des normes telles que PKCS # 1.

Si vous n'êtes pas concerné par l'interopérabilité, vous devez probablement utiliser la classe java KeyStore pour stocker les clés.