Отправка зашифрованного файла через сокет

У меня возникли проблемы с отправкой зашифрованного файла через сокет (связь клиент-сервер). Я думаю, что это проблема, связанная с потоками (точнее, расположение потоков кажется довольно сложным, поскольку я создаю потоки ввода/вывода данных из потоков ввода/вывода объектов, а затем шифрую потоки ввода/вывода из них) ...

Сторона клиента:

private static void sendEncrypted(FileInputStream fis,DataOutputStream dos)throws Exception{

try {
        byte[] data = new byte[1024];

        CipherOutputStream cos = new CipherOutputStream(output, c);

        makeFileHeader(dos, c, key, sig);

        int i = fis.read(data);

        while(i != -1){
            cos.write(data, 0, i);
            sig.update(data);
            cos.flush();
            i = fis.read(data);
        }
        cos.close();
        fis.close();

byte[] signatureObj = sig.sign();

        output.writeObject(signatureObj);

    } catch (Exception e) {
        System.out.println(e.toString());
    }
}

dos — создается из исходного объекта. outputstream (вывод, который был создан из сокета). makefileheader — метод, создающий объект и использующий вывод для его перезаписи.

Сторона сервера:

private static void receiveFiles(DataInputStream dis,FileOutputStream fos, int size) throws IOException{

        byte [] b = new byte[1024];
        int read = 0;
        int offset;
        while(read < size){
            offset = input.read();
            dis.read(b,0,offset);
            fos.write(b,0,offset);
            read +=offset;
        }

    }

person besnico    schedule 30.04.2013    source источник
comment
У меня возникли проблемы — не очень хорошее описание проблемы. Пожалуйста, будьте более конкретными - опубликуйте трассировки стека, если они у вас есть, или объясните, почему ваши результаты выглядят неправильно. В идеале создайте SSCCE, демонстрирующий проблему, которую мы можем скопировать/вставить.   -  person Duncan Jones    schedule 30.04.2013
comment
Я вижу, вы пишете на output сразу после закрытия cos, который создается поверх output. Насколько я помню, это невозможно. Из документа CipherOutputStream.close(): этот метод вызывает метод doFinal инкапсулированного объекта шифра, который вызывает обработку любых байтов, буферизованных инкапсулированным шифром. Результат выписывается вызовом метода flush этого выходного потока. Этот метод сбрасывает инкапсулированный объект шифра в исходное состояние и вызывает метод close базового потока вывода.   -  person Fildor    schedule 30.04.2013
comment
@Fildor, это была именно проблема, большое спасибо, и мои извинения за то, что я не был таким конкретным, как мог бы.   -  person besnico    schedule 30.04.2013


Ответы (2)


Добавление этого ответа, поэтому вопрос можно закрыть:

Я вижу, вы пишете на выходе сразу после закрытия cos, который создается поверх вывода. Это невозможно.

Из документа CipherOutputStream.close(): «Этот метод вызывает метод doFinal инкапсулированного объекта шифра, который вызывает обработку любых байтов, буферизованных инкапсулированным шифром. Результат записывается путем вызова метода flush этого выходного потока. . Этот метод сбрасывает инкапсулированный объект шифра в исходное состояние и вызывает метод close базового выходного потока».

person Fildor    schedule 30.04.2013
comment
да, в том-то и дело ;) Кстати, есть ли способ заставить CipherInputStream читать последние байты, не закрывая его? Потому что я закрываю его, но затем получаю сообщение об ошибке из-за закрытия сокета... - person besnico; 30.04.2013

сиг.обновление(данные);

Которые должны быть

sig.update(data, 0, i);
person user207421    schedule 30.04.2013