- Chiffre.doFinal Ausgabe Größe
Ich mache AES-CBC-Entschlüsselung in java (javax.crypto . Ich verwende die folgenden Cipher-Klasse Methoden:
public final void init (int opmode, Key key, AlgorithmParameters params)
Methode für die Initialisierung,final int update(byte[] input, int inputOffset, int inputLen, byte[] output)
Methode für die Entschlüsselung der Daten,- und schließlich nenne ich die
final int doFinal(byte[] output, int outputOffset)
Methode zum beenden der Entschlüsselung.
Meine Anfrage ist: Kann ich davon ausgehen, dass die Größe der zurückgegebenen Daten zu mir durch die doFinal
nennen würde, immer weniger als oder gleich der AES-Block-Größe? Die Dokumentation beschreibt die doFinal-Methode als:
“Beendet eine multi-Teil-transformation
(die ver-oder Entschlüsselung). Prozesse
alle bytes, die gepuffert
im vorherigen update Aufrufe. Die Letzte
verwandelt bytes gespeichert sind, in die
output-buffer."
Aber nirgends sagt, dass die Ausgabe-Puffer enthalten würde höchstens einen block von Daten. Obwohl ich verstehe, dass dies ist das Allgemeine Verhalten von AES-APIs, und dies ist das Verhalten, meinen code ausgestellt hat, bis jetzt, aber würde diese Annahme halten?
- Nur um klar sein, ich brauche Sie zum aufrufen der update-Funktion, die mehrere Male wie ich immer bin, der die verschlüsselten Daten in Blöcken. Ich habe nicht die ganzen verschlüsselten Daten mit mir so ich kann nicht einen einzigen Anruf zu doFinal die Ausgabe in einem Schritt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Allgemeinen (wie im Rahmen der
Cipher
Klasse) ich glaube nicht, es wäre sicher davon ausgehen, dass dieses. Wie pro die javadocs für dasdoFinal
Methode:Also, wenn Sie die Zuordnung der Ausgangs-Puffer "in der Nähe" der Stelle, wo Sie rufen Sie die doFinal-Methode, dann würde es Sinn machen, rufen Sie
getOutputSize
und weisen eine entsprechend große Puffer. Job zu erledigen.Auf der anderen Seite, wenn Sie übergeben einen Puffer, von "weit Weg", die erstellt wurde, um genau zu sein, die Blockgröße, die Sie möglicherweise in mehr Schwierigkeiten. Es wäre vollkommen legal (zumindest nach der öffentlichen Schnittstelle der Java-Klasse) für eine Cipher Implementierung, um eine Ausgabe größer ist als die Blockgröße, so lange, wie die getOutputSize Methode liefert die passende Größe.
In der Tat, wenn Sie tun CBC-Entschlüsselung, nicht das verlangen, Sie zu übergeben in alle der Blöcke, um die
update
Methode? In dem Fall, sollten Sie sich die vollständige Klartext-Ausgabe wieder ausdoFinal
nicht nur einen einzigen block?getOutputSize(fixed input size)
für beideupdate
und 'doFinal`?update
sollte die Größe der Daten, die Sie aktualisieren die cipher - es muss die gleiche Größe wie die Anzahl von bytes, die in der Eingabe. Wenn das ist definitiv weniger als oder gleichgetOutputSize()
, dann werden Sie könnte Wiederverwendung der gleichen array. In der Praxis obwohl ich vermute, dies wäre mehr verwirrend als hilfreich.Generell ist es nicht sicher davon ausgehen, dass die Pufferung ist für einen block nur; und wenn Sie sich die details betrachtet, können Sie sehen, dass es hängt von der Art der Polsterung. Mit den üblichen "PKCS#5" - Polsterung, die mindestens ein byte und maximal n bytes (für Blöcke der Größe n) Hinzugefügt werden, so dass die Entschlüsselung system beschränken sich n bytes gepuffert werden. Einige andere Arten der Polsterung sind ein wenig komplizierter, z.B. CTS erfordert 2n bytes gepuffert werden. Die Java cryptographic layer scheint das nicht zu unterstützen, CTS, gerade jetzt, aber dies kann in einer zukünftigen version Hinzugefügt.
Cipher.getOutputSize(len)
geben Sie die maximale Ausgabegröße, dalen
zusätzliche Eingabe-bytes. Der zurückgegebene Wert kann etwas größer sein als das, was tatsächlich zurückgegeben, vor allem mit der Entschlüsselung, da es davon abhängt, was padding-bytes werden tatsächlich fanden bei der Entschlüsselung.Was sicher anzunehmen ist, dass die gesamte entschlüsselte Nachricht Länge ist nicht mehr als die gesamte verschlüsselte Nachricht Länge (symmetrische Verschlüsselung nicht mit Daten-Kompression). So pflegen Sie zwei Zähler, einer für die Eingangs Daten-bytes (die verschlüsselten Blöcke) und eine für die erhaltenen output-Daten Byte; die Differenz wird eine maximale Grenze für das, was kann man aus der
doFinal()
. Aber das ist, wasgetOutputSize()
ohnehin tut.