通过套接字发送加密文件

时间:2013-04-30 13:35:04

标签: java sockets objectoutputstream dataoutputstream

我在通过套接字发送加密文件时遇到一些问题(客户端 - 服务器通信)。我认为这是一个与流相关的问题(更具体地说,流的排列似乎相当复杂,因为我从对象输入/输出流中创建数据输入/输出流,然后从这些流中加密输入/输出流) ...

客户方:

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 - 从原始objectoutputstream(输出,从套接字创建)创建 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;
        }

    }

2 个答案:

答案 0 :(得分:1)

添加此答案,以便可以关闭该问题:

我看到你在关闭cos之后直接写输出,这是在输出之上创建的。这是不可能的。

来自CipherOutputStream.close()的文档:“此方法调用封装的密码对象的doFinal方法,这会导致封装的密码缓冲的任何字节都被处理。结果通过调用flush方法写出此输出流。此方法将封装的密码对象重置为其初始状态,并调用基础输出流的close方法。“

答案 1 :(得分:0)

  

sig.update(数据);

那应该是

sig.update(data, 0, i);