PHP & JS mcrypt 解密不工作

PHP & JS mcrypt decryption not working

我在 Javascript 中有以下代码使用密钥加密字符串:

des.js是这样的:http://www.tero.co.uk/des/code.php

<script src="/js/des.js"></script>
<script>
var key = '12345678';
var message = 'hello world';

var ciph = des(key, message, 1, 0);
ciph = stringToHex(ciph);
console.log("Encrypted Result: " + ciph);
</script> 

然后我将它发送到服务器端并尝试使用此 PHP 代码解密:

$key = '12345678';
$hexa = '0x28dba02eb5f6dd476042daebfa59687a'; /This is the output from Javascript
$string = '';
for ($i=0; $i < strlen($hexa)-1; $i+=2) {
$string .= chr(hexdec($hexa[$i].$hexa[$i+1])); }
echo mcrypt_decrypt(MCRYPT_DES, $key, $string, MCRYPT_MODE_ECB);

我试过将其转换为 utf8、更改编码、更改十六进制解码等,但它总是出现乱码,有时是不可读的字符,有时是可读的但毫无意义。

要使用 DES 或 AES 等块密码加密的数据的长度必须是块大小的精确倍数。解决方案是在要加密的数据中添加填充,PKCS#5 填充是 DES 的常用填充,可能是 Javascript 的默认填充。不幸的是,mcrypt 不支持 PKCS#5 填充,仅支持 non-standard 零填充。

可能的解决方案:

  1. 使用比mcrypt更好的加密函数,见问题评论。
  2. 在 Javascript 中指定无填充并手动添加零填充。
  3. 在 mcrypt 中指定无填充并手动删除填充。

最好指定所有选项,不要依赖默认值。

解密字符串的方法不正确,试试这个:

$key = '12345678';
$hexa = '0x28dba02eb5f6dd476042daebfa59687a'; 

function hexToString ($h) {
  $r = "";
 for ($i= (substr($h, 0, 2)=="0x")?2:0; $i<strlen($h); $i+=2) {$r .= chr (base_convert (substr ($h, $i, 2), 16, 10));}
return $r;
}

echo mcrypt_decrypt(MCRYPT_DES, $key,hexToString('0x28dba02eb5f6dd476042daebfa59687a'), MCRYPT_MODE_ECB);

输出将是:hello world

这种方法可以正常工作,但是,您应该搜索另一种方法来加密您的数据,在您的脚本中,密钥 (12345678) 和您的加密方法对所有人可见。