代码之家  ›  专栏  ›  技术社区  ›  CarlosAllende

PHP&JS mcrypt解密不起作用

  •  1
  • CarlosAllende  · 技术社区  · 9 年前

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

    2 回复  |  直到 9 年前
        1
  •  1
  •   rescobar    9 年前

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

    $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);
    

    输出将为: 你好,世界

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

        2
  •  0
  •   zaph    9 年前

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

    潜在解决方案:

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

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

    推荐文章