Как получить связанный объект открытого ключа java.security.PublicKey
из объекта закрытого ключа java.security.PrivateKey
в криптосистеме RSA.
Как получить открытый ключ RSA из объекта закрытого ключа в Java
Ответы (2)
Java может создать открытый ключ, используя модуль и показатель степени:
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
kf.generatePublic(keySpec);
Итак, нам нужно извлечь эти значения из закрытого ключа:
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPrivateKeySpec priv = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class);
Теперь RSAPrivateKeySpec
-Object содержит нужный нам модуль, но показатель степени не тот, который нам нужен для открытого ключа.
Для открытого ключа показатель степени обычно равен 65537: http://en.wikipedia.org/wiki/65537_(number)
Поэтому теперь мы можем создать открытый ключ:
KeyFactory kf = KeyFactory.getInstance("RSA");
RSAPrivateKeySpec priv = kf.getKeySpec(privateKey, RSAPrivateKeySpec.class);
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(priv.getModulus(), BigInteger.valueOf(65537));
PublicKey publicKey = kf.generatePublic(keySpec);
RSAPrivateKey
(конечно, после проверки того, что это является RSAPrivateKey
)?
- person Maarten Bodewes; 16.07.2014
Вам нужно преобразовать закрытый ключ в RsaPrivateCrtKey. Если приведение успешно, вы можете извлечь открытый ключ. Если бросок терпит неудачу, строго говоря, у вас недостаточно информации.
public static RSAPublicKeySpec getPublicKeySpec(PrivateKey priv) {
RSAPrivateCrtKey rsaCrtKey = (RSAPrivateCrtKey) priv; // May throw a ClassCastException
return new RSAPublicKeySpec(rsaCrtKey.getModulus(), rsaCrtKey.getPublicExponent());
}
Если приведение не удается, вы можете попытаться угадать общедоступный показатель степени и проверить свое предположение, используя стандартное отношение RSA (xe)d = x mod N для всех x . Для вашего предположения о e попробуйте случайные значения x в уравнении и посмотрите, всегда ли выполняется соотношение. Однако этот метод может дать только вероятностный ответ.