Блокировка приложений при создании потоков шифрования из сокета - PullRequest
0 голосов
/ 25 апреля 2011

У меня проблемы с шифрованием и дешифрованием потоков между двумя сокетами.

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));

Затем программа останавливается.Код одинаков с обеих сторон сокета.Без использования зашифрованных потоков, программа прекрасно передает данные.

Любая помощь очень ценится, спасибо!

1 Ответ

1 голос
/ 25 апреля 2011

См. CipherOutputStream.flush():

Любые байты, буферизованные инкапсулированным шифром и ожидающие обработки, не будут записаны.Например, если инкапсулированный шифр является блочным шифром, а общее число байтов, записанных с использованием одного из методов записи, меньше размера блока шифра, никакие байты не будут записаны.

В основномВаши данные могут быть записаны только кусками по 16 байт, потому что вы используете шифр block , такой как ECB или CBC.Вы можете избежать этой проблемы, используя stream шифр.Подробнее см. режимы работы блочных шифров .Вам нужно будет выбрать CFB, OFB или CTR.Например, когда вы получите Cipher экземпляр:

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