PublicKey против RSAPublicKeySpec - PullRequest
       24

PublicKey против RSAPublicKeySpec

3 голосов
/ 03 июля 2010

Когда я создаю пару ключей 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());

Что лучше и в чем разница?

Ответы [ 2 ]

4 голосов
/ 03 июля 2010

Для открытых ключей это не имеет большого значения. Для закрытых ключей getEncoded () возвращает гораздо больше информации, чем закрытый ключ.

Вот схема ASN.1 для закрытого ключа 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
}

Эти дополнительные параметры значительно ускорят операции с закрытым ключом. Поэтому вы всегда должны использовать getEncoded().

0 голосов
/ 03 июля 2010

Методы getEncoded () возвращают кодировки для открытых и закрытых ключей, которые являются «более» стандартными и, таким образом, с большей вероятностью будут совместимы с другими системами.То есть они используют такие стандарты, как PKCS # 1.

Если вас не беспокоит совместимость, вам, вероятно, следует использовать класс java KeyStore для хранения ключей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...