【问题标题】:Sending encrypted file over socket通过套接字发送加密文件
【发布时间】:2013-05-01 07:21:54
【问题描述】:

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

客户端:

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

    }

【问题讨论】:

  • 我遇到了一些问题”不是一个好的问题描述。请更具体 - 如果您有堆栈跟踪或解释为什么您的输出看起来不正确,请发布堆栈跟踪。理想情况下,请创建一个SSCCE 来演示我们可以复制/粘贴的问题。
  • 我看到你直接在output 上写了 关闭cos,它是在output 之上创建的。据我记得这是不可能的。来自 CipherOutputStream.close() 的文档:“此方法调用封装密码对象的 doFinal 方法,这会导致处理封装密码缓冲的任何字节。结果通过调用此输出流的刷新方法写出. 此方法将封装的密码对象重置为其初始状态并调用底层输出流的关闭方法。"
  • @Fildor 这正是问题所在,非常感谢你,我很抱歉没有尽可能具体

标签: java sockets objectoutputstream dataoutputstream


【解决方案1】:

添加这个答案,这样问题就可以结束了:

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

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

【讨论】:

  • 是的,就是这样;)顺便说一句,有没有办法强制 CipherInputStream 读取最后一个字节而不关闭它?因为我正在关闭它,但由于套接字已关闭,我收到错误...
【解决方案2】:

sig.update(数据);

应该是这样的

sig.update(data, 0, i);

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 2012-07-12
    • 2015-08-28
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多