PHP实现3DES_ECB+ZEROPADDING加解密

  • 这里使用openssl_encrypt函数,针对PHP7.1以上版本,其中3DES-ECB被包含于DES-EDE3
  • 密钥和密文都是十六进制,返回的结果也是十六进制
  • 本文参考了博客https://blog.csdn.net/longke173/article/details/83381104,在源博客进行修改,增加对密文进行ZEROPADDING(即不是8的倍数,补0到8的倍数),感谢博主提供此博文
  • 下面是代码
<?php

class Crypt3DesEcb
{

    public static function create()
    {
        return new self();
    }

    /**
     * @param $ch
     * @return int
     */
    protected function fromDigit($ch)
    {
        if (ord($ch) >= 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;
        }
        ErrorHandler::throwMessageByErrorCode(ErrorCode::INVALID_HEX_DIGIT);
    }

    /**
     * @param $hexString
     * @return string
     */
    protected function hexStringToBytes($hexString)
    {
        $len = strlen($hexString);
        $buf = [];
        $i = 0;
        $j = 0;
        if (($len % 2) == 1) {
            $buf[$j++] = chr($this->fromDigit($hexString[$i++]));
        }
        while ($i < $len) {
            $buf[$j++] = chr(($this->fromDigit($hexString[$i++]) << 4) | $this->fromDigit($hexString[$i++]));
        }
        return implode($buf);
    }

    /**
     * @param $key
     * @return bool|string
     */
    protected function createKeyBytes($key)
    {
        $temp = $this->hexStringToBytes($key);
        $dest = $temp;
        if (strlen($temp) < 24) {
            $dest = substr($temp, 0, strlen($temp));
            $dest .= substr($temp, 0, 24 - strlen($temp));
        }
        return $dest;
    }

    /**
     * @param $bytes
     * @return string
     */
    protected function convertByteToHexString($bytes)
    {
        $result = '';
        for ($i = 0; $i < strlen($bytes); $i++) {
            $temp = ord($bytes[$i]) & 0xff;
            $tempHex = dechex($temp);
            if (strlen($tempHex) < 2) {
                $result .= '0' . $tempHex;
            } else {
                $result .= $tempHex;
            }
        }
        return strtoupper($result);
    }

    /**
     * @param $hexString
     * @return string
     */
    protected function zeroPadding($hexString)
    {
        $len = strlen($hexString);
        if ($len % 16 != 0) { //不是8的倍数,补0到是8的倍数
            $hexString = str_pad($hexString, $len + 16 - $len % 16, 0);
        }
        return $hexString;
    }

    /**
     * 加密
     * @param string $key 十六进制
     * @param string $hexString 十六进制
     * @return string
     */
    public function encrypt($key, $hexString)
    {
        $result = openssl_encrypt(
            $this->hexStringToBytes($this->zeroPadding($hexString)),
            'DES-EDE3',
            $this->createKeyBytes($key),
            OPENSSL_NO_PADDING,
            ''
        );
        return $this->convertByteToHexString($result);
    }

    /**
     * 解密
     * @param string $key 十六进制
     * @param string $hexString 十六进制
     * @return string
     */
    public function decrypt($key, $hexString)
    {
        $result = openssl_decrypt(
            $this->hexStringToBytes($this->zeroPadding($hexString)),
            'DES-EDE3',
            $this->createKeyBytes($key),
            OPENSSL_NO_PADDING,
            '');
        return $this->convertByteToHexString($result);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值