2014-07-23 10 views
14

Ich habe die folgenden Fehler und ich habe ein wenig stecken: Exception in thread „main“java.security.InvalidKeyException: Illegale Schlüsselgröße oder Standardparameter in android

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) 

Ich bin fest, weil alle Antworten Ich habe über die Java Kryptografie-Erweiterung (JCE) gesprochen, die normalerweise in das Android-SDK enthalten sind. Also ich denke mein Problem ist nicht dieses.

Ich muss etwas vergessen haben, aber ich kann was nicht finden. Vielleicht ist mein Code falsch (es ist mein erster Ansatz der Kryptographie in Java, ich bin kein Experte, und der folgende Code ist meist ein paar Kopien-Pasten von Tutorials).

Ich benutze diesen Code Krypta und einen String zu entschlüsseln:

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; 
} 

Und den folgenden Schlüssel:

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

Danke Jungs.

+0

Lange Rede kurzer Sinn, egal ob es ein Teil von ADK ist, müssen Sie es ändern alle gleich in der $ java/jre/lib/security wie jede Java-Anwendung. –

Antwort

44

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

standardmäßig Java unterstützt nur 128-Bit-Verschlüsselung

128bits == == 16Byte 16 Chars.

So cryptKey darf nicht länger als 16 Zeichen sein.

Wenn Sie mehr als 16 Zeichen überschreiten möchten, müssen Sie install Java Cryptography Extension (JCE) Unlimited Strength.

Why 128bits?

+1

Können Sie auch den Grund erklären? – Blackbelt

+1

@blackbelt done – VenomVendor

+0

Okay, aber wie gesagt, JCE sollte in Android SDK enthalten sein:/... –

2

Standard JDK unterstützt Verschlüsselung nur durch 128-Bit-Schlüssel becuase der amerikanischen Einschränkungen. Um also die Verschlüsselung aus einem 256 Bit langen Schlüssel zu unterstützen, müssen wir local_policy.jar und US_export_policy.jars im Ordner $ JAVA_HOME/java-8-oracle/jre/lib/security ersetzen, andernfalls wird java.security.InvalidKeyException: Illegale Schlüsselgröße oder Standard

Beide Gläser und detaillierte Konzept aus dem Link werden verstehen können:

easybook4u.com

Danke, Sulabh Jain

0

Dies ist ein Code einzige Lösung. Keine Notwendigkeit, mit Konfigurationsdateien herunterzuladen oder zu verwirren.

Es ist eine Reflexion basierte Lösung auf Java-8 getestet

Rufen Sie diese Methode einmal, früh in Ihrem Programm oder während Anwendung gestartet wird.

// Importe

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

// Methode

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 
}