2010-07-03 126 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类来存储密钥。