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).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gerade getestet AES im CTR-Modus mit Oracle-Java 1.7 und ich kann nicht überprüfen Sie Ihre Beobachtungen:
Möglicherweise werden Sie Verwendung in einem Mangel Dritte Implementierung, da die "AES128/CTR/NoPadding" ist nicht eine bekannte Chiffre, die auf meinem system.
Ich hatte genau das gleiche problem heute und habe es behoben, nur jetzt.
Das problem ist dein provider, das ist wahrscheinlich Hüpfburg. Wenn Sie anrufen
getInstance()
, geben Sie einfach den Namen Ihres Algorithmus (in meinem Fall ist "AES/CTR/NoPadding"). NICHT geben Sie die provider.Lassen Sie den code erklären sich selbst:
Als @Robert sagte, der folgende code funktioniert einwandfrei:
Jedoch, wenn Sie angeben, die der Anbieter als "v. Chr." statt, es wird falsch sein:
Es könnte als ein Fehler der Hüpfburg, oder eine Art (komisch, aber sinnvolle) Funktion.
Habe ich nicht gehabt, dieses problem zu lösen mich, aber ein workaround wäre, um den Schlüssel zu erstellen-stream manuell und Griff die XORing selbst.
Ist, würden Sie wechseln von
AES/CTR/NoPadding
zuAES/ECB/NoPadding
wiederholt und verschlüsseln Sie Ihre die Inkrementierung von counter-Wert, Wann immer Sie brauchen neue Daten, um die XOR-Operation mit dem Geheimtext.Weit von ideal, aber ich nehme an, dass es funktionieren würde.