PHP& JS mcrypt解密不起作用

时间:2017-01-19 22:56:01

标签: javascript php encryption mcrypt des

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

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

DtoUtils

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

getClientPrefenceByEntityAndAttributeAsList

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

2 个答案:

答案 0 :(得分:1)

解密字符串的方法无法正常工作,请尝试以下方法:

$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)和您的加密方法对每个人都可见。

答案 1 :(得分:0)

使用块密码(如DES或AES)加密的数据必须是块大小的精确倍数。解决方案是为要加密的数据添加填充,PKCS#5填充是DES的常用填充,可能是Javascript的默认填充。不幸的是,mcrypt不支持PKCS#5填充,只支持非标准的零填充。

潜在的解决方案:

  1. 使用比mcrypt更好的加密功能,请参阅问题的评论。
  2. 在Javascript中指定无填充并手动添加零填充。
  3. 在mcrypt中指定无填充并手动删除填充。
  4. 最好是指定所有选项,不要依赖默认值。