2010-07-03 79 views
3

當我創建一個RSA密鑰對我應該做公鑰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()) 

OR

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()); 

哪個更好,有什麼區別?

回答

4

對於公鑰,它沒有太大的區別。對於私鑰,getEncoded()返回比私鑰更多的信息。

這裏是RSA私鑰的ASN.1模式,

-- 
-- 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 
} 

這些額外參數將大大加快私鑰操作。所以你應該總是使用getEncoded()

+0

嗨,我有一個小小的懷疑。我有模數和指數。我需要創建PublicKey。你可以讓我知道如何創建「公鑰」給出'模數'和'指數'。 – Andhravaala 2010-07-12 10:38:56

0

getEncoded()方法返回「更多」標準的公鑰和私鑰的編碼,因此更有可能與其他系統互操作。也就是說,他們使用的是諸如PKCS#1的標準。

如果您不關心互操作性,那麼您應該使用Java KeyStore類來存儲密鑰。