Illegale Blockgröße Ausnahme-Input-Länge muss ein Vielfaches von 16 beim entschlüsseln mit gepolsterten cipher
In meine Anwendung bin ich ver-und Entschlüsselung von Daten mithilfe von secretKey. Dafür bin ich mit dem AES-Algorithmus. Aber ich bin immer Ausnahme entschlüsseln, einen Wert von drei bereits verschlüsselten Werte mit Schlüssel.
Ausnahme:
Illegal Block Size Exception Input length must be multiple of 16 when decrypting with padded cipher.
Unten ist mein code:
Funktion encyrpt Wert
public static String symmetricEncrypt(String text, String secretKey) {
BASE64Decoder decoder = new BASE64Decoder();
byte[] raw;
String encryptedString;
SecretKeySpec skeySpec;
BASE64Encoder bASE64Encoder = new BASE64Encoder();
byte[] encryptText = text.getBytes();
Cipher cipher;
try {
raw = decoder.decodeBuffer(secretKey);
skeySpec = new SecretKeySpec(raw, "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
encryptedString = bASE64Encoder.encode(cipher.doFinal(encryptText));
}
catch (Exception e) {
e.printStackTrace();
return "Error";
}
return encryptedString;
}
Funktion zu entschlüsseln Wert
public static String symmetricDecrypt(String text, String secretKey) {
BASE64Decoder decoder = new BASE64Decoder();
BASE64Decoder base64Decoder = new BASE64Decoder();
Cipher cipher;
String encryptedString;
byte[] encryptText = null;
byte[] raw;
SecretKeySpec skeySpec;
try {
raw = decoder.decodeBuffer(secretKey);
skeySpec = new SecretKeySpec(raw, "AES");
encryptText = base64Decoder.decodeBuffer(text);
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
encryptedString = new String(cipher.doFinal(encryptText));
} catch (Exception e) {
e.printStackTrace();
return "Error";
}
return encryptedString;
}
Folgenden sind die Werte, die ich verschlüsseln und entschlüsseln von
String secretKey = "XMzDdG4D03CKm2IxIWQw7g==";
String value1= "ABCD";
String enctypedValue1= "3uweh4pzoVyH1uODQmVNJA==";
String enctypedValue2= "37PTC20w4DMZYjG3f+GWepSvAbEJUccMXwS/lXilLav1qM/PrCTdontw5/82OdC1zzyhDEsFVRGo rV6gXAQcm+Zai15hliiUQ8l8KRMtUl4=";
String value4= "20000";
/** Ecnryption and decryption of value1 **/
String encryptedValue1= symmetricEncrypt(value1, secretKey);
String decryptedValue1 = symmetricDecrypt(encryptedValue1, secretKey);
/** Decryption of enctypedValue1 **/
String decryptedValue2 = symmetricDecrypt(enctypedValue1, secretKey);
System.out.println(decryptedValue2);
/** Decryption of enctypedValue2 (Not decrypted)**/
String decryptedValue3 = symmetricDecrypt(enctypedValue2, secretKey);
System.out.println(decryptedValue3);
/** Ecnryption and decryption of value4 **/
String encryptedValue4= symmetricEncrypt(value4, secretKey);
String decryptedValue4 = symmetricDecrypt(encryptedValue4, secretKey);
In der test-Funktion, die ich geschrieben habe, die folgenden drei Testfällen.
- Einen neuen Wert (Wert1) verschlüsselt und entschlüsselt, mit einem geheimen Schlüssel.
- Beispiel zwei verschlüsselte Werte (enctypedValue1, enctypedValue2), die entschlüsselt werden unter Verwendung desselben geheimen Schlüssels. encryptedValue2, die ein problem beim entschlüsseln mit der gleichen geheimen Schlüssel.
- Einen neuen Wert (value4) verschlüsselt und entschlüsselt, mit einem geheimen Schlüssel.
Auf die Entschlüsselung encryptedValue2 ich bin immer folgende exception:
Illegal Block Size Exception Input length must be multiple of 16 when decrypting with padded cipher
Folgende ist, was ich abgeleitet haben, bis jetzt.
- Den problematischen Wert zu haben scheint ein problem beim Dekodieren, es gibt 81 Länge-array, die nicht entschlüsselt?
- Wenn dieses problem war zu geschehen, es hätte geschehen sollen, um alle Werte.
- Ist das ein Wert spezifisches problem oder ist es etwas im Zusammenhang mit Polsterung oder es kann ein anderes Verhalten auf unterschiedliche browser, unterschiedliche os?
in Ihrem decrypt-Methode, die Sie verwendet
Dieser link könnte hilfreich sein :stackoverflow.com/questions/7640463/...
danke für die Korrektur. Eigentlich ist es das schreiben Fehler. Bitte sehen Sie die bearbeitete Frage.
wird es erfordern,, um hinzufügen Polsterung in SecretKeySpec oder bei der Erzeugung der geheimen Schlüssel?
Es ist nicht notwendig von selbst. Jedoch in der realen Welt, block-cipher-algorithmen nicht unmittelbar allein für die übertragung der Daten. Sie sind in verschiedenen Modi wie CBC-Modus verwendet SSL. Hier ist eine gute Lektüre über Polsterung: en.wikipedia.org/wiki/Padding_%28cryptography%29 Auch, ich empfehle das Lesen über block cipher Verschlüsselungsverfahren (AES ist ein Blockchiffre-Algorithmus): en.wikipedia.org/wiki/Block_cipher
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
Jedoch in Ihrer encrypt-Methode, die Sie verwendet cipher = Cipher.getInstance("AES");
. Sie müssen die gleichen sein. Hinzufügen Polsterung an Chiffre verschlüsseln-Methode.Dieser link könnte hilfreich sein :stackoverflow.com/questions/7640463/...
danke für die Korrektur. Eigentlich ist es das schreiben Fehler. Bitte sehen Sie die bearbeitete Frage.
wird es erfordern,, um hinzufügen Polsterung in SecretKeySpec oder bei der Erzeugung der geheimen Schlüssel?
Es ist nicht notwendig von selbst. Jedoch in der realen Welt, block-cipher-algorithmen nicht unmittelbar allein für die übertragung der Daten. Sie sind in verschiedenen Modi wie CBC-Modus verwendet SSL. Hier ist eine gute Lektüre über Polsterung: en.wikipedia.org/wiki/Padding_%28cryptography%29 Auch, ich empfehle das Lesen über block cipher Verschlüsselungsverfahren (AES ist ein Blockchiffre-Algorithmus): en.wikipedia.org/wiki/Block_cipher
InformationsquelleAutor JankiPanwala | 2013-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
War ich in der Lage, um den code auszuführen, ohne jedes problem. Allerdings habe ich verwendet Apache Base64 zur Codierung/Decodierung...vielleicht ist Ihr Base64-bugs hat. Wenn du es selbst geschrieben hast, ist die Wahrscheinlichkeit groß, dass Sie verpasst einige Fälle. Für die eigentliche Produktion code, verwenden schwer geprüfte Bibliotheken wie Apache.
Finden Sie die Bibliothek, die ich verwendet Base64 hier: http://commons.apache.org/proper/commons-codec/download_codec.cgi
Hier ist der vollständige funktionierende code:
Ja, ich empfehle Apache. Versuchen Sie zu vermeiden, mit Sonne Bibliotheken an allen Kosten. Warum? weil Ihre Bibliotheken vorgenommen werden, werden intern verwendet, bei Sonne (nicht ausgesetzt, die als "public API"). So könnten Sie ändern die API brechen der Abwärtskompatibilität, und stoppen Sie die Unterstützung einer API jederzeit und ohne Vorherige Ankündigung. Zumindest das, was ich verstehe...
Dieser code ist in Ordnung, die von der main-Methode ,aber nicht, wenn ich schrieb, innerhalb der applet-Klasse .Geben Sie das invocation-target Ausnahme.Jede Hilfe???
Wie generieren Sie die geheimen Schlüssel?
InformationsquelleAutor Multithreader