Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在php中删除mcrypt函数_Php_Encryption_Openssl_Mcrypt_Encryption Symmetric - Fatal编程技术网

如何在php中删除mcrypt函数

如何在php中删除mcrypt函数,php,encryption,openssl,mcrypt,encryption-symmetric,Php,Encryption,Openssl,Mcrypt,Encryption Symmetric,PHP7.1中不推荐使用mcrypt模块,因此我必须用openssl函数重构旧的加密/解密函数。事实上,我没有办法这么做 我的主要问题是:脚本仍然必须能够解密现有的加密数据。我没有机会用我的函数解密并用新函数重新加密数据 以下是我现有的代码: function _encrypt($cleartext, $key = "th1s1sav3rys3cr3tk3y") { if ($cleartext) { $td = mcrypt_module_open(MCRYPT_TripleDES

PHP7.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,我使用了与旧函数中相同的代码,并尝试以这里描述的方式实现它:


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

我终于找到了解决办法——感谢大家的帮助和支持,把我推向正确的方向,提出正确的问题。我错过的主要是欧洲央行模式(我选择了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);
}

您实际要加密的是哪种数据?密码,个人用户数据?你不是用谷歌搜索的吗?这里有一些替代方案,您也可以在堆栈中找到一些。该手册还指出,此功能的替代方案包括:@GrumpyCrouton:数据是文本片段。uhhh,如果您希望复制3DE,可能不应该使用完全不同的算法。提示:查看的注释,因为它们回答了这个确切的问题。请参见、等。另请参见,对于对称加密,应使用
OPENSSL\u零填充
标志,而不是
OPENSSL\u无填充
(与预期相反,
OPENSSL\u零填充
不启用零填充,但禁用填充)
OPENSSL\u无填充
是为非对称加密定义的,其值为3,因此在对称加密的上下文中,除了
OPENSSL\u零填充
(值为2)之外,还会无意中设置
OPENSSL\u原始数据
(值为1)。通常,这会导致意外的结果(这里没有问题,因为
OPENSSL\u RAW\u DATA
已设置)。
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);
}