2013-10-17 112 views
0

我有麻煩通信Java和Ruby之間加密的數據。 的Java => Java的正常工作 紅寶石=>紅寶石工作正常 紅寶石=> Java的正常工作 的Java =>紅寶石不起作用(錯誤:錯誤的最後塊長度)。AES CBC PKCS5Padding爪哇到Ruby

在java中我使用此代碼對數據進行加密,然後將其張貼到軌服務器 關鍵尺寸

static public synchronized String encryptAesData(Context pContext, String pData, byte[] pKey, byte[] pIv) { 
     Log.d("", "key size <" + pKey.length + "> iv size <" + pIv.length + ">"); //key size <32> iv size <16> 

     AlgorithmParameterSpec paramSpec = new IvParameterSpec(pIv); 
     SecretKeySpec key = new SecretKeySpec(pKey, "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); 
     byte[] encrypted = cipher.doFinal(pData.getBytes()); 
     return Base64.encodeToString(encrypted, Base64.DEFAULT); 

在紅寶石我用

encrypted_data = Base64.decode64(raw_data)                                         
decipher = OpenSSL::Cipher::AES.new(256, :CBC)                                        
decipher.decrypt                                                
decipher.key = "censored_key".unpack('A*').pack('H*')# decipher.key.size = 32                                
decipher.iv = "censored_iv".unpack('A*').pack('H*') # decipher.iv.size = 16                                 
plain = decipher.update(encrypted_data) + decipher.final 

並且得到錯誤「錯誤最終塊長度」

關於如何解決這事嗎?

回答

0

上面的代碼工作得很好。問題在於通過發佈請求發送的base64編碼。

1

我懷疑它可以通過使用填補方案引起的。 PKCS5墊64位(8字節)的塊大小,但AES-256-CBC使用16個字節的塊。因此,嘗試爲Java端使用PKCS7填充。

+0

我試過'cipher cipher = Cipher.getInstance(「AES/CBC/PKCS7Padding」); ',但得到了同樣的失敗:( – Antzi

+0

@Antzi,你有沒有檢查密文字節數組是否在Java和Ryby方面都是一樣的?以防Base64實現行爲不同 – Jk1

+0

我會檢查。同樣,因爲我使用相同的方法來解壓成功解碼由ruby編碼的數據時使用的base64密鑰。 – Antzi

相關問題