2010-04-22 17 views
6

नेट में मैं निम्नलिखित सार्वजनिक कुंजी फ़ाइल जेनरेट किया है:मेरा जावा आरएसए एन्क्रिप्शन मुझे अंकगणित अपवाद क्यों देता है?

<RSAKeyValue> 
    <Modulus>xTSiS4+I/x9awUXcF66Ffw7tracsQfGCn6g6k/hGkLquHYMFTCYk4mOB5NwLwqczwvl8HkQfDShGcvrm47XHKUzA8iadWdA5n4toBECzRxiCWCHm1KEg59LUD3fxTG5ogGiNxDj9wSguCIzFdUxBYq5ot2J4iLgGu0qShml5vwk=</Modulus> 
    <Exponent>AQAB</Exponent> 
</RSAKeyValue> 

नेट यह सामान्य तरीके का उपयोग एन्क्रिप्ट करने के लिए खुश है।

मैं जावा में एक स्ट्रिंग को एन्कोड करने के लिए इस कुंजी का उपयोग करने का प्रयास कर रहा हूं। जब मैं स्ट्रिंग को एन्क्रिप्ट करने का प्रयास करता हूं तो मैं अंकगणितीय अपवाद में भाग रहा हूं।

byte[] modulusBytes = Base64.decode(this.getString(R.string.public_key_modulus)); 
byte[] exponentBytes = Base64.decode(this.getString(R.string.public_key_exponent)); 
BigInteger modulus = new BigInteger(modulusBytes);     
BigInteger exponent = new BigInteger(exponentBytes); 

RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, exponent); 
KeyFactory fact = KeyFactory.getInstance("RSA"); 
PublicKey pubKey = fact.generatePublic(rsaPubKey); 

Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

byte[] cipherData = cipher.doFinal(new String("big kitty dancing").getBytes());  

यह कोड ब्लॉक कि विफल रहता है में अंतिम पंक्ति है:

निम्नलिखित कोड मैं एन्क्रिप्ट करने के लिए उपयोग कर रहा हूँ है।

मैंने कई उदाहरण देखे हैं और यह सबसे अच्छा है जिसके साथ मैं आ सकता हूं। यदि यह स्पष्ट नहीं है, तो R.string.public_key_modulus मॉड्यूलस तत्व में पाठ की एक प्रति/पेस्ट है, जो एक्सपोनेंट के लिए लागू होता है।

क्या मैं गलत क्या किया?

उत्तर

10

इस प्रयास करें:

BigInteger modulus = new BigInteger(1, modulusBytes); 
BigInteger exponent = new BigInteger(1, exponentBytes); 

नहीं तो आप एक नकारात्मक मापांक के साथ खत्म। BigInteger(byte[]) कन्स्ट्रक्टर पर हस्ताक्षर किए गए बड़े-एंडियन प्रतिनिधित्व पर हस्ताक्षर किए। BigInteger(int, byte[]) कन्स्ट्रक्टर प्रदान किए गए साइन बिट का उपयोग करता है (यहां "सकारात्मक" के लिए "1")।

इसके अलावा, String.getBytes() से सावधान रहें, यह प्लेटफ़ॉर्म "डिफ़ॉल्ट वर्णसेट" का उपयोग करता है जो उस मशीन की कॉन्फ़िगरेशन पर निर्भर करता है जिस पर एप्लिकेशन चलता है। यदि आप पुनरुत्पादित परिणाम चाहते हैं तो एक स्पष्ट वर्णमाला (उदा। "UTF-8") निर्दिष्ट करना बेहतर है।

+0

हाँ, जिसने इसे अच्छी तरह हल किया, त्वरित प्रतिक्रिया के लिए धन्यवाद! – badMonkey

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