5 Stimmen

Java sendet verschlüsselte Datei über Socket

Ich habe versucht, einen kleinen Dateiserver zu schreiben. Ich habe es bis zu dem Punkt, wo eine Dateiübertragung ist einfach gut, aber jetzt, dass ich versucht habe, Verschlüsselung hinzufügen seltsame Dinge passieren. Ich versuche, Cipher Input/Output Streams zu verwenden, um die Datei mit DES-Verschlüsselung zu senden. Die Datei scheint vollständig vom Server übertragen zu werden, aber ich kann den Client nicht dazu bringen, sie richtig zu empfangen.

Ganz gleich, welche Art von Datei ich übertrage, der Client verlässt nie die Schleife, die ich zum Empfang der Datei verwende. Trotzdem ist es mir gelungen, .pdf- und .doc-Dateien zu empfangen, die beide keine Fehler zu haben scheinen und sich problemlos öffnen lassen. Wenn ich jedoch ein Bild sende, scheint das Ende nicht richtig zu funktionieren. Das Bild wird geöffnet, aber das Ende wird nicht angezeigt, sondern nur ein ausgegrauter Bereich.

Ich denke, dass diese Probleme zusammenhängen, aber ich weiß nicht, wie ich sie beheben kann.

Hier ist der Code, den ich verwende, um die Datei auf der Serverseite zu senden:

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
CipherOutputStream cipherOut = new CipherOutputStream(outToClient, cipher);
byte[] fileBuffer = new byte[BUFFER_SIZE];
InputStream fileReader = new BufferedInputStream(new FileInputStream(aFile));
int bytesRead;
while((bytesRead = fileReader.read(fileBuffer)) != EOF){
    cipherOut.write(fileBuffer, 0, bytesRead);
}
cipherOut.flush();

Und den Code für den Empfang auf der Client-Seite:

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, serverPublicKey);
CipherInputStream cipherIn = new CipherInputStream(inFromServer, cipher);

byte[] fileBuffer = new byte[BUFFER_SIZE];
FileOutputStream fileWriter = new FileOutputStream(newFileName);
int bytesRead;
while((bytesRead = cipherIn.read(fileBuffer)) != EOF){
    fileWriter.write(fileBuffer, 0, bytesRead);
}
fileWriter.flush();
fileWriter.close();

Jeder Hinweis auf die richtige Richtung wäre super.

2voto

Andrew Punkte 2484
  while((bytesRead = cipherIn.read(fileBuffer)) != EOF){

Wird einfach weiter lesen, bis die Anzahl der 'bytesRead' gibt Ihnen EOF, aber das wird nicht passieren, weil Sie nicht den Socket schließen (zumindest nicht, dass ich sehen kann, wenn Ihr Code) am anderen Ende.

Ich sehe

cipherOut.flush() ;

aber das reicht nicht aus, um die Steckdose zu schließen. Wenn es nur "aus dem Anwendungsbereich herausfällt", wird es nicht geschlossen, bis der Garbage Collector das Objekt wieder einsammelt.

2voto

ratchet freak Punkte 45968

Sie schließen den CipherOutputStream nicht serverseitig

Bei Block-Cyphern kann ein Flush dazu führen, dass einige Bytes nicht gesendet werden, bis der Block gefüllt ist oder ein Close ausgeführt wird, wodurch die Auffüllung in Kraft tritt und der Empfänger das EOF finden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X