2017-12-18 11 views
0

ソケット(単一のクライアントの単一サーバー)で暗号化されたオブジェクトを送信しています。クライアントは暗号化されたオブジェクトをSealed Objectとして送信し、サーバーはオブジェクトを復号化します。しかし、サーバー側でObjectInputStreamを作成するときに、StreamCorruptedExceptionがスローされます。 私はインターネット上で多くの検索を行い、コードは正常に見えますが、例外がスローされる理由はわかりません。ここでJavaのCipherInputStreamでObjectInputStreamをラップしているときにjava.io.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) 
+0

なぜ2回暗号化していますか? – EJP

答えて

0

問題は二重暗号化です。出力ケースの暗号は、オブジェクトを封印してからストリームを暗号化する必要がありますが、入力ケースのCipherオブジェクトはストリームを解読して逆の順序でオブジェクトを開封する必要があります。

SealedObjectまたは暗号ストリームのいずれかを削除します。

関連する問題