소켓 (단일 클라이언트 단일 서버)을 통해 암호화 된 개체를 보내고 있습니다. 클라이언트는 암호화 된 개체를 봉인 된 개체로 보내고 서버는 개체를 해독합니다. 그러나 서버 측에서 ObjectInputStream을 생성하는 동안 StreamCorruptedException이 발생합니다. 인터넷에서 많이 검색했는데 내 코드는 괜찮아 보이지만 예외가 발생하는 이유를 모르겠습니다.
다음은 Client 클래스입니다.
package sample;
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.SealedObject;
import javax.crypto.spec.SecretKeySpec;
import java.io.ObjectOutputStream;
import java.net.Socket;
public class Client {
private static Socket socket;
public static void main(String args[]) throws Exception {
socket=new Socket("127.0.0.1",7777);
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES");
cipher.init(Cipher.ENCRYPT_MODE, sks);
CipherOutputStream cos=new CipherOutputStream(socket.getOutputStream(),cipher);
ObjectOutputStream oos=new ObjectOutputStream(cos);
oos.flush();
SealedObject sealedObject=new SealedObject("SampleString",cipher);
oos.writeObject(sealedObject);
}
}
내 서버 클래스는 다음과 같습니다.
package sample;
import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.SealedObject;
import javax.crypto.spec.SecretKeySpec;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static ServerSocket serverSocket;
public static SecretKeySpec sks;
public static void main(String args[]) throws Exception{
serverSocket=new ServerSocket(7777);
Socket clientSocket=serverSocket.accept();
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES");
cipher.init(Cipher.DECRYPT_MODE, sks);
CipherInputStream cis=new CipherInputStream(clientSocket.getInputStream(),cipher);
ObjectInputStream ois=new ObjectInputStream(cis); //line 23
SealedObject so=(SealedObject) ois.readObject();
System.out.println((String)so.getObject(cipher));
}
}
클라이언트가 연결되면 서버 측에서 다음 예외가 발생합니다.
Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 73720019
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:857)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:349)
at sample.Server.main(Server.java:23)
문제는 이중 암호화입니다. 출력 케이스의 Cipher는 객체를 봉인 한 다음 스트림을 암호화해야하지만 입력 케이스의 Cipher 객체는 스트림을 해독 한 다음 객체의 봉인을 해제해야합니다. 이는 반대 순서입니다.
SealedObject
또는 암호 스트림을 제거하십시오 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다