2011-04-03 19 views
12

मेरे पास xml प्रारूप में नेट सिस्टम से निजी और सार्वजनिक कुंजी हैं। जावा में एन्क्रिप्शन/डिक्रिप्शन करने के लिए मुझे इन चाबियों का उपयोग करना होगा। इसे करने का कोई तरीका है?पोर्टिंग .NET आरएसए एक्सएमएल कुंजी जावा

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

निजी कुंजी:

सार्वजनिक कुंजी कुछ इस तरह दिखता

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

मैं डेटा को डिक्रिप्ट करने के लिए एक्सएमएल से निजी कुंजी कैसे बना सकता हूं?

+0

आप भी अपने काम के नमूने का हिस्सा कृपया कर सकते जोड़ने के लिए? मैं एक बहुत ही समान समस्या पर फंस गया हूं और इसके बारे में नेट पर ज्यादा नहीं पा रहा हूं। – c0d3Junk13

+0

आपने एक्सएमएल पार्सिंग के लिए क्या उपयोग किया? – ecem

+0

ठीक है, मुझे लगता है कि यह जेडॉम है, मुझे उनसे गुगल करने से पहले चीजें नहीं पूछनी चाहिए। – ecem

उत्तर

23

क्या decoder आपके उदाहरण में बेस 64 डिकोडिंग कर रहा है? ऐसा लगता है कि आप sun.misc.BASE64Decoder पर भरोसा कर सकते हैं और आम तौर पर उन आंतरिक वर्गों पर निर्भर रहने का अच्छा विचार नहीं है (अन्य जेवीएम के पास उदाहरण के लिए नहीं होगा)। आप Apache Commons Codec का उपयोग कर सकते हैं जिसमें बेस 64 क्लास को डीकोड करने के लिए है। यहाँ RSA एन्क्रिप्शन और डिक्रिप्शन के लिए आपको क्या चाहिए के बाकी हालांकि:

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

धन्यवाद। यह अच्छी तरह से काम किया। इस बारे में थोड़ा उत्सुक है कि हमने निजी कुंजी एक्सएमएल में किसी अन्य तत्व का उपयोग क्यों नहीं किया? (पी, क्यू, डीपी, डीक्यू इत्यादि) – dvl

+1

कोई समस्या नहीं। वे अन्य तत्व मूल प्राइम (पी और क्यू) हैं जो मुख्य पीढ़ी के साथ-साथ कुछ प्रीकंप्यूटेड मानों के लिए भी उपयोग किए जाते हैं। इन्हें वैकल्पिक तरीके से डिक्रिप्शन करने के लिए उपयोग किया जा सकता है (चीनी रेमेन्डर प्रमेय का उपयोग करके) जो तेज़ है। आप वास्तव में जावा में इसका उपयोग 'RSAPrivateCrtKeySpec' बनाकर कर सकते हैं जो सभी तत्वों को लेता है। – WhiteFang34

+1

हे, बस एक त्वरित सवाल, इस सार्वजनिक/निजी कुंजी एक्सएमएल फ़ाइल को पार्स करने के लिए मुझे क्या उपयोग करना चाहिए? मैं कुछ उपयोग करना चाहता हूं, और मुझे लगता है कि मैं एक्सएमएल पार्सर्स के समुद्र में डूब गया हूं। – ecem

0

कोशिश

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

का उपयोग करें और सभी निजी प्रमुख घटक

संबंधित मुद्दे