AES-Verschlüsselung Java-Ungültige Schlüssellänge
Ich versuche zu erstellen, die eine AES-Verschlüsselung Methode, aber für einige Grund, warum ich immer
java.security.InvalidKeyException: Key length not 128/192/256 bits
Hier ist der code:
public static SecretKey getSecretKey(char[] password, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException{
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
//NOTE: last argument is the key length, and it is 256
KeySpec spec = new PBEKeySpec(password, salt, 1024, 256);
SecretKey tmp = factory.generateSecret(spec);
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
return(secret);
}
public static byte[] encrypt(char[] password, byte[] salt, String text) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidParameterSpecException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException{
SecretKey secret = getSecretKey(password, salt);
Cipher cipher = Cipher.getInstance("AES");
//NOTE: This is where the Exception is being thrown
cipher.init(Cipher.ENCRYPT_MODE, secret);
byte[] ciphertext = cipher.doFinal(text.getBytes("UTF-8"));
return(ciphertext);
}
Kann jemand sehen, was ich falsch mache? Ich denke, dass es möglicherweise etwas zu tun mit der SecretKeyFactory-Algorithmus, aber das ist die einzige, die ich finden kann, der unterstützt am Ende system, das ich entwickle gegen. Jede Hilfe würde geschätzt werden. Danke.
- Können Sie bitte fügen Sie die Ausnahme?
- Es ist eine Antwort, die in einem früheren Beitrag auf diesen link. Hoffe, das hilft!
- so, es scheint, dass die java-Instanz nicht unterstützt, was ich brauche: 'java.Sicherheit.InvalidKeyException mit der Meldung "Illegal key size oder Standard-Parameter" '
- Auch ist es eine Einschränkung auf die Chiffre oder der SecretKey?
- Dies mag zwar theoretisch eine Antwort auf die Frage, vorzuziehen, umfassen die wesentlichen Teile der Antwort hier, und geben Sie den link zur Referenz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für eine stärkere key-Verschlüsselung müssen Sie download Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy-Dateien.
http://java.sun.com/javase/downloads/index.jsp (Siehe Andere Downloads).
Das problem ist hier das Missverhältnis zwischen den wichtigsten Größen für Ihren Schlüssel Ableitung Funktion und die gegebenen Ziffern. Der PBKDF, die Sie verwenden ist
"PBEWithMD5AndDES"
und in diesem string dieDES
Teil gibt die Art der Ausgabe. Als einzige DES, wie es bekannt ist, verwendet nur 8-byte-Schlüssel (64-bit -, 56 effektive bit-grösse mit parity-bits). AES-Schlüssel sollte entweder 128, 192 und 256 bit und sollte nicht include parity bits.Erstellen AES Stärke Schlüsselgrößen sollten Sie mindestens verwenden PBKDF2 statt PBKDF1, vorzugsweise mit SHA-256 oder SHA-512, der für höhere Schlüssellängen. Für 128-bit-Schlüssel sollten Sie jedoch gut mit SHA-1. So verwenden Sie die build-in
"PBKDF2WithHmacSHA1"
SecretKeyFactory
statt. Beachten Sie, dass PBKDF2 /SHA1 mit Schlüssel über 160-bit-Ergebnis wird in einem suboptimalen Betrieb. Sie möchten möglicherweise verwenden Sie einen einfachen key-based key derivation function (KBKDF) über den Ausgang, wenn Sie möchten, erstellen Sie mehr Daten (wie z.B. eine separate IV).Wie andere schon angedeutet haben, wenn Sie mit Hilfe der Tasten von über 128 bit müssen Sie die unlimited crypto-Gerichtsstand-Dateien.
Hinweise auf den folgenden code:
Können Sie installieren Sie die JCE Unlimited Strength Gläser, wie vorgeschlagen, auf einige andere ähnliche Fragen, oder einfach nur versuchen, einschließlich dieser code in deiner main-Funktion oder Treiber.
mit keine Polsterung, die Mechanismen zu füllen die leeren bits
Wenn ich den folgenden code und führen Sie es, ich don ' T erhalten, Ausnahmen:
Ich war nie in der Lage, neu zu erstellen die Ausnahme, die Sie hatte. Ich bin mit J2SE 1.6 und Entwicklung auf Basis von Eclipse.
Könnte es sein, dass Sie Ihr Passwort nicht 16 Byte lang?
GeneralSecurityException
und in der Regel Sie entweder werfen Sie es in Ihrer Methode oder erstellen Sie eine Laufzeit-exception (z.B. einIllegalStateException
wenn der Algorithmus nicht gefunden werden kann) heraus.