IOException, Недопустимый заголовок потока при использовании SealedObject.getObject () - PullRequest
2 голосов
/ 06 марта 2012

Я пытаюсь использовать SealedObjects для отправки данных через RMI-соединение

target - SealedObject, шифр инициализируется заранее (насколько мне известно), но когда я запускаю следующий код, я получаю IOException с сообщением

invalid stream header: 52FAA4D1

Где 54FAA4D1 - это каждая шестнадцатеричная строка из 8 символов.

Код, о котором идет речь,

target.getObject(cipher);

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

Шифр ​​создан с использованием

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

//Do this to get the same parameters as were used on the client side
cipher.init(Cipher.ENCRYPT_MODE, this.key);
AlgorithmParameters parameters = cipher.getParameters();

//Set to decrypt mode using the same parameters
byte[] iv = parameters.getParameterSpec(IvParameterSpec.class).getIV();
cipher.init(Cipher.DECRYPT_MODE, this.key, new IvParameterSpec(iv));

Я пробовал как с, так и без использования средней секции, и ни один из них, похоже, не работает.

Если я удаляю последний параметр в cipher.init () во второй раз, когда я вызываю его, я получаю InvalidKeyException, и если я полностью удаляю средний раздел и просто использую cipher.getParameters.getParameterSpec (IVParameterSpec.class) .getIV (); Я получаю исключение NullPointerException

Так что да, полностью застрял - любая помощь, оцененная даже при понимании, в чем проблема, будет оценена.

1 Ответ

3 голосов
/ 06 марта 2012

Когда вы звоните cipher.init(Cipher.ENCRYPT_MODE, key) на клиенте, генерируется случайный IV. На сервере первый вызов ciper.init просто генерирует другой случайный IV, который не соответствует входящему сообщению, поэтому getObject видит только глупость.

Вам необходимо использовать тот же IV для расшифровки каждого сообщения, который использовался для его шифрования. В этом случае вы, вероятно, можете просто добавить IV к шифру. Затем считайте IV в байтовый массив на сервере и используйте его для инициализации дешифрования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...