Hallo Leute!
Ich bin gerade dabei, mir einen Passwortmanager zu bauen. Dazu erzeuge ich ein XML Document,
welches dann in einen String umgewandelt wird. Dieser String wird mit einem gehashten Passwort
verschlüsselt und dann (binär) in einer Datei abgelegt.
Soweit zur Theorie .
Das Problem ist: Wenn ich die Datei entschlüssele, sind manche der Blöcke fehlerhaft entschlüsselt,
andere aber nicht.
In das Praxis sieht das so aus:
XML Document als String:
converted document: <?xml version="1.0" encoding="UTF-8" standalone="no"?><Quatsch><account id="1"><Account>Typ</Account><Password>hardt</Password></account></Quatsch>
Verschlüsselter XML String (Auszug):
É0¦˜8ÒäPeó^ÌØæ:W*Ë8×¾?)k¿.)pŒÉn±R1N3™ØÚ2&Ëë/\Šßh†íÄX…J È$µÎ+%ÖJì .....
Entschlüsselter XML String:
<?xml version="1óÁ¥q«
:ø©xÓÄðP1F-8" standalone="no"?><Quatsch><account id="1"><Account>Typ</Account><Password>hardt</Password></account></Quatsch>
---
Da ich das ECB Chaining (vorerst) benutze, werden immer nur 16 Zeichen am Stück entschlüsselt.
Man erkennt hier, dass der zweite 16er Block falsch entschlüsselt wurde. Das treibt mich seit zwei
Tagen in den Wahnsinn...
Die Methoden sehen folgendermaßen aus:
Encryption + Save to File
Decryption
Ich habe auch schon so eine Vermutung. Ich glaube, dass bei der Kodierung der Zeichenfolgen
beim Speichern oder beim Lesen etwas schief läuft; also dass das Encoding aus der Datei nicht
mehr richtig gelesen wird und dadurch einzelne Zeichen falsch interpretiert werden. Das würde
erklären, warum nur manche Blöcke falsch entschlüsselt werden.
Ich habe auch schon mit dem BASE64 Encoder der Apache Codecs herumexperimentiert und
binäre Zeichenfolge in die Datei geschrieben. Das war aber mehr oder weniger Trial and Error
und hat zu keinem Ergebnis geführt. Ganz im Gegenteil sogar.
Hat jemand eine Idee?
Ich bin gerade dabei, mir einen Passwortmanager zu bauen. Dazu erzeuge ich ein XML Document,
welches dann in einen String umgewandelt wird. Dieser String wird mit einem gehashten Passwort
verschlüsselt und dann (binär) in einer Datei abgelegt.
Soweit zur Theorie .
Das Problem ist: Wenn ich die Datei entschlüssele, sind manche der Blöcke fehlerhaft entschlüsselt,
andere aber nicht.
In das Praxis sieht das so aus:
XML Document als String:
converted document: <?xml version="1.0" encoding="UTF-8" standalone="no"?><Quatsch><account id="1"><Account>Typ</Account><Password>hardt</Password></account></Quatsch>
Verschlüsselter XML String (Auszug):
É0¦˜8ÒäPeó^ÌØæ:W*Ë8×¾?)k¿.)pŒÉn±R1N3™ØÚ2&Ëë/\Šßh†íÄX…J È$µÎ+%ÖJì .....
Entschlüsselter XML String:
<?xml version="1óÁ¥q«
:ø©xÓÄðP1F-8" standalone="no"?><Quatsch><account id="1"><Account>Typ</Account><Password>hardt</Password></account></Quatsch>
---
Da ich das ECB Chaining (vorerst) benutze, werden immer nur 16 Zeichen am Stück entschlüsselt.
Man erkennt hier, dass der zweite 16er Block falsch entschlüsselt wurde. Das treibt mich seit zwei
Tagen in den Wahnsinn...
Die Methoden sehen folgendermaßen aus:
Encryption + Save to File
Code:
private static String encrypt(byte[] value, String key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, DecoderException, NoSuchProviderException {
byte[] keyByteArray = org.apache.commons.codec.binary.Hex.decodeHex(key.toCharArray());
SecretKeySpec skeySpec = new SecretKeySpec(keyByteArray, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
System.out.println(value.length);
String encrypted = new String(cipher.doFinal(value));
return encrypted;
}
public void writeToFile(String input) throws IOException, TransformerException {
eraseFile();
createFile();
System.out.println("about to write1: " + input + "\n");
FileOutputStream fos = new FileOutputStream(f);
byte[] codeToWrite = input.getBytes();
System.out.println("about to write len: " + codeToWrite.length + "\n");
fos.write(codeToWrite);
fos.close();
}
Decryption
Code:
public String getDecrypted() throws Exception {
String result = "";
byte[] encrypted = getEncryptedFromFile();
if (encrypted!=null) {
result = decrypt(encrypted, password);
}
return result;
}
private byte[] getEncryptedFromFile() throws IOException {
System.out.println("the username is: " +username);
byte[] result = fa.readFile();
System.out.println("read file lenght is: " + result.length + "\n");
return result;
}
public byte[] readFile() throws IOException {
FileInputStream fin = new FileInputStream(f);
byte fileContent[] = new byte[(int)f.length()];
fin.read(fileContent);
fin.close();
return fileContent;
}
private static String decrypt(byte[] value, String key) throws IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, DecoderException, NoSuchProviderException {
byte[] keyByteArray = org.apache.commons.codec.binary.Hex.decodeHex(key.toCharArray());
SecretKeySpec skeySpec = new SecretKeySpec(keyByteArray, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
System.out.println("Length to decrypt: " + value.length);
String originalMessage = new String(cipher.doFinal(value));
System.out.println("Decrypted 2: " + originalMessage );
return originalMessage;
}
Ich habe auch schon so eine Vermutung. Ich glaube, dass bei der Kodierung der Zeichenfolgen
beim Speichern oder beim Lesen etwas schief läuft; also dass das Encoding aus der Datei nicht
mehr richtig gelesen wird und dadurch einzelne Zeichen falsch interpretiert werden. Das würde
erklären, warum nur manche Blöcke falsch entschlüsselt werden.
Ich habe auch schon mit dem BASE64 Encoder der Apache Codecs herumexperimentiert und
binäre Zeichenfolge in die Datei geschrieben. Das war aber mehr oder weniger Trial and Error
und hat zu keinem Ergebnis geführt. Ganz im Gegenteil sogar.
Hat jemand eine Idee?
Zuletzt bearbeitet: