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

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

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

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

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

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


person meleager    schedule 07.01.2010    source источник


Ответы (3)


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

person Seva Alekseyev    schedule 07.01.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 для получения дополнительной информации.

person Jason Nichols    schedule 07.01.2010
comment
Придется проверить, есть ли у нас эта библиотека или сможем ли мы ее получить. Кроме того, будет ли объект Cipher иметь открытый ключ в DECRYPT_MODE? Мне это кажется очень обратным. - person meleager; 08.01.2010
comment
Будет, если вы используете Sun JRE, но не версию IBM. По совпадению, IBM JRE, использующая поставщика криптографии Bouncy Castle, также будет работать. - person Jason Nichols; 08.01.2010
comment
Это может показаться обратным, но то, что вы делаете, по сути расшифровывает «подписанный» хеш. После расшифровки хэш, который вы вычислили, и хэш, предоставленный вам Microsoft, должны совпадать. - person Jason Nichols; 08.01.2010
comment
... но это трудный способ сделать то, что правильно сделал Эриксон. - person President James K. Polk; 09.01.2010
comment
Мой код выше совершенно правильный (и работает). Если исходный плакат имеет ключ в шестнадцатеричной строке (вместо формата модуля / экспоненты), это единственный ответ, который действительно поможет ему. Иронично, что это я не получил за это баллов. - person Jason Nichols; 09.01.2010
comment
Я понимаю, что сейчас происходит. Это интересный процесс проверки, на самом деле все, что я делаю, это проверяю, правильно ли был рассчитан и зашифрован хеш. Поскольку практически любой может сделать это без каких-либо негативных последствий, расшифровка с помощью открытого ключа - это нормально. Не хочу противоречить, но код Эриксона на самом деле был весьма полезен. Хотя я ценю, что вы приняли во внимание шестнадцатеричную кодировку, код Эриксона немного чище. Спасибо еще раз за помощь. - person meleager; 12.01.2010
comment
Если исходный плакат имеет ключ в шестнадцатеричной строке (вместо формата модуля / экспоненты), я знаю, что это старый, но, просто комментируя ... Я думаю, что в вопросе указано, что у меня есть ключ RSA модуль и показатель степени. Итак ... приведенный здесь код не поможет. Если нет способа получить шестнадцатеричную строку из модуля и экспоненты. - person Cheeso; 08.10.2015

person    schedule
comment
Будет ли Cipher принимать открытый ключ в DECRYPT_MODE? - person meleager; 08.01.2010
comment
Да, реализация шифра RSA большинства провайдеров принимает открытый ключ для дешифрования. Они даже проверит правильность заполнения. Однако лучше использовать экземпляр Signature. Я обновлю свой ответ, чтобы продемонстрировать. - person erickson; 08.01.2010