php7 mcrypt ECB CBC AES加密替代方案 openssl_encrypt

PHP · ez · 于 2年前 发布 · 1109 次阅读

mcrypt

作为PHP 7.1.x 中废弃的特性之一,ext/mcrypt. mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。

如果懒得做兼容方案, 仍然可以通过PECL方式进行安装, 跟踪了一下这个库仍在在维护, 目前已经支持php8了. 安装地址: https://pecl.php.net/package/mcrypt

openssl_encrypt的坑

在做接口对接时, 一端加密且密钥是24位 ,另一端用的php7的 openssl_encrypt 同密钥来进行解密,发现解密不了。 资料显示openssl_encrypt 加密的密钥长度最高 16位; 超过16位的后面的不参与加密.

解密代码参考

<?php

class AES
{
   public static function encrypt($data, $key) {
       $data =  openssl_encrypt($data, 'aes-128-ecb', base64_decode($key), OPENSSL_RAW_DATA);
       return base64_encode($data);
   }
    public static function decrypt($data, $key) {
        $encrypted = base64_decode($data);
        return openssl_decrypt($encrypted, 'aes-128-ecb', base64_decode($key), OPENSSL_RAW_DATA);
    }
}

CBC 方式

<?php
class CBC
{
    public  function encrypt($data, $key, $iv)
    {
        return base64_encode(openssl_encrypt($data, "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv));
    }
    public  function decrypt($data, $key, $iv)
    {
        return openssl_decrypt(base64_decode($data), "AES-128-CBC", $key, OPENSSL_RAW_DATA, $iv);
    }
}

注意此方法对密钥密文做了base64的加密/解密的前置工作. 不需要的可以自行调整.

共收到 0 条回复
没有找到数据。
添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册