Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从套接字读取/解密时的java.io.EOFException_Java_Sockets_Encryption_Client Server - Fatal编程技术网

从套接字读取/解密时的java.io.EOFException

从套接字读取/解密时的java.io.EOFException,java,sockets,encryption,client-server,Java,Sockets,Encryption,Client Server,我有一个大型客户机-服务器程序 但是,如果我发送一个加密包,在尝试接收和解密它时,会导致java.io.EOFException 例如,如果我使用非加密的方式进行ping,它将非常有效 客户端代码接收: 服务器代码发送: java:104是这一行Response res=Response ois.readObject 不能在同一套接字上混合使用不同的缓冲流。他们会互相窃取数据。在套接字的生命周期中,您需要使用单个ObjectInputStream和ObjectOutputStream重新设计和重

我有一个大型客户机-服务器程序

但是,如果我发送一个加密包,在尝试接收和解密它时,会导致java.io.EOFException

例如,如果我使用非加密的方式进行ping,它将非常有效

客户端代码接收:

服务器代码发送:

java:104是这一行Response res=Response ois.readObject


不能在同一套接字上混合使用不同的缓冲流。他们会互相窃取数据。在套接字的生命周期中,您需要使用单个ObjectInputStream和ObjectOutputStream重新设计和重写它


可能您正在查找SealeObject?

这与您的问题无关,但您应该正确使用IV:加密时将其设置为不可预测的随机值,以不需要加密的方式传输,解密时使用它。按你的身份使用静脉注射是不安全的。我知道。这只是为了测试。因为如果它始终是0000000,我不需要发送它,我会尝试将两种不同类型的流分开:编写一个简单的方法来解密加密流,并首先处理几个字节以确保其正常工作,然后再尝试通过发送序列化对象。只有我的2美分。密封对象-密封交易,非常有用。如果这是1,我就是古玩。以及如何绕过这一点。假设我想使用GZip解压/压缩->加密/解密->对象入/出流,我该怎么做呢。它们都是缓冲的,但从功能上讲是有意义的。你可以参考一篇文章/博客来进一步解释这一点吗
InputStream is = subChannel.getInputStream();
ObjectInputStream pre = new ObjectInputStream(is);
ObjectInputStream ois;
boolean crypt = (boolean) pre.readObject();

if (crypt) {
    ois = new ObjectInputStream(SimpleAES.decryptInputStream(c.getAesKey(), is));
} else {
    ois = new ObjectInputStream(is);
}

Response<? extends Serializable> res = (Response<? extends Serializable>) ois.readObject();
req.onResponse(res);
is.close();
private final static byte[] iv = new byte[16];
private static final String TRANSFORMATION = "AES/CBC/NoPadding";

public static CipherOutputStream cryptOutputStream(SecretKey key,OutputStream os) throws InvalidKeyException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchPaddingException {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        cipher.init(Cipher.ENCRYPT_MODE, key, ivspec);
        CipherOutputStream out = new CipherOutputStream(os, cipher);
        return out;
}

public static CipherInputStream decryptInputStream(SecretKey key,InputStream os) throws InvalidKeyException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchPaddingException {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        cipher.init(Cipher.DECRYPT_MODE, key, ivspec);
        CipherInputStream out = new CipherInputStream(os, cipher);
        return out;
}
OutputStream base;
base = sock.getOutputStream();

ObjectOutputStream infoStream = new ObjectOutputStream(base);

infoStream.writeObject(pack.isEncrypted());
ObjectOutputStream packageStream;

if (pack.isEncrypted()) {
    String tolken = pack.getClientTolken();
    Session s = getSession(tolken);
    packageStream = new ObjectOutputStream(SimpleAES.cryptOutputStream(s.getAesKey(), base));
}
else
    packageStream = new ObjectOutputStream(base);

packageStream.writeObject(pack);
packageStream.flush();

if (pack instanceof Request) {
    InputStream baseIn = sock.getInputStream();
    ObjectInputStream res;

    if (pack.isEncrypted()) {
        res = new ObjectInputStream(SimpleAES.decryptInputStream(getSession(pack.getClientTolken()).getAesKey(), baseIn));
    } else {
        res = new ObjectInputStream(baseIn);
    }

    @SuppressWarnings("unchecked")
    Response<? extends Serializable> response = (Response<? extends Serializable>) res.readObject();
    ((Request) pack).onResponse(response);
    res.close();
}

base.close();
Ping Response : 8ms
[Client] Added TolkenRequest to Query
[Client] Added RSARequest to Query
[Client] Added AESKeyPack to Query
[Client] Added ValidIdRequest to Query
java.io.EOFException
Fatal Error Exit
    at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
    at java.io.ObjectInputStream.readShort(Unknown Source)
    at java.io.ObjectStreamClass.readNonProxy(Unknown Source)
    at java.io.ObjectInputStream.readClassDescriptor(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at com.niton.tele.core.network.client.ClientListenerThread.run(ClientListenerThread.java:104)