2011-05-20 25 views
26

के बीच अंतर मैं एंड्रॉइड पर उपयोगकर्ता नाम और पासवर्ड एन्क्रिप्ट करने के लिए आरएसए का उपयोग कर रहा हूं और उन्हें सर्वर (टॉमकैट 6, जावा 1.6) पर डिक्रिप्ट कर रहा हूं। एंड्रॉयड एन्क्रिप्शन:आरएसए एन्क्रिप्शन: जावा और एंड्रॉइड

PublicKey pubKey = readPublicKeyFromFile(mod, ex); 
    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.ENCRYPT_MODE, pubKey); 
    byte[] cipherData = cipher.doFinal(data); 
    return cipherData; 

जावा बिलाव डिक्रिप्शन:

PrivateKey pubKey = readPrivateKeyFromFile(mod, ex); 
    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.DECRYPT_MODE, pubKey); 
    byte[] cipherData = cipher.doFinal(data); 
    return cipherData; 

अगर मैं एंड्रॉयड हिस्सा बाहर एंड्रॉयड (बस एक मुख्य विधि में) का उपयोग यह ठीक काम करता है। लेकिन मेरे एंड्रॉइड (एम्यूलेटर) के अंदर नहीं। डी सर्वर साइड पर मैं निम्नलिखित त्रुटि मिलती है:

javax.crypto.BadPaddingException: Blocktype mismatch: 0 
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:311) 
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255) 
    at com.sun.crypto.provider.RSACipher.a(DashoA13*..) 
    at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..) 
    at javax.crypto.Cipher.doFinal(DashoA13*..) 

मैं BigIntegers स्थिरांक के रूप में आधुनिक और पूर्व रखें ताकि मैं उन्हें एक फाइल करने के लिए में नहीं लिखते। मुझे पता है कि जावा 1.6 और जावा 1.5 एन्क्रिप्शन के बीच अंतर है, इसलिए दोनों जावा 1.6 के साथ संकलित हैं।

कुछ डिबग जानकारी:

एंड्रॉयड में डिबग के दौरान मैं देख सकता हूँ कि pubKey हेक्साडेसिमल में मापांक और प्रतिपादक शामिल हैं। और यदि मैं एक मुख्य विधि (फिर एक ही कोड) में डीबग करता हूं तो मैं देख सकता हूं कि पबके में दशमलव में मॉड्यूलस और एक्सपोनेंट होता है।

मैं क्या गलत कर रहा हूं?

धन्यवाद

+1

संभावित डुप्लिकेट: http: // stackoverflow।कॉम/प्रश्न/4926126/आरएसए-एन्क्रिप्शन-इन-जावा-क्रॉस-प्लेटफ़ॉर्म-मुद्दे –

+0

क्या आप वाकई आपको निजी कुंजी 'पबकी' कहते हैं? क्या यह वाकई कोड है या सिर्फ स्मृति से प्रश्न में टाइप किया है? –

+0

** चेतावनी ** नए प्रोटोकॉल के लिए, कोशिश करें और इसके बजाय ओएईपी पैडिंग का उपयोग करें। पीकेसीएस # 1 पैडिंग ऑरैकल हमलों के लिए कमजोर है। –

उत्तर

1

सबसे पहले, यह लग रहा है कि आप सार्वजनिक कुंजी के साथ दोनों सिफर आरंभ कर रहे हैं। एन्क्रिप्शन सार्वजनिक कुंजी का उपयोग करता है, डिक्रिप्शन निजी कुंजी का इस्तेमाल किया जाता है। मुझे उम्मीद है कि यह सिर्फ एक टाइपो है।

मुझे आरएसए एन्क्रिप्शन के साथ भी बहुत परेशानी थी, बहुत परीक्षण और त्रुटि थी। मेरा सुझाव है कि आप एक और प्रदाता की कोशिश करें। मैं BouncyCastle का उपयोग कर आरएसए लागू करने में कामयाब रहे।

Cipher wrapper = Cipher.getInstance("RSA", "BC"); 
wrapper.init(Cipher.ENCRYPT_MODE, publicKey); 
encryptedData= wrapper.doFinal(unencryptedData); 

हालांकि, मैं अपने ही कुंजीयुग्म उत्पन्न के बाद से यह एक सत्र एन्क्रिप्शन था।

kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(1024); 
     KeyPair kp = kpg.genKeyPair(); 
     publicKey = kp.getPublic(); 
     privateKey = kp.getPrivate(); 
+0

+1 क्योंकि परीक्षण और त्रुटि के घंटों के बाद मुझे यह पोस्ट मिला और यह मेरी समस्या हल हो गई। आपने आज मेरे गधे को बचाया, धन्यवाद: डी –

+0

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

10

मैं सुझाव है कि आप विशिष्ट सिफर आरंभीकरण का उपयोग करें: एक उदाहरण के रूप,

Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding"); 

दोनों पर काम करेंगे। आप जो अपवाद प्राप्त कर रहे हैं (BadPaddingException) ऐसा इसलिए हो रहा है क्योंकि डिफ़ॉल्ट सिफर प्रारंभिक पैडिंग डेस्कटॉप JVM और Android JVM के बीच भिन्न प्रतीत होता है।

41

मैं एंड्रॉइड 2.2+ में आरएसए एन्क्रिप्ट कर रहा हूं और टॉमकैट 6 जावा 1.6 सर्वर पर डिक्रिप्ट कर रहा हूं।

मुझे यह सही समस्या मिल रही थी, जगह पर पढ़ना और कुछ हद तक धन्यवाद @ फेमी के जवाब के लिए धन्यवाद जो मुझे चाहिए था।

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 

यह दोनों Android और ब्लैकबेरी स्मार्टफोन्स से एन्क्रिप्शन कर काम करता है:

समाधान सिफर के लिए folowing एल्गोरिथ्म विनिर्देश इस्तेमाल किया गया। मुझे पता है कि प्रश्न पूछने के चार महीने बाद, लेकिन अगर किसी और को इस समस्या से गुजरना पड़ता है।

+4

पुष्टि करने के लिए, यह समाधान अभी भी एंड्रॉइड 4.x और जावा 8 में काम करता है। असल में, यदि आप Cipher.getInstance ("RSA") करते हैं तो यह काम नहीं करेगा, आपको अधिक विशिष्ट निर्दिष्ट करने की आवश्यकता है। – sam

+0

यह जेएस में एन्क्रिप्टेड डेटा को डिक्रिप्ट करते समय भी काम करता है। मेरे मामले में "/ ईसीबी/पीकेसीएस 1 पैडिंग" के बिना Cipher.getInstance ("RSA") का उपयोग करके आवश्यक डेटा से पहले कुछ अतिरिक्त वर्ण जोड़ रहे थे। – DH28

+0

धन्यवाद। मुझे बचाया – Mohit

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