【问题标题】:How to remove mcrypt functions in php如何在 php 中删除 mcrypt 函数
【发布时间】:2018-06-17 18:34:01
【问题描述】:

mcrypt 模块在 PHP 7.1 中已弃用,因此我必须使用 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);
}

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

【问题讨论】:

标签: php encryption openssl mcrypt encryption-symmetric


【解决方案1】:

我终于找到了解决方案 - 感谢大家的帮助和支持,将我推向正确的方向并提出正确的问题。我错过的主要事情是 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);
}

【讨论】:

  • 对于对称加密,应该使用OPENSSL_ZERO_PADDING 标志而不是OPENSSL_NO_PADDING(与预期相反,OPENSSL_ZERO_PADDING 不启用零填充,但禁用填充) . OPENSSL_NO_PADDING 是为非对称加密定义的,其值为 3,因此除了OPENSSL_ZERO_PADDING(值为 2)之外,还会无意设置OPENSSL_RAW_DATA(值为 1)在对称加密的背景下。通常这会导致 unexpected 结果(这里没有问题,因为无论如何都设置了OPENSSL_RAW_DATA)。
猜你喜欢
  • 2011-05-08
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 2023-03-03
  • 1970-01-01
  • 2019-07-12
  • 2019-07-14
相关资源
最近更新 更多