У меня возникли проблемы с отправкой зашифрованного файла через сокет (связь клиент-сервер). Я думаю, что это проблема, связанная с потоками (точнее, расположение потоков кажется довольно сложным, поскольку я создаю потоки ввода/вывода данных из потоков ввода/вывода объектов, а затем шифрую потоки ввода/вывода из них) ...
Сторона клиента:
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;
}
}
output
сразу после закрытияcos
, который создается поверхoutput
. Насколько я помню, это невозможно. Из документа CipherOutputStream.close(): этот метод вызывает метод doFinal инкапсулированного объекта шифра, который вызывает обработку любых байтов, буферизованных инкапсулированным шифром. Результат выписывается вызовом метода flush этого выходного потока. Этот метод сбрасывает инкапсулированный объект шифра в исходное состояние и вызывает метод close базового потока вывода. - person Fildor   schedule 30.04.2013