You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP 7.2中mcrypt无法使用怎么办?求解决方案或替代方法

解决PHP 7.2中mcrypt无法使用的问题

首先得明确:PHP 7.2已经彻底移除了mcrypt扩展,这就是你看到MCRYPT_RIJNDAEL_128未定义警告的核心原因——这个常量和所有mcrypt相关函数都从PHP核心中被删掉了,官方早在PHP 7.1就标记mcrypt为废弃状态,因为它的维护早已停止,安全性远不如现代加密库。

下面给你两种可行的处理方案,优先推荐第一种:

方案一:迁移到OpenSSL扩展(推荐)

OpenSSL是PHP默认启用的核心扩展,安全性更高、维护更活跃,完全可以替代mcrypt实现AES加密解密。下面是针对AES-128(对应原来的MCRYPT_RIJNDAEL_128)的替代代码示例:

加密示例

function aes_encrypt($data, $key, $iv) {
    // 确保密钥长度符合AES-128要求(16字节)
    $key = substr($key, 0, 16);
    // OpenSSL的AES-128-CBC对应MCRYPT_RIJNDAEL_128 + CBC模式
    $encrypted = openssl_encrypt(
        $data,
        'AES-128-CBC',
        $key,
        OPENSSL_RAW_DATA,
        $iv
    );
    // 转成base64方便存储传输,和mcrypt的输出格式对齐
    return base64_encode($encrypted);
}

解密示例

function aes_decrypt($encryptedData, $key, $iv) {
    $key = substr($key, 0, 16);
    $encryptedData = base64_decode($encryptedData);
    $decrypted = openssl_decrypt(
        $encryptedData,
        'AES-128-CBC',
        $key,
        OPENSSL_RAW_DATA,
        $iv
    );
    // 兼容mcrypt的零填充,去除末尾空字符
    return rtrim($decrypted, "\0");
}

关键注意点:

  • 确保$iv的长度是16字节(和AES-128匹配),和你原来mcrypt代码中的iv保持一致
  • 如果原来的mcrypt用了ECB模式,可对应调整OpenSSL参数为AES-128-ECB,但ECB模式不安全,建议改用CBC
  • OpenSSL默认用PKCS7填充,而mcrypt默认是零填充,所以解密后需要用rtrim($decrypted, "\0")去除多余空字符

方案二:强行安装mcrypt扩展(不推荐)

如果因为历史代码包袱必须使用mcrypt,也可以尝试安装,但要注意:

  • 该扩展已停止维护,存在明确安全风险
  • 在PHP 7.2+版本中安装需要额外操作:
    1. 从PECL获取对应PHP版本的mcrypt源码
    2. 编译安装扩展,或者在XAMPP中找到支持PHP7.2的mcrypt DLL文件,配置到php.ini中
  • 即使安装成功,未来PHP版本会彻底淘汰该扩展,长远来看还是得迁移到OpenSSL

警告: 继续使用mcrypt会带来安全隐患,官方强烈建议迁移到OpenSSL或其他现代加密库。

内容的提问来源于stack exchange,提问作者Rohan Parkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:39:03