2010-01-07 21 views
13

Bing Cashback'i uygulamak için çalışıyorum. Bing'den gelen bir isteği geçerli olarak doğrulamak için bir imza sağlarlar. İmza, RSA kullanılarak şifrelenmiş url'nin 160-bit SHA-1 hash'idir.Java'da bilinen parametrelerden RSA anahtarları oluşturma

Microsoft, karma şifresini çözmem gereken RSA "ortak anahtar", modül ve üsleri sağlar.

Microsoft'un dediği gibi karma şifresini çözmek için gereken Java anahtarı nesnelerini oluşturmanın bir yolu var mı?

Bulabildiğim her şey RSA anahtar çiftlerini otomatik olarak oluşturur, çünkü RSA'nın çalışması gerekir. Java nesnelerini kullanmak gerçekten çok isterim, çünkü el kodlu bir çözümden daha güvenilirdir.

Sağladıkları örnek kod .NET'tedir ve karma değerini doğrulamak için .NET kitaplığı işlevi kullanır. Özellikle RSACryptoServiceProvider.VerifyHash()

cevap

20
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); 
+0

Cipher, DECRYPT_MODE içinde herkese açık bir anahtar alacak mı? – meleager

+0

Evet, çoğu sağlayıcıların RSA şifreleme uygulaması şifre çözme için bir ortak anahtarı kabul edecektir. Doğru doldurmayı bile kontrol ederler. Ancak, bir 'İmza 'örneği kullanmak daha iyidir. Göstermek için cevabımı güncelleyeceğim. – erickson

0
hile yapmak gerekir böyle

şey:

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

Bu altılı dizesi olarak verilmektedir Kamu anahtarı üstlenmez ve Apache Commons Codec library

Eğer gerekir anahtarı farklı bir biçimde al, daha fazla bilgi için KeyFactory'u deneyin.

+0

Bu kitaplığa sahip olup olmadığımızı veya alabilirsek kontrol edip bakmalıyım. Ayrıca Cipher nesnesi DECRYPT_MODE içinde bir ortak anahtar alacak mı? Bu bana çok geri geliyor. – meleager

+0

Sun JRE'yi kullanıyor, ancak IBM sürümü kullanmıyor. Tesadüfen, Bouncy Castle kripto sağlayıcısını kullanan bir IBM JRE de çalışacaktır. –

+0

Teşekkürler, bir şans vereceğim. – meleager

2

java.security.spec.RSAPublicKeySpec kullanın. Üs ve modüllerden bir anahtar oluşturabilir. Daha sonra java.security.KeyFactory.generatePublic() anahtar parametresiyle parametre olarak kullanın.