当前位置: 首页 > 知识库问答 >
问题:

如何移除php中的mcrypt函数

姚嘉容
2023-03-14

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 openssl_encrypt,并OPENSSL_ZERO_PADDING问题

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个答案

林俭
2023-03-14

最后我找到了解决办法——谢谢你们的帮助和支持,把我推向了正确的方向,问了正确的问题。我错过的主要是欧洲央行模式(我选了中央银行…)。所以所有与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);
}
 类似资料:
  • 所以随着时间的推移,mcrypt将在PHP 7.2中使用。当然还有一个替代方案:openssl。 我发现很难从 mcrypt 切换到开放,使用 AES 256 CBC 并保留 IV。我对密码学有点陌生,所以我并不真正了解一切,但我了解基础知识。 假设我有下面的代码 如何“转换”此代码以使用开放sl而不是mcrypt?

  • 问题内容: 因此,随着时间的推移,mcrypt将在PHP 7.2中使用。当然,还有一种选择:openssl。 我发现很难使用AES 256 CBC和保留IV从mcrypt切换到openssl。我对密码学有点陌生,所以我并不是真的一无所知,但我了解一些基础知识。 假设我有以下代码 我如何“转换”此代码以使用由mcrypt插入的openssl? 问题答案: 您无法进行转换,因为Rijndael-256

  • 我试图学习各种加密方法,在尝试使用Perl和PHP生成密文时遇到了一个问题。 如果我用PHP加密一个秘密,我可以用PHP和Perl解密得到的密文,但是如果我用Perl加密密文,密文是“错误的”,并且这个秘密会被PHP和Perl弄乱。。。 加密。php: decrypt.php: 加密。pl: 解密。pl: 这是我得到的输出: 如你所见即使有相同的秘密钥匙 提前感谢。

  • 我安装laravel通过作曲家,但当运行的网站它给一个错误 我也安装了php5-mcrypt,但错误仍然存在。

  • 我曾有意把检查程序执行和修复错误分割开来,但是当然,调试也意味着移除 bug。理想状况下,当你完美的发现了错误以及它的修复方法时,你会对代码有完美的理解,并且有一种顿悟(啊哈!)的感觉。但由于你的程序会经常使用其他不具有可视性的、没有一致性注释的系统(比如第三方库),所以完美是不可能的。在其他情况下,可能代码是如此的复杂以至于你的理解可能并不完美。 在修复 bug 时,你可能想要做最小的改变来修复

  • 我需要向Kafka的特定主题发送消息。我使用以下KafkaTemplate来实现这一点:KafkaTemplate 以下参数放在Kafka生产者中: 创建生产者: 当我执行“发送”方法时,我有一条消息发送到Kafka主题,但同时我发送了标头,其中包含请求的DTO文件的路径。 偏移资源管理器中的示例标头 由于这个标题,应用程序中出现了一些问题,这是一个消费者,我对此无能为力。有没有办法从查询中删除此