Java-Chiffre.doFinal() schreiben extra bytes
Ich bin mit der Implementierung von Verschlüsselung /Entschlüsselung unter Verwendung der Java Verschlüsselung und AES. Alles funktioniert gut, außer, dass es 5 zusätzliche bytes, die geschrieben auf den Aufruf von doFinal(). So, Ende ich mit einer richtig decodierten string mit 5 extra-bytes angehängt.
Ich glaube, der Grund ist, dass der gesamte block des 16-Byte geschrieben wird. Ich sehe 3 16-byte-Blöcke geschrieben, darunter das Letzte. Die Eingabe-verschlüsselte Datei beträgt 64 bytes. Der unverschlüsselte text 43 bytes.
In der Dokumentation für doFinal zeigt an, dass es zurückgeben kann, die Anzahl der geschriebenen bytes für den Ausgabepuffer. Es ist jedoch 0,16,16,16. Ich habe versucht, jede form von doFinal und Updates die keine änderung im Verhalten.
Macht es Art von Gefühl, dass es schriftlich aus, ein full-block, denn das ist, wie die meisten dieser algorithmen arbeiten. Allerdings, wenn es gar nicht geht, mir zu sagen, die Größe der output-Daten, wie soll ich verhindern, überschüssige Daten?
Sollte ich vielleicht mit einem anderen Algorithmus? AES256 ist eine Voraussetzung, aber ich Frage mich, wenn Sie einen anderen block geben oder padding geben der es erlauben würde, es zu schreiben die richtige Anzahl von bytes.
Führung?
Geschnippelt für (einige) Kürze:
decryptCipher = Cipher.getInstance("AES");
decryptCipher.init(Cipher.DECRYPT_MODE, aesKey);
Geschäftlichen Teil des Entschlüsselungs-routine.
long bytesToRead = inputFile.length();
while ((inLen = in.read(buffer)) > 0) {
int bytesOut = 0;
byte[] cryptBytes = null;
int outLen = cipher.getOutputSize(inLen);
cryptBytes = new byte[outLen];
if (bytesToRead <= buffer.length) {
try {
bytesOut = cipher.doFinal(buffer, 0, inLen, cryptBytes, 0);
} catch (ShortBufferException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
} else
try {
bytesOut = cipher.update(buffer, 0, inLen, cryptBytes, 0);
} catch (ShortBufferException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
out.write(cryptBytes, 0, bytesOut);
bytesToRead -= inLen;
}
try {
out.flush();
in.close();
out.close();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie eine Polsterung Mechanismus beim Aufruf Cipher.getInstance() - natürlich muss es der gleiche sein, an der sowohl die Verschlüsselung und Entschlüsselung Zeit. eg:
Ohne Polsterung-Mechanismus, der Entschlüsselungs-Seite hat keine Informationen, wo das Ende der Klartext ist (in den letzten block).
AES ist ein block cipher, natürlich es wird geben Sie ganze Blöcke, wie alle block-Chiffren.
Sehen die Wikipedia-Artikel zu AES für weitere Informationen.
Sagte Sie, Sie wollte es an die Ausgabe der "richtige Anzahl von bytes". Wie haben Sie sich entschieden, was ist die richtige Anzahl von bytes?