PHP版DES算法加密数据(3DES)另附openssl_encrypt版本
PHP版DES算法加密数据(3DES)
可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容

- <?php
- /**
- * Created by PhpStorm.
- * Title:PHP版DES加解密类
- * 可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容
- * User: yaokai
- * Date: 2017/11/13 0013
- * Time: 19:03
- */
- namespace App\Http\Libs;
- class Des
- {
- private static $_instance = NULL;
- var $key;//秘钥向量
- var $iv;//混淆向量 ->偏移量
- function __construct()
- {
- $this->key = env('DES_KEY');
- $this->iv = env('DES_IV');
- }
- /**
- *
- * @User yaokai
- * @return Des|null
- */
- public static function share()
- {
- if (is_null(self::$_instance)) {
- self::$_instance = new Des();
- }
- return self::$_instance;
- }
- /**
- * 加密算法
- * @User yaokai
- * @param $input 要加密的数据
- * @return string 返回加密后的字符串
- */
- function encrypt($input)
- {
- //获得加密算法的分组大小 8
- $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC); //3DES加密将MCRYPT_DES改为MCRYPT_3DES
- //ascii 填充
- $input = $this->pkcs5_pad($input, $size); //如果采用PaddingPKCS7,请更换成PaddingPKCS7方法。
- //用0填充秘钥为指定长度8
- $key = str_pad($this->key, 8, '0'); //3DES加密将8改为24
- //打开算法和模式对应的模块
- $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC, '');
- //判断混淆向量是否为空
- if ($this->iv == '') {
- //从算法源随机生成混淆向量
- $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);//类似b"¨ß^\f\x1EÅ╩5"
- } else {
- //反之取设置的混淆向量
- $iv = $this->iv;
- }
- //初始化加密所需的缓冲区
- @mcrypt_generic_init($td, $key, $iv);
- //加密数据 $td为算法对象模块 $input为处理过后的值
- $data = mcrypt_generic($td, $input);// 类似b"ýyP\x7FN\x00èiÝd>À?s\x18Î"
- //对加密模块进行清理工作
- mcrypt_generic_deinit($td);
- //关闭加密模块
- mcrypt_module_close($td);
- //使用 MIME base64 对数据进行编码
- $data = base64_encode($data);//如需转换二进制可改成 bin2hex 转换
- //如果设置了混淆向量 则加密的值是固定的 如果没设置混淆向量 则加密的值是随机的
- return $data;
- }
- /**
- * 解密算法
- * @User yaokai
- * @param $encrypted 加密后的字符串
- * @return bool|string
- */
- function decrypt($encrypted)
- {
- //对使用 MIME base64 编码的数据进行解码
- $encrypted = base64_decode($encrypted); //如需转换二进制可改成 bin2hex 转换
- //使用另一个字符串填充字符串为指定长度 获取秘钥
- $key = str_pad($this->key, 8, '0'); //3DES加密将8改为24
- //打开算法和模式对应的模块
- $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC, '');//3DES加密将MCRYPT_DES改为MCRYPT_3DES
- //判断混淆向量是否为空
- 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);//DES 8 3DES 24
- //初始化加密所需的缓冲区
- @mcrypt_generic_init($td, $key, $iv);
- //解密数据 $td为算法对象模块 $encrypted为需要解密的数据
- $decrypted = mdecrypt_generic($td, $encrypted);//类似于 "15549070665\x05\x05\x05\x05\x05" 之前加密的数据
- //对加密模块进行清理工作
- mcrypt_generic_deinit($td);
- //关闭加密模块
- mcrypt_module_close($td);
- //返回取出解密数据
- $data = $this->pkcs5_unpad($decrypted);
- return $data;
- }
- /**
- * 填补需加密的字符串
- * PKCS7Padding VS PKCS5Padding
- * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
- * @User yaokai
- * @param $text
- * @param $blocksize
- * @return string
- */
- function pkcs5_pad($text, $blocksize)
- {
- //$pad=5 blocksize=11 $test=8 %取余
- $pad = $blocksize - (strlen($text) % $blocksize);//5
- //返回ascii填补后的字符串, 类似 "15549070665\x05\x05\x05\x05\x05"
- return $text . str_repeat(chr($pad), $pad);
- }
- /**
- * 去除加密填补的字符串
- * PKCS7Padding VS PKCS5Padding
- * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
- * @User yaokai
- * @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);
- }
- /**
- * 填补需加密的字符串
- * PKCS7Padding VS PKCS5Padding
- * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
- * @User yaokai
- * @param $text
- * @param $blocksize
- * @return string
- */
- function PaddingPKCS7($data)
- {
- $block_size = mcrypt_get_block_size(MCRYPTDES, MCRYPT_MODE_CBC);//3DES加密将MCRYPT_DES改为MCRYPT_3DES
- $padding_char = $block_size - (strlen($data) % $block_size);
- $data .= str_repeat(chr($padding_char), $padding_char);
- return $data;
- }
- /**
- * 去除加密填补的字符串
- * PKCS7Padding VS PKCS5Padding
- * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
- * @User yaokai
- * @param $text
- * @return bool|string
- */
- private function UnPaddingPKCS7($text)
- {
- $pad = ord($text{strlen($text) - 1});
- if ($pad > strlen($text)) {
- return false;
- }
- if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
- return false;
- }
- return substr($text, 0, -1 * $pad);
- }
- }

