Polsterung Ausnahme: Given final block nicht richtig gepolstert
Ich versuche zu ver-und entschlüsseln von meiner Datei in der alle meine Passwörter gespeichert sind, unter Verwendung von AES.
Der Algorithmus funktioniert gut auf die Verschlüsselung Teil. Aber während der Entschlüsselung, es wirft den Fehler
Message:Given final block not properly padded
javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
at javax.crypto.Cipher.doFinal(Cipher.java:2121)
at SearchDoc.dec_file(SearchDoc.java:327)
at SearchDoc.access$100(SearchDoc.java:52)
at SearchDoc$2$1.actionPerformed(SearchDoc.java:227)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Was ist hier das problem?
code:
//Starting decryption
try{
byte[] key = c_key.getBytes("ISO-8859-1");
key = Arrays.copyOf(key, 16); //use only first 128 bit
//System.out.println(Arrays.toString(key));
SecretKeySpec SecKey = new SecretKeySpec(key, "AES");
Cipher AesCipher = Cipher.getInstance("AES");
AesCipher.init(Cipher.DECRYPT_MODE, SecKey);
BufferedReader breader = new BufferedReader(new FileReader("download/enc_"+file));
String line;
boolean bool = false;
File f = new File(file);
bool = f.createNewFile();
if(bool==false){
f.delete();
bool = f.createNewFile();
}
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(file, true)));
while ((line = breader.readLine()) != null){
byte[] cipher=null;
byte[] plain=null;
cipher=line.getBytes("ISO-8859-1");
plain=AesCipher.doFinal(cipher);
out.println(new String(plain,"ISO-8859-1"));
}
out.close();
return 1;
}
catch(Exception dcf){
System.out.println("Message:"+dcf.getMessage());
dcf.printStackTrace();
return 0;
}
NEUEN AES-CODE:
import java.security.*;
import javax.crypto.spec.SecretKeySpec;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.*;
import sun.misc.*;
public class AESencrp {
private static final String ALGO = "AES";
private static final byte[] keyValue =
new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };
public static String encrypt(String Data) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes());
String encryptedValue = new BASE64Encoder().encode(encVal);
return encryptedValue;
}
public static String decrypt(String encryptedData) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance(ALGO);
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
String decryptedValue = new String(decValue);
return decryptedValue;
}
private static Key generateKey() throws Exception {
Key key = new SecretKeySpec(keyValue, ALGO);
return key;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfach mit
AES
als Chiffre Instanz nicht erklären, wie der Letzte block aufgefüllt. Dies ist der Grund, warum die Verschlüsselung und Entschlüsselung unterscheiden.Verwenden Sie eine der folgenden, konkreten Chiffre-Instanzen statt (je nach Verschlüsselung-Modus):
Finden Sie eine Liste der unterstützten Chiffren hier
Input length must be multiple of 16 when decrypting with padded cipher
decrypt(encrypt("secrect") + "bar)"
). Hinweis:: Der code, den Sie geschrieben verwendetAES/ECB/PKCS5Padding
(Java-Standard), die nur benutzt werden sollte, wenn die Verschlüsselung eines einzigen Blocks. Siehe: stackoverflow.com/questions/1220751/...`Vorausgesetzt, Sie verschlüsselt, der ursprüngliche Klartext linewise, werden Sie nicht in der Lage sein, es zu entschlüsseln linewise. Chiffretext enthalten kann alle byte-Wert, auch diejenigen, die für
\n
. Also, wenn Sie verschlüsselt jeden Klartext-Zeile in einem separaten Aufruf, Sie erhalten manchmal eine ciphertext "Linie", die ein byte, das entspricht\n
. Wenn Sie wollen nun entschlüsseln, es ist nicht möglich, da die Grenzen zwischen diesen Cipher-Aufrufe sind unterschiedlich.Dieses Problem zu beheben, müssen Sie entweder verschlüsseln des gesamten Dokuments in einem Aufruf (Verwendung
CipherInputStream
/CipherOutputStream
wenn Sie Speicher betrifft) oder verschlüsseln Sie jede Zeile separat, aber sicherstellen, dass Sie wissen, die Grenzen in den ciphertext.Letztere Ansatz kann zum Beispiel geschehen, indem die Codierung wird jede Teillieferung durchführen, so dass
\n
ist nicht in ihm gegenwärtig. Können Sie zum Beispiel codieren Sie es als Base-64, aber das wird blowup Ihre ciphertext von ~33%.Ich würde empfehlen, dass Sie die ehemalige Ansatz mit einem einzigen Aufruf.
Wie flo bereits erwähnt, ist es immer am besten, um voll qualifizierte Chiffre strings, weil Sie auf unterschiedlichen Java-Versionen verwenden möglicherweise unterschiedliche Standardeinstellungen für den Modus der Betrieb oder die Polsterung und Sie können am Ende mit nicht behebbaren durchführen.