【问题标题】:PHP & JS mcrypt decryption not workingPHP & JS mcrypt 解密不工作
【发布时间】:2017-06-04 19:51:36
【问题描述】:

我在 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、更改编码、更改十六进制解码等,但它总是出现乱码,有时是不可读的字符,有时是可读但无意义的。

【问题讨论】:

  • 最好不要使用mcrypt,它已经废弃了近十年了。因此,它已被弃用,并将在 PHP 7.2 中从核心中移除并进入 PECL。它不支持标准 PKCS#7 (née PKCS#5) 填充,仅支持甚至不能用于二进制数据的非标准空填充。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。请考虑使用 defuseRNCryptor,它们提供了完整的解决方案,正在维护并且是正确的。
  • 不要使用 DES,它不安全,已经被 AES 取代。不要使用 ECB 模式,它不安全,请参阅ECB mode,向下滚动到 Penguin。而是使用带有随机IV的CBC模式,只需在加密数据前加上IV用于解密即可,它不需要不保密。
  • 您需要从十六进制编码字符串中删除“0x”(实际上,我会尝试完全从十六进制切换到base64)。

标签: javascript php encryption mcrypt des


【解决方案1】:

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

可能的解决方案:

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

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

【讨论】:

    【解决方案2】:

    解密字符串的方式不正常,试试这个:

    $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),并且您的加密方法对所有人都是可见的。

    【讨论】:

    • 谢谢,我最终改用了公钥/私钥加密。我的计划是在 PHP 会话中使用临时密钥集,每小时更改一次。
    猜你喜欢
    • 2013-01-20
    • 2014-09-12
    • 2014-02-06
    • 2017-01-03
    • 2017-07-27
    • 2011-12-26
    • 1970-01-01
    • 2014-02-01
    • 2011-01-24
    相关资源
    最近更新 更多