Создание ключей RSA из известных параметров в Java

Я работаю над реализацией Bing Cashback. Чтобы проверить входящий запрос от Bing как действительный, они предоставляют подпись. Подпись представляет собой 160-битный SHA-1 хэш URL-адреса, зашифрованного с использованием RSA.

Microsoft предоставляет "открытый ключ" RSA, модуль и экспонента, с которыми я должен расшифровать хэш.

Есть ли способ создать ключевые объекты Java, необходимые для дешифрования хэша, как говорит Microsoft?

Все, что я могу найти, автоматически создает пары ключей RSA, так как RSA должен работать. Я бы очень хотел использовать объекты Java, если это вообще возможно, поскольку это, очевидно, более надежное, чем ручное кодированное решение.

Пример кода, который они предоставили, находится в .NET и использует библиотечную функцию .NET для проверки хэша. В частности, RSACryptoServiceProvider.VerifyHash()

Ответы

Ответ 1

RSAPublicKeySpec spec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey pub = factory.generatePublic(spec);
Signature verifier = Signature.getInstance("SHA1withRSA");
verifier.initVerify(pub);
verifier.update(url.getBytes("UTF-8")); // Or whatever interface specifies.
boolean okay = verifier.verify(signature);

Ответ 2

Используйте java.security.spec.RSAPublicKeySpec. Он может построить ключ от экспоненты и модуля. Затем используйте java.security.KeyFactory.generatePublic() с ключом spec в качестве параметра.

Ответ 3

Что-то вроде этого должно сделать трюк:

  private PublicKey convertPublicKey(String publicKey) throws Exception{
    PublicKey pub = null;

    byte[] pubKey = Hex.decodeHex(publicKey.toCharArray());
    X509EncodedKeySpec pubSpec = new X509EncodedKeySpec(pubKey);
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    pub = (RSAPublicKey) keyFactory.generatePublic(pubSpec);

    return pub;
  }

Предполагается, что открытый ключ указывается как шестнадцатеричная строка, и вам понадобится библиотека Apache Commons Codec

Если у вас есть ключ в другом формате, попробуйте KeyFactory для получения дополнительной информации.