16

自 PHP 7.1.0 起,Mcrypt 函数已被弃用。

我不推荐使用的字符串编码/解码函数:

$key: secret key
$str: string


$encoded = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $str, MCRYPT_MODE_CBC, md5(md5($key))));

$decoded = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($str), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

你能推荐一些替代品吗?

4

5 回答 5

18

您应该改用openssl_encrypt

于 2017-01-19T11:43:54.467 回答
1

考虑使用defuseRNCryptor,它们提供了完整的解决方案,正在维护并且是正确的。

于 2017-01-19T12:10:35.087 回答
1
echo encrypt_openssl($str, $key);

function encrypt_openssl($msg, $key, $iv = null) {
        $iv_size = openssl_cipher_iv_length('AES-256-CBC');
        if (!$iv) {
            $iv = openssl_random_pseudo_bytes($iv_size);
        }
        $encryptedMessage = openssl_encrypt($msg, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
        return base64_encode($iv . $encryptedMessage);
    }

mcrypt可能会在 PHP 7.1 替代openssl中被移除

于 2019-05-29T06:48:33.857 回答
1

因为MCRYPT_RIJNDAEL_256我在这里发布了 PHP7.3 的完整答案:https ://stackoverflow.com/a/53937314/243782

片段:

像这样与phpseclib库一起工作

$rijndael = new \phpseclib\Crypt\Rijndael(\phpseclib\Crypt\Rijndael::MODE_ECB);
$rijndael->setKey(ENCRYPT_KEY);
$rijndael->setKeyLength(256);
$rijndael->disablePadding();
$rijndael->setBlockLength(256);

$decoded = $rijndael->decrypt($term);
于 2018-12-26T21:33:54.917 回答
-2

如上所述,open_ssl 是 mcrypt 的一个很好的替代方案。我对 open_ssl 的唯一问题是它不能用于大字符串。

我写了一个脚本(静态类),它克服了这个问题(大字符串被分成块并在后台分别加密/解密)。

见公开要点: https ://gist.github.com/petermuller71/33616d55174d9725fc00a663d30194ba

于 2017-11-22T09:27:38.200 回答