PHP实现3DES(ECB模式)加密

最近公司项目需要用php对数据进行3des加密,输入输出为十六进制。网上的方法大部分都是基于mcrypt扩展库,php7开始已经废弃,所以使用openssl扩展进行加密。贴上代码记录一下,ECB模式:

class ThreeDesUtil
{
    private static $Algorithm = 'DES-EDE3';//定义加密算法

    /**
     * 创建密钥,长度为24字节
     * @param $key
     * @return bool/string
     */
    static function createKeyBytes($key){
        $dest='';
        $temp=self::hexStringToBytes($key);
        try{
            if(strlen($temp)<24){
                $dest=substr($temp,0,strlen($temp));
                $dest.=substr($temp,0,24-strlen($temp));
            }
        }catch (Exception $exception){
            $exception->getTrace();
        }
        return $dest;
    }

    /**
     * 加密,ecb模式
     * @param $key  密钥
     * @param $src  被加密的数据缓冲区(明文)  十六进制
     * @return null|string  加密后的密文  十六进制
     */
    public static function encryptMode($key, $src){
        try{
            if(!is_null($src)&&!is_null($key)){
                $result = openssl_encrypt(
                    self::hexStringToBytes($src),
                    self::$Algorithm,
                    self::createKeyBytes($key),
                     OPENSSL_NO_PADDING,
                    ''
                );
                return self::convertByteToHexString($result);
            }else{
                return 'KEY/内容为空';
            }
        }catch (Exception $exception){
            $exception->getTrace();
        }
        return null;
    }

    /** 解密,ecb模式
     * @param $key 加密使用的密钥
     * @param $src 加密后的密文  十六进制
     * @return string 解密后的明文  十六进制
     */
    public static function decryptMode($key,$src){
        try{
            if(!is_null($src)&&!is_null($key)){
                $result=openssl_decrypt(self::hexStringToBytes($src),
                    self::$Algorithm,
                    self::createKeyBytes($key),
                    OPENSSL_NO_PADDING,
                    '');
                return self::convertByteToHexString($result);
            }else{
                return 'KEY/内容为空';
            }
        }catch (Exception $exception){
            $exception->getTrace();
        }
    }
    private static function hexStringToBytes($hexString){
        $len=strlen($hexString);
        $buf='';
        $i=0;
        $j=0;
        if(($len%2)==1){
            $buf[$j++]=chr(self::fromDigit($hexString[$i++]));
        }
        while ($i<$len){
            $buf[$j++]=chr((self::fromDigit($hexString[$i++])<<4)|self::fromDigit($hexString[$i++]));
        }
        return implode($buf);
    }
    private static function convertByteToHexString($bytes){
        $result='';
        for ($i=0;$i= ord('0') && ord($ch)<= ord('9')) {
            return ord($ch) - ord('0');
        }
        if (ord($ch) >= ord('A') && ord($ch) <= ord('F')) {
            return ord($ch) - ord('A') + 10;
        }
        if (ord($ch) >= ord('a') && ord($ch) <= ord('f')) {
            return ord($ch) - ord('a') + 10;
        }
        throw new InvalidArgumentException('invalid hex digit:'.$ch);
    }
}

echo ThreeDesUtil::encryptMode('010203040506070818082322380201F2','A1A2A3A4A5A6A7AF');
//echo ThreeDesUtil::decryptMode('010203040506070818082322380201F2','19BD70BCF1855728');

得到结果和工具测试结果一样。加密结果为:19bd70bcf1855728

你可能感兴趣的:(php)