由于php7.1废弃了mcrypt_* 一系列函数 所以采用 openssl版本

- /**
- * des3加密
- * @author bug <375023402@qq.com>
- * @createtime 2019-04-17 17:30:53
- * @param $str 要加密的数据
- * @param $des_key 秘钥向量
- * @param $des_iv 混淆向量 ->偏移量
- * @return
- */
- if(!function_exists('des3_encrypt')){
- function des3_encrypt($str,$des_key="",$des_iv="")
- {
- return base64_encode(openssl_encrypt($str, 'des-ede3-cbc', $des_key, OPENSSL_RAW_DATA, $des_iv));
- }
- }

PHP版DES算法加密数据(3DES)另附openssl_encrypt版本的更多相关文章
- PHP版DES算法加密数据
php7之后的版本 php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被废弃并且被 OpenSSL 所取代. 从PHP 7.2起它将被从核心代码中移除并且移到PECL中.PHP手 ...
- 分组密码(三)DES 算法— 密码学复习(六)
在介绍完Feistel结构之后,接下来进入到著名的DES算法. 6.1 DES算法的意义 在正式介绍DES之前,首先介绍几个重要的历史时间节点. ① 1973年,美国国家标准局(NBS)向社会公开征集 ...
- DES 算法的 C++ 与 JAVA 互相加解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Asp.Net 常用工具类之加密——对称加密DES算法(2)
又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...
- AES算法,DES算法,RSA算法JAVA实现
1 AES算法 1.1 算法描述 1.1.1 设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...
- Web安全学习笔记之DES算法实例详解
转自http://www.hankcs.com/security/des-algorithm-illustrated.html 译自J. Orlin Grabbe的名作<DES Algorith ...
- DES算法解析
DES算法 美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告. 1977年1月,美国 ...
- DES算法实现
概述(团队项目) DES是一个分组加密算法,它以64位为分组对数据加密.同时DES也是一个对称算法:加密和解密用的是同一个算法.DES是一个包含16个阶段的"替换–置换"的分组加密 ...
- 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
随机推荐
- Java第二十二天,异常
异常 程序在执行过程中,出现的非正常的情况,最终会导致JVM非正常停止. 注意: 在Java等面向对象编程语言当中,异常本身是一个类,产生异常的本质就是抛出一个异常对象.Java对异常采取中断处理方式 ...
- 37.1 net-- udp传输
一.打开接收端 package day35_net_网络编程.udp传输; import java.io.IOException; import java.net.*; /* * 使用UDP协议接收数 ...
- mysql导出
--all-databases , -A 导出全部数据库. mysqldump -uroot -p --all-databases --all-tablespaces , -Y 导出全部表空间. my ...
- CH5701 开车旅行(倍增dp+set)
传送门 解题思路: 一道比较有趣的题,解题工作主要分为两块: ①找出k(k=0表示小A先走,k=1表示小B先走,下面同理)从点i出发下一个到达的点to[k][i]; 一开始偷懒用了vector(偷懒一 ...
- 虚拟机安装windows sever2008
1.打开并进行新建虚拟机 2.默认选择“典型” 3.选择“安装程序盘映像文件”,并‘浏览’选择本地的文件 4. 5.后面的默认选择即可,安装路径可自己修改 6.这一步的磁盘大小可自己修改的,这里先预设 ...
- Keepalived实现Nginx负载均衡高可用
第一章:keepalived介绍 VRRP协议 目的就是为了解决静态路由单点故障问题的 第二章: keepalived工作原理 2.1 作为系统网络服务的高可用功能(failover) keepali ...
- 09-sass
一.sass和scss sass最初是为了配合haml设计的,不需要大括号,用tab缩进 从第三代开始,保留缩进风格,完全向下兼容普通的css代码 二.下载配置sass compass是sass的一个 ...
- Mac 窗口管理软件 Spectacle
我个人使用的窗口管理软件是 Magnet(本人在 Mac 下付费的首款软件,记得是 6 元~),今天为大家介绍一款类似的开源软件. 简介 Spectacle 是一款可以快速调整窗口大小与位置的开源软件 ...
- notepad++批量每行加字符
移动光标到头 选择正则 输入^ 下面输入需要加的文本. 点替换
- Linux安装PHP的Redis扩展(已安装Redis)
1.下载需要的php操作redis的扩展包 下载地址 http://pecl.php.net/package/redis 下载对应php版本,我的php版本为7.3,下载的是最新的版本5.0.2 ...