2010-12-01 18 views
5

मैं एन्क्रिप्शन और डिक्रिप्शन उछाल वाले महल के साथ एईएस एल्गोरिथ्म का उपयोग कर रही हूँजे 2 एमई एईएस डिक्रिप्शन त्रुटि (org.bouncycastle.crypto.InvalidCipherTextException: पैड ब्लॉक भ्रष्ट)

मेरे एन्क्रिप्शन और डिक्रिप्शन ठीक काम करता है, लेकिन यह मुझे त्रुटि जब मेरे सादे देता है पाठ का आकार बड़ा

है यहां तक ​​कि कभी कभी यह गैर decrypted डेटा

public static boolean setEncryptionKey(String keyText) 
{ 
    byte[] keyBytes = keyText.getBytes(); 

    key = new KeyParameter(keyBytes); 
    engine = new AESFastEngine(); 
    cipher = new PaddedBufferedBlockCipher(engine); 

    return true; 
} 

एन्क्रिप्शन दे रहा है:

public static String encryptString(String plainText) 
{ 

     byte[] plainArray = plainText.getBytes(); 

     cipher.init(true, key); 
     byte[] cipherBytes = new byte[cipher.getOutputSize(plainArray.length)]; 
     int cipherLength = cipher.processBytes(plainArray, 0, plainArray.length, cipherBytes, 0); 
     cipher.doFinal(cipherBytes, cipherLength); 
     String cipherString = new String(cipherBytes); 
     return cipherString; 
    } 

डिक्रिप्शन:

public static String decryptString(String encryptedText) 
{ 

     byte[] cipherBytes = encryptedText.getBytes(); 
     cipher.init(false, key); 
     byte[] decryptedBytes = new byte[cipher.getOutputSize(cipherBytes.length)]; 
     int decryptedLength = cipher.processBytes(cipherBytes, 0, cipherBytes.length, decryptedBytes, 0); 
     cipher.doFinal(decryptedBytes, decryptedLength); 
     String decryptedString = new String(decryptedBytes); 

     int index = decryptedString.indexOf("\u0000"); 
     if (index >= 0) 
     { 
      decryptedString = decryptedString.substring(0, index); 
     } 
     return decryptedString; 
    } 

यह डिक्रिप्शन दे रहा है मुझे निम्न त्रुटि

org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted 
     at org.bouncycastle.crypto.paddings.PKCS7Padding.padCount(+30) 
     at org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher.doFinal(+190) 
     at com.NewCrypto.decryptString(NewCrypto.java:103) 
     at com.New_Midlet.startApp(New_Midlet.java:23) 
     at javax.microedition.midlet.MIDletProxy.startApp(MIDletProxy.java:44) 
     at com.sun.midp.midlet.Scheduler.schedule(Scheduler.java:375) 
     at com.sun.midp.main.Main.runLocalClass(Main.java:477) 
     at com.sun.midp.main.Main.main(+80) 

क्या समस्या हो सकती है?

उत्तर

2

लाइन

String cipherString = new String(cipherBytes); 

एक बग है। cipherBytes मनमानी मानों वाला एक बाइट सरणी है और किसी भी जावा स्ट्रिंग डिकोडर्स का उपयोग करके स्ट्रिंग में परिवर्तित नहीं किया जा सकता है। आपको सिफर को बाइट सरणी के रूप में भेजना/सहेजना चाहिए। यदि आपको इसे एक स्ट्रिंग बनाना होगा तो आपको एक एन्कोडर का उपयोग करना होगा। बेस 64 एन्कोडर्स अक्सर बेस 16 (हेक्स) के रूप में उपयोग किए जाते हैं। आप Apache Commons Codec या मेरे पसंदीदा, Harder Base64 codec का उपयोग कर सकते हैं।

+0

कोई भी बेस 64 कोडर जो अभी भी वर्णों के बजाय बाइट्स आउटपुट करता है, मेरी राय में थोड़ा मूर्खतापूर्ण है। जब मैं किसी को यूटीएफ -16 एक्सएमएल फ़ाइल में स्ट्रीम करने की कोशिश करता हूं तो मैं पहले ही डरावनी देख सकता हूं। साथ ही, यह डिफ़ॉल्ट 64 की तुलना में बेस 64 के किसी अन्य रूप का समर्थन नहीं करता है। एमएमएम, शायद मुझे अपना एन्कोडर भी उपलब्ध कराया जाना चाहिए। –

+0

@owlstead: मैं सहमत हूं। हार्डर कोडेक तारों को आउटपुट करेगा और साथ ही बेवकूफ अपाचे कॉमन्स शैली का समर्थन करेगा। –

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