【发布时间】: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);
}
希望你能给我一些好的提示。
【问题讨论】:
-
您实际上要加密什么样的数据?密码、个人用户数据?
-
你不是用谷歌搜索的吗?有替代品,您还可以在 Stack 上找到一些替代品。该手册还指出 此功能的替代方案包括:random_bytes()
-
@GrumpyCrouton:数据是文本 sn-ps。
-
呃,如果您要复制 3DES,也许您不应该使用完全不同的算法。提示:查看
openssl_encrypt()的 cmets,因为他们回答了这个确切的问题。 -
见Use openssl_encrypt to replace Mcrypt for 3DES-ECB encryption、Can't decrypt using pgcrypto from AES-256-CBC but AES-128-CBC is OK、MCrypt rijndael-128 to OpenSSL aes-128-ecb conversion等。另见Upgrading my encryption library from Mcrypt to OpenSSL、Replace Mcrypt with OpenSSL和Preparing for removal of Mcrypt in PHP 7.2
标签: php encryption openssl mcrypt encryption-symmetric