2011-08-09 36 views
1

我的目標是加密Iphone中的數據並在java服務器上解密它。加密/解密 - iphone到java - BadPaddingException:給定最後的塊沒有正確填充

我正在使用對稱加密。

我已經在java端使用KeyGenerator生成了密鑰。生成密鑰

代碼如下:

// Java代碼密鑰生成

File keyFile = new File("F:/key","mykey.key"); 
KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
kgen.init(128); 
SecretKey skey = kgen.generateKey(); 
byte[] enc= skey.getEncoded(); 
FileUtils.writeStringToFile(keyFile ,Base64.encodeBase64String(enc),"UTF-8"); 

以下是用於解密的Java代碼:

//從文件中獲取關鍵

File file = new File("F:/key", "mykey.key"); 
    SecretKeySpec keySpec= null; 
try { 
    byte[] keyBytes = Base64.decodeBase64(FileUtils.readFileToString(file,"UTF-8")); 
    keySpec= new SecretKeySpec(keyBytes, 0, 16, "AES"); 
    byte[] raw = keySpec.getEncoded(); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

//解密字符串encryptedString(來自iphone)

byte[] tempByte = Base64.decodeBase64(encryptedString); 

Cipher cipher = Cipher.getInstance("AES"); 
cipher.init(Cipher.DECRYPT_MODE, keySpec); 
byte[] cipherData = cipher.doFinal(tempByte); 

String ttt = new String(cipherData ,"UTF-8"); 
System.out.println(ttt); 

和iPhone的代碼是類似於日在下面給出的鏈接代碼: Encrypting data with Objective-C and decrypt it with Java Problem

我得到以下異常而在Java解密。

javax.crypto.BadPaddingException:鑑於最終塊未正確填充

請幫助...

回答

2

井填充和模式必須匹配。如果您複製了Objective-C代碼,則Objective-C端的密文具有ECB模式和PKCS7填充。

默認情況下,java AES密碼具有CBC模式和PKCS5填充(雖然我不確定,AFAIK PKCS5和PKCS7有些兼容)。我想你必須明確地指定這些。這些設置必須匹配,否則出現問題。所以你必須這樣創建密碼:

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

Btw。如果你可以選擇加密模式,你應該使用CBC(但是然後在兩邊)。

+2

PKCS5和PKCS7確實兼容。 ECB模式不安全,不應使用,請改用CTR或CBC模式。您的建議明確指定兩端使用的填充是正確的。 – rossum

+0

其實問題在關鍵。我在保存文件時編碼了密鑰。在手機中,我使用編碼密鑰進行加密,而在Java中,我使用原始密鑰進行解密。謝謝你的時間!! – Manish

相關問題