2014-07-23 7 views
14

मैं निम्न त्रुटि हो गया और मैं एक छोटे से अटक गया है: सूत्र में अपवाद "मुख्य"java.security.InvalidKeyException: में अवैध कुंजी आकार या डिफ़ॉल्ट मापदंडों एंड्रॉयड

java.security.InvalidKeyException: Illegal key size or default parameters 
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1011) 
       at javax.crypto.Cipher.implInit(Cipher.java:786) 
       at javax.crypto.Cipher.chooseProvider(Cipher.java:849) 
       at javax.crypto.Cipher.init(Cipher.java:1213) 
       at javax.crypto.Cipher.init(Cipher.java:1153) 
       at net.nakou.indie.wtext.engineClass.Session.cryptString(Session.java:52) 

मैं अटक क्योंकि सभी कर रहा हूँ उत्तर मुझे जावा क्रिप्टोग्राफी एक्सटेंशन (जेसीई) के बारे में बात मिली है जो आमतौर पर एंड्रॉइड एसडीके में शामिल की जाती है। तो मुझे लगता है कि मेरी समस्या यह नहीं है।

मुझे कुछ भूल जाना चाहिए था, लेकिन मुझे क्या नहीं मिला। शायद मेरा कोड गलत है (यह जावा में क्रिप्टोग्राफी का मेरा पहला दृष्टिकोण है, मैं एक विशेषज्ञ नहीं हूं, और निम्न कोड ज्यादातर ट्यूटोरियल के कुछ प्रति-पेस्ट हैं)।

public String cryptString(String s) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, BadPaddingException, IllegalBlockSizeException { 
    byte[] KeyData = this.cryptKey.getBytes(); 
    SecretKeySpec KS = new SecretKeySpec(KeyData, "Blowfish"); 
    Cipher cipher = Cipher.getInstance("Blowfish"); 
    cipher.init(Cipher.ENCRYPT_MODE, KS); 
    String ret = new String(cipher.doFinal(s.getBytes("UTF-8"))); 
    return ret; 
} 

public String decryptString(byte[] s) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException { 
    byte[] KeyData = this.cryptKey.getBytes(); 
    SecretKeySpec KS = new SecretKeySpec(KeyData, "Blowfish"); 
    Cipher cipher = Cipher.getInstance("Blowfish"); 
    cipher.init(Cipher.DECRYPT_MODE, KS); 
    String ret = new String(cipher.doFinal(s)); 
    return ret; 
} 

और निम्नलिखित महत्वपूर्ण:

private String cryptKey = "[email protected]@FDFqf"; 

तुम लोगों को धन्यवाद

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

+0

लंबी कहानी संक्षेप में, कोई फर्क नहीं पड़ता अगर यह ADK का एक हिस्सा है, तो आप इसे बदलने की जरूरत है सब $ जावा/JRE में एक ही/lib/सुरक्षा किसी भी जावा एप्लिकेशन के रूप में। –

उत्तर

44

private String cryptKey = "[email protected]@FDFqf";

डिफ़ॉल्ट जावा तक केवल 128 बिट एन्क्रिप्शन

128bits == 16Bytes == 16 वर्ण का समर्थन करता है।

तो cryptKey 16 वर्णों से अधिक नहीं हो सकता है।

यदि आप 16 से अधिक वर्णों को पार करना चाहते हैं तो आपको install Java Cryptography Extension (JCE) Unlimited Strength पर जाना होगा।

Why 128bits?

+1

क्या आप कारण भी समझा सकते हैं? – Blackbelt

+1

@blackbelt – VenomVendor

+0

ठीक किया, लेकिन जैसा कि मैंने कहा है, JCE Android SDK में शामिल किया जाना चाहिए:/... –

2

डिफ़ॉल्ट JDK केवल अमेरिकी प्रतिबंध की वजह से 128 बिट कुंजी के माध्यम से एन्क्रिप्शन का समर्थन। तो 256 बिट लंबी कुंजी से एन्क्रिप्शन का समर्थन करने के लिए हमें $_AVA_HOME/java-8-oracle/jre/lib/security फ़ोल्डर में local_policy.jar और US_export_policy.jars को प्रतिस्थापित करना होगा अन्यथा यह java.security.InvalidKeyException: अवैध कुंजी आकार या

दोनों जार डिफ़ॉल्ट और विस्तृत अवधारणा लिंक से समझ में जा सकता है:

easybook4u.com

धन्यवाद, सुलभ जैन

0

यह एक कोड एकमात्र समाधान है। कॉन्फ़िगरेशन फ़ाइलों के साथ डाउनलोड या गड़बड़ करने की कोई ज़रूरत नहीं है।

यह एक प्रतिबिंब आधारित समाधान है, जावा 8

कॉल पर इस विधि एक बार परीक्षण किया है, अपने कार्यक्रम के शुरू में या आवेदन शुरू कर दिया जा रहा है, जबकि।

// आयात

import javax.crypto.Cipher; 
import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.Modifier; 
import java.util.Map; 

// विधि

public static void fixKeyLength() { 
    String errorString = "Failed manually overriding key-length permissions."; 
    int newMaxKeyLength; 
    try { 
     if ((newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES")) < 256) { 
      Class c = Class.forName("javax.crypto.CryptoAllPermissionCollection"); 
      Constructor con = c.getDeclaredConstructor(); 
      con.setAccessible(true); 
      Object allPermissionCollection = con.newInstance(); 
      Field f = c.getDeclaredField("all_allowed"); 
      f.setAccessible(true); 
      f.setBoolean(allPermissionCollection, true); 

      c = Class.forName("javax.crypto.CryptoPermissions"); 
      con = c.getDeclaredConstructor(); 
      con.setAccessible(true); 
      Object allPermissions = con.newInstance(); 
      f = c.getDeclaredField("perms"); 
      f.setAccessible(true); 
      ((Map) f.get(allPermissions)).put("*", allPermissionCollection); 

      c = Class.forName("javax.crypto.JceSecurityManager"); 
      f = c.getDeclaredField("defaultPolicy"); 
      f.setAccessible(true); 
      Field mf = Field.class.getDeclaredField("modifiers"); 
      mf.setAccessible(true); 
      mf.setInt(f, f.getModifiers() & ~Modifier.FINAL); 
      f.set(null, allPermissions); 

      newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES"); 
     } 
    } catch (Exception e) { 
     throw new RuntimeException(errorString, e); 
    } 
    if (newMaxKeyLength < 256) 
     throw new RuntimeException(errorString); // hack failed 
} 
संबंधित मुद्दे