class TripleDES{

    private static $_instance = NULL;
    private $key;
    private $iv;
    public function __construct()
    {
        $key = '8720003853291264';
        $this->key = pack('H*', $key);
        $this->iv = pack('H*', '0000000000000000');
    }
    /**
     *
     * @return Crypt3Des|null
     */
    public static function share($config)
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new Crypt3Des($config);
        }
        return self::$_instance;
    }
    /**
     * 加密算法
     * @param $input 要加密的数据
     * @return string 返回加密后的字符串
     */
    function encrypt($input, $type='bin2hex')
    {
        @$size = mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_ECB);
        $input = $this->pkcs5_pad($input, $size);
        $key = $this->key;
        @$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
        if ($this->iv == '') {
            $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        } else {
            $iv = $this->iv;
        }
        @mcrypt_generic_init($td, $key, $iv);
        @$data = mcrypt_generic($td, $input);
        @mcrypt_generic_deinit($td);
        @mcrypt_module_close($td);
        if ($type === 'bin2hex')
        {
            $data = bin2hex($data);
        }else{
            $data = base64_encode($data);
        }
        return $data;
    }
    /**
     * 解密算法
     * @param $encrypted 加密后的字符串
     * @return bool|string
     */
    function decrypt($encrypted)
    {
        //对使用 MIME base64 编码的数据进行解码
        $encrypted = hex2bin($encrypted); //如需转换二进制可改成 bin2hex 转换
        //使用另一个字符串填充字符串为指定长度 获取秘钥
        $key = $this->key;
        //打开算法和模式对应的模块
        $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
        //判断混淆向量是否为空
        if ($this->iv == '') {
            //从算法源随机生成混淆向量
            $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        } else {
            //反之取设置的混淆向量
            $iv = $this->iv;
        }
        //返回打开的模式所能支持的最长密钥
        $ks = mcrypt_enc_get_key_size($td);//3DES 24
        //初始化加密所需的缓冲区
        @mcrypt_generic_init($td, $key, $iv);
        //解密数据  $td为算法对象模块  $encrypted为需要解密的数据
        $decrypted = mdecrypt_generic($td, $encrypted);
        //对加密模块进行清理工作
        mcrypt_generic_deinit($td);
        //关闭加密模块
        mcrypt_module_close($td);
        //返回取出解密数据
        $data = $this->pkcs5_unpad($decrypted);
        return $data;
    }
    /**
     * 填补需加密的字符串
     * PKCS5Padding
     * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
     * @param $text
     * @param $blocksize
     * @return string
     */
    private function pkcs5_pad($text, $blocksize)
    {
        $pad = $blocksize - (strlen($text) % $blocksize);
        return $text . str_repeat(chr($pad), $pad);
    }
    /**
     * 去除加密填补的字符串
     * PKCS5Padding
     * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
     * @param $text
     * @return bool|string
     */
    function pkcs5_unpad($text)
    {
        //取出最后一个字符串 {15}   ord返回字符的 ASCII 码值
        $pad = ord($text{strlen($text) - 1});//5
        //判断$pad的值是否大于本身字符串
        if ($pad > strlen($text)) {
            //如果大于  则多余
            return false;
        }
        //计算ASCII 码值中全部字符都存在于$text字符集合中的第一段子串的长度是否等于取出的$pad
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
            //如果不相等  则缺失
            return false;
        }
        //返回字符串的子串
        return substr($text, 0, -1 * $pad);
    }

}

标签: none

已有 5 条评论

  1. 独特的构思和新颖的观点,让这篇文章在众多作品中脱颖而出。

  2. 情感真挚,直击人心,引发强烈共鸣。

  3. 跨界融合的尝试为文章注入新鲜活力。

  4. 结论升华部分可联系更高维度价值观。

  5. 内容的丰富性和深度让人仿佛置身于知识的海洋,受益匪浅。

添加新评论