2016-05-12 11 views
0

Hallo Stackoverflow-Community,Java ist mir eine andere Puffer des gleichen Pakets von dem in C geben

ich um diese Gemeinschaft immer für eine Weile gewesen ist, aber ich hatte noch nie ein solches Problem ohne jede andere Lösung online, oder zumindest konnte ich es nicht finden.

Ich verwende Java, um einen Client zu erstellen, sobald der Client eine Verbindung zum Server herstellt, erhält er ein Paket, das sinnvolle und wichtige Informationen enthält und natürlich verschlüsselt ist; Ich habe die Kryptographie, die hinter dem ganzen Prozess steckt, vor langer Zeit erfolgreich umgekehrt und sie ohne Probleme in C++ implementiert und vollständig mit positiven Ergebnissen getestet.

Jetzt versuche ich den Client in Java für Wissenschaft und bessere Codierungsgeschwindigkeit neu zu schreiben, aber das einzige Problem ist, dass das Paket anders ist, als es aussehen sollte. Zum Beispiel, indem ich das Paket mit einer C nativen Anwendung schnüffle bekomme ich einen Puffer, aber das gleiche Paket in meinem Java-Client ergibt sich anders. Was meine ich? Ich meine, dass es mehrere 0xFD/BF-Bytes gibt, die nicht gültig sind, was zu einem beschädigten Puffer und dann zu einem Entschlüsselungsfehler führt.

Dies sind die Screenshots, damit Sie besser verstehen,

Original-RICHTIG Paket Corrent packet

Dies wird das Paket von Java abgeladen ist, die CORRUPTED ist Incorrect packet

Ich bin Verwenden Sie Read als lesende Objektklasse für den outStream des Sockets. Haben Sie eine Idee über die Ursache des Problems?

private Reader _br = new InputStreamReader(socket.getInputStream()); 
 

 
char[] _data = new char[92]; 
 
this._br.read(_data); 
 

 
_dump(toBytes(_data));

Ich habe nur die auf das Thema bezogenen Code.

+1

Meine Kristallkugel funktioniert heute nicht. Sie müssen einen [MCVE] (http://stackoverflow.com/help/mcve) Code anzeigen, um eine Antwort zu erhalten. –

Antwort

0

Sie dekodieren Zufallsbytes (wahrscheinlich Ihren Geheimtext) in Zeichen, indem Sie die Standardkodierung der Plattform verwenden, die UTF-8 zu sein scheint.

Dies funktioniert natürlich nicht, so dass das Ersatzzeichen " " oder U + FFFD im Zeichenstrom überall dort eingefügt wird, wo ungültige Bytefolgen auftreten.

Dann drucken Sie die Zeichen, die den (jetzt beschädigten) Text in UTF-8 kodieren. Die UTF-8-Codierung von U + FFFD ist 0xEF 0xBF 0xBD.

Die Ursache des Problems besteht darin, dass Sie nichttextuelle Daten als Text behandeln.


Update:

Das Problem ist, dass Sie eine InputStreamReader erstellen. Tu das nicht. Dies wäre nur nützlich, wenn der Eingabestream codierten Text enthält. Lesen Sie Ihre Eingabe in ein Byte-Array statt:

InputStream is = socket.getInputStream(); 
byte[] data = new byte[92]; 
for (int pos = 0; pos < data.length;) { 
    int n = is.read(data, pos, data.length - pos); 
    if (n < 0) 
    throw new EOFException(); 
    pos += n; 
} 
/* Print what you read for debugging... */ 
for (byte b : data) 
    System.out.printf("%02X", b & 0xFF); 
System.out.println(); 

Jetzt data Ihr Paket enthält. Sie können es analysieren und den Chiffretext entschlüsseln.Vielleicht ist der resultierende Klartext tatsächlich Text, und an diesem Punkt können Sie ihn in Zeichen decodieren.

+0

Uhm, scheint ein gültiger Grund, gibt es einen Hinweis, den Sie mir geben können, um Nicht-Unicode-Zeichen zu drucken und gültig für einzelne Bytes, die in einer for-Schleife drucken? – d3vil401

+0

@ d3vil401 Ich verstehe deine Frage nicht wirklich, aber ich habe versucht zu erraten. Siehe mein Update. – erickson

+0

Sie gaben mir genau das, was ich brauchte, vielen Dank! – d3vil401