2012-11-22 86 views
0

我嘗試使用salt來解密AES加密的消息,但始終返回null值。任何人都可以看看我在哪裏做錯了?AES解密始終爲空

public static String decryptMessage(String encryptedMessage, String salt) { 

    String decryptedMessage = null; 
    String valueToDecrypt = encryptedMessage; 
    try { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance(ALGORITHM); 
    c.init(Cipher.DECRYPT_MODE, key); 


    for (int i = 0; i < ITERATIONS; i++) { 
     byte[] decodedValue = Base64.decodeBase64(valueToDecrypt); 
     byte[] decVal = c.doFinal(decodedValue); 
     decryptedMessage = new String(decVal).substring(salt.length()); 
     valueToDecrypt = decryptedMessage; 
    } 


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

    } 
    return decryptedMessage; 
} 

**EDIT:** 

這裏是我假設的相應的加密方法。

private static final String ALGORITHM = "AES"; 
    private static final int ITERATIONS = 5; 
    private static final byte[] keyValue = new byte[] { '1', '2', '3', '4', 
      '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6' }; 


    public static String encryptMessage(String message, String salt) { 
     String encMessage = null; 
     byte[] encVal = null; 
     String messageWithSalt = null; 
     try { 
      Key key = generateKey(); 

      Cipher c = Cipher.getInstance(ALGORITHM); 
      c.init(Cipher.ENCRYPT_MODE, key); 

      for (int i = 0; i < ITERATIONS; i++) { 
       messageWithSalt = salt + encMessage; 
       encVal = c.doFinal(messageWithSalt.getBytes()); 
       byte[] encryptedValue = new Base64().encode(encVal); 
       encMessage = new String(encryptedValue); 
      } 

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

     } 
     return encMessage; 
    } 

PS:ITERATION不是0;

+0

什麼是'算法'? – PearsonArtPhoto

+4

ITERATIONS是0嗎? :) – Leigh

+2

你忘了發佈相應的加密代碼。 – CodesInChaos

回答

1

嗯,我發現了錯誤。這是在加密方法。在加密過程開始之前,encMessagenullString encMessage = message做到了。所以加密方法是:

public static String encryptMessage(String message, String salt) { 
      String encMessage = message; 
      byte[] encVal = null; 
      String messageWithSalt = null; 
      try { 
       Key key = generateKey(); 

       Cipher c = Cipher.getInstance(ALGORITHM); 
       c.init(Cipher.ENCRYPT_MODE, key); 

       for (int i = 0; i < ITERATIONS; i++) { 
        messageWithSalt = salt + encMessage; 
        encVal = c.doFinal(messageWithSalt.getBytes()); 
        byte[] encryptedValue = new Base64().encode(encVal); 
        encMessage = new String(encryptedValue); 
       } 

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

      } 
      return encMessage; 
     } 
1

我認爲你的方法可能會被長期損壞或錯誤命名。每次解密時都會生成一個密鑰,而您應該有一個與用於加密的密鑰匹配的預先存在的密鑰。

您還傳遞一個「salt」值 - 注意:這是一個通常爲散列保留的術語 - 除非將大小用作結果的截斷長度,否則您完全忽略它。

當然,我上面看到的並不是以明智的方式解密任何東西。如果你可以描述剛好你想達到的目標,我們可以修改代碼,或者指出你在執行該任務的同行評審方法(可能已經在標準庫中實現)。