2

这是我拥有的 PHP 代码。

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 加密字符串(首先它使用 pack 函数将十六进制字符串转换为二进制,然后进行实际解密)。

这在 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);
}
4

1 回答 1

0

您应该检查几件事。您可能会发现在 Java 中使用 AES-128 进行加密会有所帮助。您在 PHP 和 Java 代码中处理密钥的方式可能存在差异。在没有编码的情况下在 Java 中调用getBytes()aString几乎总是一个坏主意。另外,使用的填充可能是一个问题。从我所看到null的默认情况下,PHP pads 带有字符,这与 Java 不对应NoPadding。最后,该hexToString方法应该返回 abyte[]而不是 a 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;
于 2012-03-23T21:11:08.277 回答