这是我拥有的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代码(JDK1.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);
}发布于 2012-03-24 05:11:08
有几件事你应该检查一下。您可能会发现Encryption using AES-128 in Java会提供一些帮助。在PHP和Java代码中处理键的方式可能存在差异。在Java语言中,在没有编码的情况下调用String上的getBytes()几乎总是一个坏主意。另外,使用的填充可能是一个问题。根据我所看到的,PHP pad默认使用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;https://stackoverflow.com/questions/9846283
复制相似问题