2012-03-23 36 views
2

這是我擁有的PHP代碼。
需要Java等價於PHP代碼的3DES解密

function decrypt($s_input, $s_key, $s_iv) { 
    $s_decrypted = pack("H*" , $s_input); // Hex to binary 
    $s_decrypted = mcrypt_decrypt (MCRYPT_3DES, $s_key, $s_decrypted, MCRYPT_MODE_CBC, $s_iv); // 3des decryption 
    return $s_decrypted; 
} 
echo encrypt('c37551bb77f741d0bcdc16497b4f97b1','123456781234567812345678','12345678'); 

什麼它基本上是解密3DES加密字符串(先將其轉換十六進制字符串使用包功能二進制文件,然後進行實際的解密)。

這完美的工作在PHP-4並打印「Hello World」消息。但是,如果我運行等效的Java代碼(jdk 1.6),它會將垃圾輸出打印爲 - ¬ªmjV= 7xl_ * * * * *。

有人可以幫助解決這個問題嗎?爲什麼Java沒有正確解密十六進制字符串。

private static String decrypt(String inputStr, String keyStr, String ivStr) throws Exception { 

    IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes()); 
    SecretKeySpec key = new SecretKeySpec(keyStr.getBytes(), "DESede"); 
    inputStr = hexToString(inputStr, 2); 

    Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding"); 
    cipher.init(Cipher.DECRYPT_MODE, key, iv); 
    byte[] decrypted = cipher.doFinal(inputStr.getBytes()); 

    return new String(decrypted); 
} 

private static String hexToString(String input, int groupLength) { 
    StringBuilder sb = new StringBuilder(input.length()/groupLength); 
    for (int i = 0; i < input.length() - groupLength + 1; i += groupLength) { 
     String hex = input.substring(i, i + groupLength); 
     sb.append((char) Integer.parseInt(hex, 16)); 
    } 
    return sb.toString(); 
} 

public static void main(String[] args) throws Exception { 
    String decryptSignature = decrypt("c37551bb77f741d0bcdc16497b4f97b1", "123456781234567812345678", "12345678"); 
    System.out.println(decryptSignature); 
} 

回答

0

有幾件事你應該檢查。你可能會發現Encryption using AES-128 in Java有一定的幫助。在處理PHP和Java代碼中的密鑰方面可能存在差異。使用Java在String上調用getBytes()而無需編碼幾乎總是一個壞主意。再加上填充使用可能是一個問題。從我看到的PHP墊默認情況下,null字符,這不對應於Java中的NoPadding。最後,hexToString方法應返回byte[]而不是String。將調用Integer.parseInt(hex, 16)的結果添加到數組中:

byte[] results = new byte[input.length()/groupLength]; 
... 
    //inside the loop 
    results[i/groupLength] = (byte) Integer.parseInt(hex, 16); 
... 
return results; 
+0

謝謝。你給的代碼,解決了問題! – user1289117 2012-03-23 23:22:00