2017-12-18 11 views
0

소켓 (단일 클라이언트 단일 서버)을 통해 암호화 된 객체를 보내고 있습니다. 클라이언트는 암호화 된 개체를 봉인 된 개체로 보내고 서버는 개체의 암호를 해독합니다. 그러나 서버 측에서 ObjectInputStream을 생성하는 동안 StreamCorruptedException이 발생합니다. 나는 인터넷에서 많은 것을 검색했고 코드는 괜찮아 보이지만 왜 예외가 던져지고 있는지 모른다. 여기 Java에서 CipherInputStream에 래핑하는 동안 ObjectInputStream에서 java.io.StreamCorruptedException이 발생했습니다.

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) 
다음

는 클라이언트 클래스
+0

두 번 암호화하는 이유는 무엇입니까? – EJP

답변

0

문제는 이중 암호화입니다. 출력 케이스의 Cipher는 객체를 봉인 한 다음 스트림을 암호화해야하지만 입력 케이스의 Cipher 객체는 스트림을 해독 한 다음 반대 순서 인 객체를 봉인 해제해야합니다.

SealedObject 또는 암호 스트림을 제거하십시오.