2012-03-06 87 views
2

我試圖用SealedObjects超過一個RMI連接IOException異常,使用

目標是SealedObject,密碼預先初始化(正確的,據我發送數據SealedObject.getObject()時無效流頭中號aware)的,但是當我運行下面的代碼,我得到一個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 2012-03-06 02:41:27

+0

哎呀,這就是我得到的抄錄複製粘貼。我實際上設置了變量參數= cipher.getParameters(); (如上所述)以便使用相同的參數進行解密。我實際上並沒有加密任何東西 - 加密是在客戶端完成的:但我認爲參數是一樣的,因爲密鑰是一樣的? – 2012-03-06 02:43:55

+0

我認爲在上面的代碼部分target.getObject(cipher)之前,別的東西正在讀你的密碼。 – 2012-03-06 02:51:03

回答

3

當您在客戶端上調用cipher.init(Cipher.ENCRYPT_MODE, key)時,會生成一個隨機IV。在服務器上,第一次撥打ciper.init只是產生一個不同於傳入消息的隨機IV,因此getObject只會看到無意義。

您需要使用相同的IV來解密每條消息,與用於加密的消息相同。在這種情況下,您可能只需將IV添加到密碼即可。然後將IV讀入服務器上的一個字節數組中,並使用它來初始化解密。

+0

這可能會起作用 - 雖然我無法判斷它是否導致了另一個錯誤,或者只是讓我通過我的代碼進一步絆倒了一個已經存在的代碼....我會進一步調查。 – 2012-03-06 03:29:26