从Java中的已知参数创建RSA密钥

我正在努力实施Bing Cashback。 为了validation来自Bing的传入请求是有效的,他们提供签名。 签名是使用RSA加密的URL的160位SHA-1哈希。

Microsoft提供了RSA“公钥”,模数和指数,我应该用它来解密哈希。

有没有办法创建解密哈希所需的Java密钥对象,正如微软所说的那样?

我能找到的所有东西都会自动创建RSA密钥对,因为这就是RSA应该如何工作的。 如果可能的话,我真的很想使用Java对象,因为这显然比手动编码解决方案更可靠。

他们提供的示例代码是在.NET中,并使用.NET库函数来validation哈希。 特别是RSACryptoServiceProvider.VerifyHash()

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

使用java.security.spec.RSAPublicKeySpec。 它可以用指数和模数构造一个密钥。 然后使用带有键规范的java.security.KeyFactory.generatePublic()作为参数。

像这样的东西应该做的伎俩:

  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; } 

假设Public键是以hex字符串forms给出的,您需要Apache Commons Codec库

如果您有不同格式的密钥,请尝试使用KeyFactory获取更多信息。