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);
}
}
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
2025年10月新盘 做第一批吃螃蟹的人coinsrore.com
新车新盘 嘎嘎稳 嘎嘎靠谱coinsrore.com
新车首发,新的一年,只带想赚米的人coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
做了几十年的项目 我总结了最好的一个盘(纯干货)coinsrore.com
新车上路,只带前10个人coinsrore.com
新盘首开 新盘首开 征召客户!!!coinsrore.com
新项目准备上线,寻找志同道合 的合作伙伴coinsrore.com
新车即将上线 真正的项目,期待你的参与coinsrore.com
新盘新项目,不再等待,现在就是最佳上车机会!coinsrore.com
新盘新盘 这个月刚上新盘 新车第一个吃螃蟹!coinsrore.com
新盘 上车集合 留下 我要发发 立马进裙coinsrore.com
独特的构思和新颖的观点,让这篇文章在众多作品中脱颖而出。
情感真挚,直击人心,引发强烈共鸣。
跨界融合的尝试为文章注入新鲜活力。
结论升华部分可联系更高维度价值观。
内容的丰富性和深度让人仿佛置身于知识的海洋,受益匪浅。