2012-11-20 11 views
5

मैं एईएस 256 सीबीसी उपयोग कर रहा हूँ पता चलता है। मेरे पास 32 बाइट्स IV है। लेकिन जब मैं इसे चलाता हूं तो यह एक अपवाद दिखाता है:32 बाइट्स के साथ एईएस 256 सीबीसी उपयोग करना चाहते हैं, लेकिन यह java.security.InvalidAlgorithmParameterException

Exception in thread "main" java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long 
    at com.abc.aes265cbc.AESUtil.decrypt(AESUtil.java:50) 
    at com.abc.aes265cbc.Security.main(Security.java:48) 
Caused by: java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long 
    at com.sun.crypto.provider.CipherCore.init(CipherCore.java:430) 
    at com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:217) 
    at javax.crypto.Cipher.implInit(Cipher.java:790) 
    at javax.crypto.Cipher.chooseProvider(Cipher.java:848) 
    at javax.crypto.Cipher.init(Cipher.java:1347) 
    at javax.crypto.Cipher.init(Cipher.java:1281) 
    at com.abc.aes265cbc.AESUtil.decrypt(AESUtil.java:47) 
    ... 1 more 

मुझे नहीं पता कि इसे कैसे हल किया जाए। मैंने खोज की लेकिन मुझे यह हल नहीं हो रहा है। मैं पहली बार सुरक्षा अवधारणाओं की कोशिश कर रहा हूं। एईएस 256 सीबीसी के लिए मेरे कोड है:

public static void setENCRYPTION_IV(String ENCRYPTION_IV) { 
     AESUtil.ENCRYPTION_IV = ENCRYPTION_IV; 
    } 

    public static void setENCRYPTION_KEY(String ENCRYPTION_KEY) { 
     AESUtil.ENCRYPTION_KEY = ENCRYPTION_KEY; 
    } 



    public static String encrypt(String src) { 
     try { 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      cipher.init(Cipher.ENCRYPT_MODE, makeKey(), makeIv()); 
      return Base64.encodeBytes(cipher.doFinal(src.getBytes())); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public static String decrypt(String src) { 
     String decrypted = ""; 
     try { 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      cipher.init(Cipher.DECRYPT_MODE, makeKey(), makeIv()); 
      decrypted = new String(cipher.doFinal(Base64.decode(src))); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     return decrypted; 
    } 

    static AlgorithmParameterSpec makeIv() { 
     try { 
      return new IvParameterSpec(ENCRYPTION_IV.getBytes("UTF-8")); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    static Key makeKey() { 
     try { 
      MessageDigest md = MessageDigest.getInstance("SHA-256"); 
      byte[] key = md.digest(ENCRYPTION_KEY.getBytes("UTF-8")); 
      return new SecretKeySpec(key, "AES"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

तुम मुझे कि बदलते क्या इस कोड में मैं चतुर्थ के 32 बाइट्स का उपयोग करने में सक्षम हो जाएगा द्वारा मदद कर सकते हैं। अग्रिम धन्यवाद

संपादित करें: मेरा मुख्य समारोह को यह कार्यों कॉल जो:

AESUtil.setENCRYPTION_KEY("96161d7958c29a943a6537901ff0e913efaad15bd5e7c566f047412179504ffb"); 

    AESUtil.setENCRYPTION_IV("d41361ed2399251f535e65f84a8f1c57"); 
    String decrypted = AESUtil.decrypt(new String(sw0SrUIKe0DmS7sRd9+XMgtYg+BUiAfiOsdMw/Lo2RA=)); // AES Decrypt 
+0

आप प्रदान कर सकते हैं एक [SSCCE] (http://sscce.org/) जो compilable और runnable बॉक्स से बाहर है और इस मुद्दे को पता चलता है? (एक मुख्य विधि जिसमें यह दर्शाता है कि आप किस क्रम में कॉल करते हैं) –

+0

32bytes (256bits) का उपयोग करने का कारण क्या है? मेरा अद्यतन उत्तर देखें - 'एईएस/सीबीसी/पीकेसीएस 5 पैडिंग', ब्लॉक लम्बाई = कुंजी लंबाई = IV लंबाई = 128 बिट (16 बाइट्स) के लिए। –

+0

मैंने अपनी चाबियाँ मान जोड़ दी हैं ... यह आपको अपवाद दिखाएगा जो मुझे मिला। – Vaibs

उत्तर

9

एईएस एल्गोरिथ्म, एक 128-बिट ब्लॉक आकार की है कि क्या आप कुंजी लंबाई 256, 192 या 128 है की परवाह किए बिना बिट्स।

एक सममित सिफर मोड एक चतुर्थ जरूरत होती है, चतुर्थ की लंबाई सिफर के ब्लॉक आकार के बराबर होना चाहिए। इसलिए, आपको हमेशा एईएस के साथ 128 बिट्स (16 बाइट्स) के चौथाई का उपयोग करना होगा।

वहाँ एईएस के साथ एक 32 बाइट चतुर्थ उपयोग करने के लिए कोई रास्ता नहीं है।

+1

डंकन, मैं मैं सिर्फ संकेत बनाए रखने के लिए है कि, ताकि सब पर एईएस 256 उपयोग करने के लिए, यह जरूरी है कि चाहते हैं मेरा उत्तर को नष्ट करने के बाद से तुम्हारा बहुत स्पष्ट है और सीधे आगे :) किसी भी आगामी पाठकों के लिए मतदान किया, [ अप्रतिबंधित नीति फ़ाइलों को स्थापित] (http://stackoverflow.com/questions/12897260/java-aes-256-decryption-translating-code-from-actionscript-3)। अन्यथा आपको 'java.security.InvalidKeyException: अवैध कुंजी आकार' भी कुंजी के लिए, न केवल चतुर्थ के लिए मिलता है। –

+1

@ एंड्रियास धन्यवाद, आप की बहुत दयालुता। अपनी गर्जन चोरी करने के लिए माफ़ी, लेकिन मैं यह सुनिश्चित करना चाहता था कि भविष्य के पाठकों के लिए एक संक्षिप्त उत्तर उपलब्ध था। अप्रतिबंधित फ़ाइलों के बारे में आपका बिंदु हमेशा याद रखना अच्छा होता है :-) –

+0

क्या आप इनके साथ मेरी मदद कर सकते हैं? :(http://stackoverflow.com/questions/34061675/convert-ios-encryption-to-android – MetaSnarf