2012-07-16 15 views
10

मैं एन्क्रिप्शन के लिए लगभग नया हूं।डिक्रिप्टिंग त्रुटि: "कोई iv सेट जब कोई अपेक्षित"

मैं बाइट्स की एक सरणी डिक्रिप्ट करने के लिए कोशिश कर रहा हूँ, और जब मैं चतुर्थ प्रदान कर रहा हूँ मैं एक अपवाद हो रही है: InvalidAlgorithmParameterException (कोई iv सेट जब एक उम्मीद)।

यहाँ मेरी कोड है (iv 16 बाइट्स जो रिक्त नहीं है की एक सरणी है और जब एन्क्रिप्ट करने के लिए इस्तेमाल किया मान होते हैं):

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, encriptionKey,new IvParameterSpec(iv)); 

सिफर रहा चतुर्थ निर्दिष्ट नहीं करते हैं ठीक से प्रारंभ हो जाता है :

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, encriptionKey); 

एक जवाब मैं JCEStreamCipher (here) किस संस्करण का उपयोग कर रहा हूँ, लेकिन के अनुरूप नहीं हो सकता है के एक कार्यान्वयन मिला खोजने के लिए कोशिश कर रहा है कुछ कोड है कि मुझे बात मैं यह correc समझ नहीं कर रहा हूँ बनाता है tly।

if ((ivLength != 0) && !(param instanceof ParametersWithIV)) 
    { 
     SecureRandom ivRandom = random; 

     if (ivRandom == null) 
     { 
      ivRandom = new SecureRandom(); 
     } 

     if ((opmode == Cipher.ENCRYPT_MODE) || (opmode == Cipher.WRAP_MODE)) 
     { 
      byte[] iv = new byte[ivLength]; 

      ivRandom.nextBytes(iv); 
      param = new ParametersWithIV(param, iv); 
      ivParam = (ParametersWithIV)param; 
     } 
     else 
     { 
      throw new InvalidAlgorithmParameterException("no IV set when one expected"); 
     } 
    } 

ऐसा लगता है कि मैं एक चतुर्थ जब decrypting प्रदान नहीं कर सकते, लेकिन यह मेरे लिए बहुत ज्यादा समझ में आता है नहीं करता है:

कोड यह रहा।

किसी भी मदद की सराहना की जाएगी।

बहुत बहुत शुक्रिया, रिचर्ड।

+0

क्षमा करें, लेकिन मुझे आपकी समस्या वास्तव में समझ में नहीं आती है। हो सकता है कि आपको JCEStreamCipher के बजाय उस कोड को बेहतर ढंग से पोस्ट करना चाहिए (दो पंक्तियों से अधिक)। – Robert

+0

आप कहते हैं, "ऐसा लगता है कि मैं एक चौथाई प्रदान नहीं कर सकता जब डिक्रिप्टिंग" क्यों नहीं? सामान्य विधि IV को सिफरटेक्स्ट के सामने तक प्रीपेड करना और उन्हें एक साथ प्रसारित करना है। रिसीवर शेष संदेश को डिक्रिप्ट करने के लिए IV के रूप में पहले 16 बाइट्स का उपयोग करता है। – rossum

+0

इस तरह मैं इसे कर रहा हूं, लेकिन मुझे डीक्रीप्टर को IV प्रदान करते समय अपवाद मिला, जो मुझे परेशान कर रहा था। कुंजी बनाने के दौरान मुझे एक त्रुटि हुई (केवल उत्तर पोस्ट किया गया)। – richardtz

उत्तर

13

हल हो गया।

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

पहले मैं था:

KeySpec spec = new PBEKeySpec(password.toCharArray(), encryptionKeySalt, 12345,256); 
SecretKey encriptionKey = factory.generateSecret(spec); 

जो एक JCEPBEKey पैदा करता है।

मैं याद आ रही थी:

Key encriptionKey = new SecretKeySpec(encriptionKey.getEncoded(), "AES"); 

जो एईएस के लिए एक उचित कुंजी बनाता है।

+1

उत्कृष्ट। यह त्रुटि केवल 4.0.3 डिवाइस के पुराने संस्करण पर हो रही थी जो कार्यालय में थी, लेकिन दूसरों पर नहीं। अब यह प्लेटफॉर्म पर काम करता है। –

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