Die Simulation einer stream cipher (AES/CTR

Bin ich eine Anwendung schreiben, die server, und ich habe beschlossen, zu verwenden, AES128/CTR/NoPadding sichere verbindungen, da es als sicher genug, ohne zu erweitern, die bytes für die block-Grenze, und ich dachte, es ist eine gute Passform für TCP-was logisch ist, einen nahtlosen stream.

Das problem ist, dass Cipher.update() nicht wieder die verschlüsselte block, bis Sie eine volle 16-byte-block, denn die Klickrate ist im Grunde basierend auf einem block-Chiffre, obwohl die Simulation eine stream cipher. Ich sollte Lesen von Daten von einer tcp-socket und verarbeiten von Nachrichten, sobald Sie eintreffen, kann ich aber nicht abrufen der letzten block, weil es immer noch Aufbau und seine Größe ist kleiner als 16 bytes. Und ich kann nicht gerade warten, weil wir nicht wissen, Wann die nächste Meldung gesendet werden. Natürlich könnte ich anrufen Cipher.doFinal() auf, um die übrig gebliebenen aber das würde bedeuten, dass das Ende des Streams (Verbindung) und das Cipher-Objekt initialisiert werden.

Dachte ich, es wäre schön, wenn es einen Weg zu peek der Verschleppung. CTR einfach XORs der Klartext mit dem keystream so ich sollte in der Lage sein, die verschlüsselten Daten unabhängig von der rest der bytes in den block. Würde es einen schönen workaround zu diesem problem? Ich denke über das schreiben eines wrappers, der verschlüsselt fake Klartext mit Nullen, um die keystream im Voraus und XORs manuell, aber ich Frage mich, wie andere Menschen dieses problem gelöst.

Update

Ich bin die Entwicklung einer Android-Anwendung, und es stellte sich heraus, dass das problem von der Dalvik VM. Als Robert und monnand wies darauf hin, unten, Java SE nicht haben dieses problem, zumindest mit dem Standard-Anbieter. Ich denke, ich werde müssen schreiben eine wrapper-Klasse oder den Modus ändern, um CFB8, dieses problem zu umgehen. (CTR8 funktionierte nicht) vielen Dank für die Antworten!

  • Können Sie pad-Nachrichten, so dass Ihre Länge ein Vielfaches von 16 ist? Dies würde sicherstellen, dass Sie immer am Ende mit einem decryptable Stück.
  • Danke für die Anregung, das könnte ein möglicher workaround. Aber ich möchte vermeiden, dass, wenn möglich, weil es nicht vorzuziehen, in Bezug auf die Effizienz des Netzwerks, obwohl es sein könnte, zu vernachlässigen.
  • Sie können einfach rufen Sie diese auf ein array, bestehend aus Nullen zu erhalten, den keystream. Dann xor es manuell in Ihre Nachricht.
  • Java SE nicht haben dieses problem, da es nicht unterstützt AES128/CTR/NoPadding an alle, die mindestens mit der Standard-Anbieter. Ich habe einfach versucht, Java 7 Oracle (aber vielleicht ist meine installation vermengt und ich bin mit OpenJDK, alles ist möglich).
InformationsquelleAutor K J | 2013-04-30
Schreibe einen Kommentar