Java отправляет зашифрованный файл через сокет - PullRequest
5 голосов
/ 19 мая 2011

Я пытался написать небольшой файловый сервер. Я дошел до того, что передача файлов прошла нормально, но теперь, когда я попытался добавить шифрование, происходят странные вещи. Я пытаюсь использовать зашифрованные потоки ввода / вывода для отправки файла с использованием шифрования DES. Кажется, файл полностью передан сервером, но я не могу заставить клиента правильно его получить.

Независимо от того, какой тип файла я передаю, клиент никогда не покидает цикл, который я использую для получения файла. Несмотря на это, мне удалось получить файлы .pdf и .doc, ни в одном из которых, похоже, нет ошибок, и они открываются идеально. Когда я посылаю изображение, конец, кажется, не проходит должным образом. Изображение открывается, но его конец никогда не отображается, вместо этого только затененная область.

Я полагаю, что эти проблемы связаны, но я не знаю, как их исправить.

Вот код, который я использую для отправки файла на стороне сервера:

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();

И код для его получения на стороне клиента:

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();

Любые указатели в правильном направлении будут супер.

Ответы [ 2 ]

2 голосов
/ 19 мая 2011

вы не закрываете серверную часть CipherOutputStream

с блочными шифрами очистка может привести к тому, что некоторые байты не будут отправляться до тех пор, пока блок не заполнится или не будет выполнено закрытие, что приведет к вступлению в силу заполнения и позволит получателю найти EOF

2 голосов
/ 19 мая 2011
  while((bytesRead = cipherIn.read(fileBuffer)) != EOF){

Будет продолжать читать, пока число 'bytesRead' не даст вам EOF, но этого не произойдет, потому что вы не закрываете сокет (по крайней мере, я не вижу, что ваш код)другой конец.

Я вижу

cipherOut.flush() ;

, но это не собирается закрывать сокет.Если он просто «выпадает из области видимости», он не будет закрыт, пока сборщик мусора не соберет объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...