2012-03-06 4 views
2

Я пытаюсь использовать SealedObjects для отправки данных через соединение RMIIOException, неверный заголовок потока при использовании SealedObject.getObject()

цель является 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

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

+0

Что происходит с этой линией? 'AlgorithmParameters cipher.getParameters();' – takteek

+0

Упс, вот что я получаю для переписывания, а не копирования + вставки. Фактически я устанавливаю переменные parameters = cipher.getParameters(); (исправлено выше), чтобы использовать одни и те же параметры для дешифрования. На самом деле, я ничего не шифрую - шифрование выполняется на стороне клиента: но я понял, что параметры такие же, как и тот же ключ? –

+0

Я думаю, что что-то еще читает ваш шифр перед указанной частью кода target.getObject (cipher). –

ответ

3

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

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

+0

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

Смежные вопросы