Реализовать алгоритм RSA на Java

Я хочу реализовать алгоритм RSA для шифрования изображения (byte[]). Чтобы сгенерировать свои два ключа, я использовал этот фрагмент кода:

KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
keygen.initialize(512);
keyPair = keygen.generateKeyPair();

После создания открытого и закрытого ключей я хотел бы показать их пользователю, чтобы он мог распространить открытый ключ и использовать закрытый ключ для декодирования. Как мне вернуть этот ключ?

Использование keygen.getPrivateKey() и keygen.getPublicKey() дает мне всю информацию об алгоритме RSA, а не только ключи, которые мне нужны.

Спасибо


person Robin Monjo    schedule 25.04.2010    source источник


Ответы (3)


С помощью классов Relevant KeySpec вы можете вызвать методы getModulus () и getPublicExponent () / getPrivateExponent () для извлечения ключевых компонентов:

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

В случае, если это будет полезно, я написал несколько статей некоторое время назад, посвященных некоторым деталям Шифрование RSA в Java (и криптография на основе Java в целом.

person Neil Coffey    schedule 25.04.2010
comment
Большое спасибо, ваши статьи мне очень помогли. - person Robin Monjo; 26.04.2010

То, что вы публикуете, не имеет никакого смысла, поскольку getPublicKey () и getPrivateKey () возвращают именно то, что вы говорите, что вам нужно. Однако, если вы хотите извлечь компоненты, вам следует просто привести свои PublicKey и PrivateKey к RSAPublicKey и RSAPrivateKey вместо того, чтобы проходить через ритуал использования KeySpecs.

Кроме того, вскоре вы обнаружите, что вы не можете зашифровать ничего больше 501 байта, используя RSA с вашим планом, что в значительной степени бесполезно для изображений.

person President James K. Polk    schedule 25.04.2010

Вы можете использовать Key.getEncoded (), чтобы получить байты ключа.

person WhirlWind    schedule 25.04.2010