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

如何在php中删除mcrypt函数

  •  -3
  • Marco  · 技术社区  · 7 年前

    PHP 7.1中不推荐使用mcrypt模块,因此我必须用openssl函数重构旧的加密/解密函数。事实上,我没有办法这样做。

    我的主要问题是:脚本仍然必须能够解密现有的加密数据。我没有机会用我的函数解密,也没有机会用新函数重新加密数据!

    这是我现有的代码:

    function _encrypt($cleartext, $key = "th1s1sav3rys3cr3tk3y") {
      if ($cleartext) {
        $td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, "");
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, $key, $iv);
        $encrypted_data_raw = mcrypt_generic($td, $cleartext);
        $encrypted_data = bin2hex($encrypted_data_raw);        
        mcrypt_generic_deinit($td);
        return $encrypted_data;
      } else {
        return false;
      }
    }
    
    function _decrypt($crypttext, $key = "th1s1sav3rys3cr3tk3y") {
      if ($crypttext) {
        $td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, "");
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td, $key, $iv);
        $decrypted_data = trim(mcrypt_decrypt(MCRYPT_TripleDES, $key, hex2bin($crypttext), MCRYPT_MODE_ECB, $iv));
        mcrypt_generic_deinit($td);
        return $decrypted_data;
      } else {
        return false;
      }
    }
    

    更新: 这就是我尝试解决它的方式-为了得到相同的$iv,我只使用了与旧函数中相同的代码,并尝试以下面描述的方式实现它: php: mcrypt_encrypt to openssl_encrypt, and OPENSSL_ZERO_PADDING problems

    function _encrypt2($cleartext, $key = "th1s1sav3rys3cr3tk3y") {
        $td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, "");
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);        
        $message_padded = $cleartext;
        if (strlen($message_padded) % 8) {
            $message_padded = str_pad($message_padded,
            strlen($message_padded) + 8 - strlen($message_padded) % 8, "\0");
        }
        $encrypted_openssl = openssl_encrypt($message_padded, "DES-EDE3-CBC", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $iv);
        return bin2hex($encrypted_openssl);
    }
    

    我希望你能给我一些好的暗示。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Marco    7 年前

    最后,我终于找到了解决方案——感谢大家的帮助和支持,把我推向了正确的方向,提出了正确的问题。我错过的主要是ECB模式(我选择了CBC…)。所以所有的iv美元都不是真的需要。

    要在此处完成答案,请执行我的新功能:

    function _encrypt_openssl($cleartext, $key = "th1s1sav3rys3cr3tk3y") {
       if ($m = strlen($cleartext) %8) {
          $cleartext .= str_repeat("\0", 8-$m);
       } 
       $encrypted_openssl = openssl_encrypt($cleartext , "DES-EDE3-ECB", $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, null);
       return bin2hex($encrypted_openssl);
    }
    
    function _decrypt_openssl($crypttext, $key = "th1s1sav3rys3cr3tk3y") {
       return openssl_decrypt(hex2bin($crypttext), 'DES-EDE3-ECB', $key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, null);
    }
    
    推荐文章