gpt4 book ai didi

java - 需要 Java 等价物才能对 PHP 代码进行 3DES 解密

转载 作者:行者123 更新时间:2023-11-29 09:15:18 24 4
gpt4 key购买 nike

这是我的 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);
}

最佳答案

您应该检查一些事项。你可能会发现 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;

关于java - 需要 Java 等价物才能对 PHP 代码进行 3DES 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9846283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com