2010-02-15 34 views
2

我正在嘗試爲Android創建一個應用程序,該應用程序使用加密來保存用戶信息,但我無法弄清楚我做錯了什麼。我試圖創建一個AES密碼的實例,但應用程序繼續拋出「InvalidKeyExceptions」。請看下面的代碼:Android密碼問題。 InvalidKeyException異常?

public static final byte[] IV = new byte[] 
{ 0x04, 0x08, 0x15, 0x16, 0x23, 0x42, 0x00, 0x00, 0x00, 0x00,0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; 
protected final IvParameterSpec params = new IvParameterSpec(IV); 
protected Cipher myCipher; 

public AESEncryptor(String passwd, InputStream source, String destinationFile) 
{ 
    try 
    {   
     myCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     Log.d("System.out.println", "Block Size: "+myCipher.getBlockSize()); 
     myCipher.init(Cipher.ENCRYPT_MODE, AESEncryptor.generateSecretKeyFromPassword(passwd),params); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

我得到這個異常:

java.security.InvalidKeyException: 初始化向量必須是同一 長度塊大小..

的myCipher.init(...)行會觸發此異常。

我明白這是什麼意思,但根據myCipher.getBlockSize()IV字節數組應該保存16個字節,它確實,但它不起作用。我也嘗試了長度爲0-128的字節數組,並且該範圍內的任何內容都不起作用。另外,如果我將這段代碼保持不變,並將其添加到常規Java應用程序中,則不會出現錯誤。爲Android編譯似乎會導致此錯誤。

請幫忙。 謝謝, Ryan

+0

是異常的確切文本?我無法在openjdk中找到它,但它可能會改變文本。 – 2010-02-15 12:54:45

+0

是的,這是確切的文字。其餘的例外只是一個堆棧跟蹤。他們可能已經改變了文本,因爲「初始化」拼錯了......應該是「初始化」。 – RyanM 2010-02-15 13:07:31

回答

1

您是否嘗試過在模式參數中明確指定塊大小?

例:

Cipher.getInstance("AES/CBC16/PKCS5Padding"); 

我注意到here,如果您不指定塊大小則是供應商依賴。

+0

感謝您的回覆。雖然這是一個好主意,但當我嘗試它時,我得到以下異常:「java.security.NoSuchAlgorithmException:無法支持模式CBC16」。 Ryan – RyanM 2010-02-17 23:13:10

+0

嘗試CBC128,因爲AES是128位塊密碼。 以下是一個很好的參考頁面:http://java.sun.com/j2se/1.4.2/docs/guide/security/jce/JCERefGuide.html#AppA – 2010-02-18 05:22:33