Код: Выделить всё
ObjectInputStream
Ниже приведен простой пример воспроизведения проблемы:
Код: Выделить всё
package Server;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class SimpleServer {
public static void main(String[] args) throws Exception {
int port = 5000;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server started. Waiting for connection...");
Socket clientSocket = serverSocket.accept();
System.out.println("Client connected.");
// Hardcoded key and IV
byte[] keyBytes = "1234567890123456".getBytes();
byte[] ivBytes = "1234567890123456".getBytes();
SecretKey key = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec iv = new IvParameterSpec(ivBytes);
// Setup Cipher and Streams
Cipher cipher_enc = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher_enc.init(Cipher.ENCRYPT_MODE, key, iv);
Cipher cipher_dec = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher_dec.init(Cipher.DECRYPT_MODE, key, iv);
CipherOutputStream cipher_encOut = new CipherOutputStream(clientSocket.getOutputStream(), cipher_enc);
CipherInputStream cipher_decIn = new CipherInputStream(clientSocket.getInputStream(), cipher_dec);
System.out.println("Ciphers initialized.");
ObjectOutputStream objOut = new ObjectOutputStream(cipher_encOut);
System.out.println("ObjectOutputStream initialized.");
objOut.writeObject("Hello from Server!");
objOut.flush();
//REMOVING THIS BLOCK WILL MAKE THE CODE WORK JUST FINE
ObjectInputStream objIn = new ObjectInputStream(cipher_decIn);
String message = (String) objIn.readObject();
System.out.println("Message from server: " + message);
objOut.close();
objIn.close();
clientSocket.close();
serverSocket.close();
System.out.println("Server finished.");
}
}
Код: Выделить всё
package Server;
import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.Socket;
public class SimpleClient {
public static void main(String[] args) throws Exception {
String host = "localhost";
int port = 5000;
Socket socket = new Socket(host, port);
System.out.println("Connected to server.");
// Hardcoded key and IV
byte[] keyBytes = "1234567890123456".getBytes();
byte[] ivBytes = "1234567890123456".getBytes();
SecretKey key = new SecretKeySpec(keyBytes, "AES");
IvParameterSpec iv = new IvParameterSpec(ivBytes);
// Setup Cipher and Streams
Cipher cipher_enc = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher_enc.init(Cipher.ENCRYPT_MODE, key, iv);
Cipher cipher_dec = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher_dec.init(Cipher.DECRYPT_MODE, key, iv);
CipherInputStream cipher_decIn = new CipherInputStream(socket.getInputStream(), cipher_dec);
CipherOutputStream cipher_encOut = new CipherOutputStream(socket.getOutputStream(), cipher_enc);
System.out.println("Ciphers initialized.");
ObjectInputStream objIn = new ObjectInputStream(cipher_decIn);
System.out.println("ObjectInputStream initialized.");
String message = (String) objIn.readObject();
System.out.println("Message from server: " + message);
//REMOVING THIS BLOCK WILL MAKE THE CODE WORK JUST FINE
ObjectOutputStream objOut = new ObjectOutputStream(cipher_encOut);
objOut.writeObject("Hello from Server!");
objOut.flush();
objIn.close();
objOut.close();
socket.close();
System.out.println("Client disconnected.");
}
}
Редактировать: новые блоки ObjectInputStream() не имеют никакого отношения к этой проблеме. OutputStream инициализируется и должен отправить требуемый заголовок. Мне кажется, проблема в том, что заголовок не отправляется или не поступает должным образом из-за базового CipherInputStream/CipherOutputStream.
Подробнее здесь: https://stackoverflow.com/questions/783 ... ient-and-s