2011-04-03 25 views
12

xml biçimindeki .Net sisteminden özel ve ortak anahtarlara sahibim. Java'da şifreleme/şifre çözme yapmak için bu tuşları kullanmalıyım. Bunu yapmanın bir yolu var mı?Port .Net RSA xml anahtarları Java'ya

<RSAKeyValue> 
    <Modulus>jHIxcGzzpByFv...pvhxFnP0ssmlBfMALis</Modulus> 
    <Exponent>AQAB</Exponent> 
</RSAKeyValue> 

Özel anahtar:

Genel anahtar şuna benzer

Ben verileri şifrelemek için kod biraz yazdım ama onun doğru olup olmadığından emin değilim
<RSAKeyValue> 
    <Modulus>4hjg1ibWXHIlH...ssmlBfMAListzrgk=</Modulus> 
    <Exponent>AQAB</Exponent> 
    <P>8QZCtrmJcr9uW7VRex+diH...jLHV5StmuBs1+vZZAQ==</P> 
    <Q>8CUvJTv...yeDszMWNCQ==</Q> 
    <DP>elh2Nv...cygE3657AQ==</DP> 
    <DQ>MBUh5XC...+PfiMfX0EQ==</DQ> 
    <InverseQ>oxvsj4WCbQ....LyjggXg==</InverseQ> 
    <D>KrhmqzAVasx...uxQ5VGZmZ6yOAE=</D> 
</RSAKeyValue> 

.

 Element modulusElem = root.getChild("Modulus"); 
     Element exponentElem = root.getChild("Exponent"); 

     byte[] expBytes = decoder.decodeBuffer(exponentElem.getText().trim()); 
     byte[] modBytes = decoder.decodeBuffer(modulusElem.getText().trim()); 

     RSAPublicKeySpec keySpec = new RSAPublicKeySpec(new BigInteger(1, modBytes), new BigInteger(1, expBytes)); 
     KeyFactory fact = KeyFactory.getInstance("RSA"); 
     PublicKey pubKey = fact.generatePublic(keySpec); 

Verilerin şifresini çözmek için xml'den nasıl özel bir anahtar yapabilirim?

+0

eklenir? Çok benzer bir problemde sıkışıp kaldım ve bu konuda net bir şey bulamıyorum. – c0d3Junk13

+0

xml ayrıştırmada ne kullandınız? – ecem

+0

Tamam, ben JDOM olduğunu düşünüyorum, ben onları aramadan önce bir şey sormamalıyım. – ecem

cevap

23

Örnekte decoder bu, Base64 kod çözme işlemini yapıyor mu? sun.misc.BASE64Decoder belgesine güveniyor olabilirsiniz ve genellikle bu iç sınıflara bağlı olmak iyi bir fikir değildir (örneğin diğer JVM'ler buna sahip olmayacaktır). Kodlamak için Base64 sınıfına sahip Apache Commons Codec'u kullanabilirsiniz. Burada ne gerek kalanı RSA şifreleme ve şifre çözme için olsa var:

byte[] expBytes = Base64.decodeBase64(exponentElem.getText().trim())); 
byte[] modBytes = Base64.decodeBase64(modulusElem.getText().trim()); 
byte[] dBytes = Base64.decodeBase64(dElem.getText().trim()); 

BigInteger modules = new BigInteger(1, modBytes); 
BigInteger exponent = new BigInteger(1, expBytes); 
BigInteger d = new BigInteger(1, dBytes); 

KeyFactory factory = KeyFactory.getInstance("RSA"); 
Cipher cipher = Cipher.getInstance("RSA"); 
String input = "test"; 

RSAPublicKeySpec pubSpec = new RSAPublicKeySpec(modules, exponent); 
PublicKey pubKey = factory.generatePublic(pubSpec); 
cipher.init(Cipher.ENCRYPT_MODE, pubKey); 
byte[] encrypted = cipher.doFinal(input.getBytes("UTF-8")); 
System.out.println("encrypted: " + new String(encrypted)); 

RSAPrivateKeySpec privSpec = new RSAPrivateKeySpec(modules, d); 
PrivateKey privKey = factory.generatePrivate(privSpec); 
cipher.init(Cipher.DECRYPT_MODE, privKey); 
byte[] decrypted = cipher.doFinal(encrypted); 
System.out.println("decrypted: " + new String(decrypted)); 
+0

Teşekkürler. İyi çalıştı. Private Key Xml'de neden diğer öğeleri kullanmadığımızı merak ettiniz mi? (P, Q, DP, DQ vb.) – dvl

+1

Sorun değil. Bu diğer öğeler, anahtar üretimi için kullanılan orijinal primerler (p ve q) ve önceden hesaplanmış bazı değerlerdir. Daha hızlı bir şekilde (Çin Kalan Teoremi kullanarak) şifre çözme yapmak için kullanılabilirler. Bunu, tüm öğeleri alan bir 'RSAPrivateCrtKeySpec 'oluşturarak Java'da kullanabilirsiniz. – WhiteFang34

+1

Hey, sadece hızlı bir soru, bu genel/özel anahtar xml dosyasını ayrıştırmak için ne kullanmalıyım? Kullanması çok kolay bir şey istiyorum ve sanki xml parsers denizinde boğuldum gibi hissediyorum. – ecem

0

deneyin

RSAPrivateKeySpec privSpec = new RSAPrivateCrtKeySpec(iModulus,iExponentBytes,iDBytes,iPBytes,iQBytes,iDPBytes,iDQBytes,iInverseQBytes) 

kullanmak ve ayrıca çalışma örneği paylaşmak mi lütfen tüm özel anahtar bileşeni