使用openssl 来替代mcrypt的3DES 加解密方案

2019/03/28 PHP

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法

题记

最近工作中跨平台对接用到了加密算法,本以为加密算法会很简单,但寻觅许久发现大多轮子和对方加密结果并不一致,而且大多使用的是php5的扩展 mcryp,在 php7 中早已经废弃了。于是乎有了这篇文章。

为什么要使用加密算法

数据的安全性越来越得以重视。举个例子说,保存在数据库中的用户密码并不是明文保存的,而是采用md5加密后存储,这样即使数据库被脱库,仍能保证用户密码安全。但是,md5是不可逆的,开发人员根本就不知道用户的密码到底是什么。有些时候,我们希望加密后存储的数据是可逆的,比如一些接口密钥,这样即使数据库被脱库,如果没有对应的解密方式,攻击者盗取的密钥也是不能使用的。

参考

  1. ci里怎么使用3des加密

代码

鉴于7.1废弃了mcrypt库,建议使用openssl_encryptopenssl_decrypt进行加密解密

class ThreeDes {
    //加密秘钥,
    private $_key;
    private $_iv;
    public function __construct($key, $iv)
    {
        $this->_key = $key;
        $this->_iv = $iv;
    }

    /**
     * ------------------------------------------------------
     * 加密
     * @param $message
     * author: SongTao
     * ------------------------------------------------------
     */
    public function encrypt($message)
    {
        $message_padded = $message;
        if (strlen($message_padded) % 8) {
            $message_padded = str_pad($message_padded,
                strlen($message_padded) + 8 - strlen($message_padded) % 8, "\0");
        }
        $encrypted_mcrypt = mcrypt_encrypt(MCRYPT_3DES, $this->_key,
            $message, MCRYPT_MODE_CBC, $this->_iv);
        $encrypted_openssl = openssl_encrypt($message_padded, "DES-EDE3-CBC",
            $this->_key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $this->_iv);

        return bin2hex($encrypted_openssl);
        // printf("%s => %s\n", bin2hex($message), bin2hex($encrypted_mcrypt));
        // printf("%s => %s\n", bin2hex($message_padded), bin2hex($encrypted_openssl));
        // die;
    }

    /**
     * ------------------------------------------------------
     * 解密
     * @param $message
     * @return string
     * author: SongTao
     * ------------------------------------------------------
     */
    public function decrypt($message) {
        $encrypted_openssl = pack("H*", $message);
        $message_padded = openssl_decrypt($encrypted_openssl, "DES-EDE3-CBC",
            $this->_key, OPENSSL_RAW_DATA | OPENSSL_NO_PADDING, $this->_iv);
        $message_padded = rtrim(rtrim($message_padded, chr(0)), chr(7));
        return $message_padded;
    }

}

Search

    Post Directory