2012-03-23 13 views
2

Dies ist der PHP-Code, den ich habe.
Benötigen Java gleichwertig für 3DES Entschlüsselung von PHP-Code

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'); 

, was es tut, ist im Grunde eine 3DES verschlüsselte Zeichenfolge zu entschlüsseln (zuerst den Hex-String konvertiert Funktion Binärdatei Packs und dann führt die eigentliche Entschlüsselung).

Dies funktioniert perfekt in PHP-4 und druckt die "Hallo Welt" Nachricht.

Wenn ich jedoch den entsprechenden Java-Code (jdk 1.6) ausführe, druckt es Müllausgabe als - ¬ªmjV = 7xl_ÓÄ ^> * ?.

Kann jemand helfen, dies zu beheben? Warum entschlüsselt Java die Hex-Zeichenfolge nicht richtig?

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); 
} 

Antwort

0

Es gibt ein paar Dinge, die Sie überprüfen sollten. Vielleicht finden Sie Encryption using AES-128 in Java, um Ihnen zu helfen. Es könnte Probleme geben mit Unterschieden in der Handhabung von Schlüsseln im PHP- und Java-Code. Ein Aufruf von getBytes() auf einem String in Java ohne eine Kodierung ist fast immer eine schlechte Idee. Außerdem könnte die verwendete Polsterung ein Problem darstellen. Von dem, was ich PHP-Pads mit null Zeichen standardmäßig gesehen habe, die nicht NoPadding in Java entspricht. Schließlich sollte die hexToString Methode eine byte[] anstelle einer String zurückgeben. Fügen Sie das Ergebnis des Aufrufs von Integer.parseInt(hex, 16) in ein Array hinzu:

+0

danke. Code, den Sie gaben, löste das Problem! – user1289117