ソケット(単一のクライアントの単一サーバー)で暗号化されたオブジェクトを送信しています。クライアントは暗号化されたオブジェクトを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)
なぜ2回暗号化していますか? – EJP