3

RSAキーペアを作成するときは、

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

また

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

2 に答える 2

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

于 2010-07-03T14:25:13.340 に答える
0

getEncoded()メソッドは、「より」標準的であり、したがって他のシステムと相互運用可能である可能性が高い公開鍵と秘密鍵のエンコードを返します。つまり、PKCS#1などの標準を使用します。

相互運用性を気にしない場合は、キーの格納にjavaKeyStoreクラスを使用する必要があります。

于 2010-07-03T14:10:30.283 に答える