2012-03-23 4 views
2

これは私が持っているPHPコードです。それは基本的に何
PHPコードの3DES解読に相当するJavaを必要としています

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暗号化された文字列復号化することである(最初に、パック機能を使用してバイナリする16進文字列に変換し、その後、実際の復号を行います)。

これはPHP-4で完全に機能し、 "Hello World"メッセージを出力します。

しかし、同等のJavaコード(jdk 1.6)を実行すると、 - ¬ªmjV=7xl_ÓÄ^> *?というガベージ出力が表示されます。

誰かがこの問題のトラブルシューティングを支援できますか? Javaが16進文字列を適切に解読しない理由

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()を呼び出すことは、ほとんど常に悪い考えです。加えて、使用されたパディングが問題になる可能性があります。私が見たところでは、null文字のPHPパッドはデフォルトではJavaのNoPaddingに対応していません。最後にhexToStringメソッドはStringの代わりにbyte[]を返します。 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

関連する問題