Java 从套接字创建密码流时应用程序死锁

Java 从套接字创建密码流时应用程序死锁,java,sockets,encryption,network-programming,aes,Java,Sockets,Encryption,Network Programming,Aes,我在两个套接字之间加密和解密流时遇到问题 ObjectInputStream oIn = new ObjectInputStream(new FileInputStream(new File("key"))); SecretKeySpec spec = (SecretKeySpec) oIn.readObject(); //'key' file was saved previously Cipher cEncrypt = Cipher.getInstance("AES"); cEncrypt

我在两个套接字之间加密和解密流时遇到问题

ObjectInputStream oIn = new ObjectInputStream(new FileInputStream(new File("key")));
SecretKeySpec spec = (SecretKeySpec) oIn.readObject();
//'key' file was saved previously


Cipher cEncrypt = Cipher.getInstance("AES");
cEncrypt.init(Cipher.ENCRYPT_MODE, spec); 
Cipher cDecrypt = Cipher.getInstance("AES");
cDecrypt.init(Cipher.DECRYPT_MODE, spec); 
//should have no problems here, I tried the ciphers out by encoding and decoding a String, works fine

ObjectOutputStream objectOutputStream= new ObjectOutputStream(new CipherOutputStream(socket.getOutputStream,cEncrypt)); 
objectOutputStream.flush(); 
ObjectInputStream objectInputStream = new ObjectInputStream(new CipherInputStream(socket.getInputStream,cDecrypt));
然后,程序停止。插座两侧的代码相同。在不使用加密流的情况下,程序可以很好地传输数据

非常感谢您的帮助,谢谢

见:

任何由封装密码缓冲并等待其处理的字节都不会被写入。例如,如果封装的密码是块密码,并且使用其中一种写入方法写入的字节总数小于密码的块大小,则不会写入任何字节

基本上,您的数据只能以16字节的块写入,因为您使用的是像ECB或CBC这样的分组密码。使用流密码可以避免此问题。有关详细信息,请参阅。您需要选择CFB、OFB或CTR。例如,当您获得
密码
实例时:

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");

如果我使用CTR模式,两个终端是否都必须使用公共IV?或者这是由密码obj的初始化处理的?谢谢你的提示,它现在正在工作!尽管如此,我还是使用了“AES/CFB8/NoPadding”