Создание ключей RSA из известных параметров в Java - PullRequest
14 голосов
/ 07 января 2010

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

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

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

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

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

Ответы [ 3 ]

27 голосов
/ 08 января 2010
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 голосов
/ 07 января 2010

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

0 голосов
/ 07 января 2010

Примерно так должно получиться:

  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

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

...