Frage

Ich bin derzeit ein sehr kleines Java-Programm schreibe einen one-time-pad zu implementieren, wobei das Polster (oder Schlüssel) selbst als eine Reihe von Bytes erzeugt wird ein Secure-Objekt, das einen einfachen String ausgesät wird unter Verwendung von mit der SHA-512-Algorithmus.

Erstellung der one-time-pad keine Probleme verursacht hat, und wenn ich den gleichen Samen Zeichenfolge jedes Mal liefern, wie erwartete ich die gleiche Folge von Pseudo-Zufallszahlen erhalten, so dass der Entschlüsselungsprozess möglich, solange die Person Entschlüsselungs hat den Samen Zeichenfolge zu verschlüsseln verwendet.

Beim Versuch, eine Datei zu verschlüsseln, liest das Programm in den Daten 64 Zeichen zu einem Zeitpunkt (mit Ausnahme für das Ende der Datei, die in der Regel eine ungerade Zahl ist) und erzeugt 64 Byte (oder -höhe matching) von psuedo Zufalls Bytes. XOR zwischen den Elementen der beiden Anordnungen durchgeführt, die resultierende char array die Chiffre Zeichen enthält, wird auf Datei geschrieben, und der Vorgang wiederholt, bis das gesamte Text in der Datei gelesen wurde.

Jetzt, da Java behandelt alle Primitiven als signierte Zahlen (den Datentyp Byte im Bereich von -128 bis 127, nicht 0 bis 255) Dies bedeutet, dass die XOR-Operation (und nicht) in einigen negativen Werten (-128 bis -1) zur Folge hat. Es scheint, dass Java diese Werte nicht als gültige ASCII erkennen, und schreibt einfach ein? (Fragezeichen) in die Datei für alle negative Werte. Wenn es darum geht, aus der Datei zu dem Lesen des Chiffretext, den negativen Wert zu entschlüsseln, die in der Folge? geschrieben Datei verloren geht, ersetzt mit 63, dem gültigen ASCII-Code für ein Fragezeichen werden.

Das bedeutet, dass dieser Wert XORing nutzlos ist, ohne den ursprünglichen Wert gibt es keine Möglichkeit, den Klartext zu erzeugen. Übrigens, wenn ich das Verhalten der Verschlüsselung einige Daten zu reproduzieren und dann unmittelbar nach dem Entschlüsseln der Daten in der gleichen Programmablauf und Statusdruck auf dem Weg, gibt es keine Probleme. Nur wenn die Daten-Datei geschrieben wird, ist die verlorenen Informationen.

Ich sollte auch erwähnen, dass ich versucht haben, 128 an jede Verschlüsselung XOR-Ergebnis hinzufügen, und subtrahieren sie dann vor der Entschlüsselung XOR Durchführung (jeder Wert in einem gültigen ASCII-Bereich setzen), aber das? Problem zeigte sich nach wie vor, weil es 31 ASCII-Codes 128 bis 159 sind, dass ich nicht in der Lage bin zu lesen und erscheinen, wie?

Ich habe meinen Kopf hämmern wurde von der Wand auf diesem für eine Weile jetzt, ist jede Hilfe dankbar. Prost.

War es hilfreich?

Lösung

Das ist sehr verwirrt. Wenn Sie ein char-Array verarbeiten, sind die Elemente 16 Bit breit, sie nicht signiert sind, und nicht alle Werte sind gültig. So (a) man kann möglicherweise ein Problem mit Zeichen oder Bytes wird, und (b) Sie sollten nicht das überhaupt tun. Sie sollten die Datei in einen Byte-Array lesen, XOR-ing, und die Byte-Array Schreiben aus direkt in die Ausgabedatei. Keine Leser oder Autoren, keine Zeichen, keine Strings.

Andere Tipps

Ich denke, das Problem in der Art und Weise ist, dass Sie die Datei schreiben. Schreiben Sie direkt das umgewandelte Byte-Array zu einem Outputstream und versuchen Sie nicht, es zuerst in einem String zu konvertieren. Für das Lesen, das Gleiche tun, um es zu einem Byte-Array lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top