2010-04-28 36 views
0

我修改了可用的代碼 http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.htmljava AES解密函數有什麼問題?

並在程序中做了加密和解密的方法。但我越來越BadpaddingException .. 也功能正在返回空.. 爲什麼它是攻擊?最新出了什麼問題?請幫助我..

這些變量我使用:


kgen = KeyGenerator.getInstance("AES"); 
      kgen.init(128); 
      raw = new byte[]{(byte)0x00,(byte)0x11,(byte)0x22,(byte)0x33,(byte)0x44,(byte)0x55,(byte)0x66,(byte)0x77,(byte)0x88,(byte)0x99,(byte)0xaa,(byte)0xbb,(byte)0xcc,(byte)0xdd,(byte)0xee,(byte)0xff}; 
      skeySpec = new SecretKeySpec(raw, "AES"); 
      cipher = Cipher.getInstance("AES"); 

      plainText=null; 
      cipherText=null; 

以下是解密函數..


public String decrypt(String cipherText) 
    { 
     try 
     { 
      cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
      byte[] original = cipher.doFinal(cipherText.getBytes()); 
      plainText = new String(original); 
     } 


     catch(BadPaddingException e) 
     { 

     } 

     return plainText; 
    } 

回答

4

從這個人做的是Java-Security archives

一個常見的錯誤將加密的字節放入 字符串中,並在解密時使用String.getBytes()來檢索它。 由於String自己的字符編碼,您用來構造字符串對象的字節[]和您從其getBytes() 獲得的字節[]不一定相等。
0

由於您顯示的代碼非常少,因此很難預測可能導致異常的原因。

plainText爲null,因爲它被初始化爲null,解密函數在將值賦給plainText之前拋出異常。

你對kgen做什麼?在你鏈接的例子中,它被用來爲密鑰規範生成原始字節數組。在您的變量實例化列表中,您可以手動定義原始字節數組。

KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
    kgen.init(128); // 192 and 256 bits may not be available 

    // Generate the secret key specs. 
    SecretKey skey = kgen.generateKey(); 
    byte[] raw = skey.getEncoded(); 

    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 
1

cipherText其實是從哪裏來的?它需要是一個「原始」字節數組(不是字符串),並且需要以Cipher可以理解的方式進行加密。

AES(和一般的塊密碼)可以在不同的「塊模式」和不同的「填充」下運行,當你實例化一個密碼時,你應該指出你正在使用哪個塊模式最初加密數據)。如果在傳遞原始字節時出現BadPaddingException,則通常表示數據已使用不同的模式或填充進行了加密。 (在這種情況下,它可能只是將數據轉換爲一個字符串的一種假象,因爲我認爲另一個海報已經提到。)

一些信息我已經寫了可能會有所幫助: