PHP版DES算法加密数据(3DES)

可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Title:PHP版DES加解密类
  5. * 可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容
  6. * User: yaokai
  7. * Date: 2017/11/13 0013
  8. * Time: 19:03
  9. */
  10.  
  11. namespace App\Http\Libs;
  12.  
  13. class Des
  14. {
  15. private static $_instance = NULL;
  16. var $key;//秘钥向量
  17. var $iv;//混淆向量 ->偏移量
  18.  
  19. function __construct()
  20. {
  21. $this->key = env('DES_KEY');
  22. $this->iv = env('DES_IV');
  23. }
  24.  
  25. /**
  26. *
  27. * @User yaokai
  28. * @return Des|null
  29. */
  30. public static function share()
  31. {
  32. if (is_null(self::$_instance)) {
  33. self::$_instance = new Des();
  34. }
  35. return self::$_instance;
  36. }
  37.  
  38. /**
  39. * 加密算法
  40. * @User yaokai
  41. * @param $input 要加密的数据
  42. * @return string 返回加密后的字符串
  43. */
  44. function encrypt($input)
  45. {
  46. //获得加密算法的分组大小 8
  47. $size = mcrypt_get_block_size(MCRYPT_DES, MCRYPT_MODE_CBC); //3DES加密将MCRYPT_DES改为MCRYPT_3DES
  48. //ascii 填充
  49. $input = $this->pkcs5_pad($input, $size); //如果采用PaddingPKCS7,请更换成PaddingPKCS7方法。
  50. //用0填充秘钥为指定长度8
  51. $key = str_pad($this->key, 8, '0'); //3DES加密将8改为24
  52. //打开算法和模式对应的模块
  53. $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC, '');
  54. //判断混淆向量是否为空
  55. if ($this->iv == '') {
  56. //从算法源随机生成混淆向量
  57. $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);//类似b"¨ß^\f\x1EÅ╩5"
  58. } else {
  59. //反之取设置的混淆向量
  60. $iv = $this->iv;
  61. }
  62. //初始化加密所需的缓冲区
  63. @mcrypt_generic_init($td, $key, $iv);
  64. //加密数据 $td为算法对象模块 $input为处理过后的值
  65. $data = mcrypt_generic($td, $input);// 类似b"ýyP\x7FN\x00èiÝd>À?s\x18Î"
  66. //对加密模块进行清理工作
  67. mcrypt_generic_deinit($td);
  68. //关闭加密模块
  69. mcrypt_module_close($td);
  70. //使用 MIME base64 对数据进行编码
  71. $data = base64_encode($data);//如需转换二进制可改成 bin2hex 转换
  72. //如果设置了混淆向量 则加密的值是固定的 如果没设置混淆向量 则加密的值是随机的
  73. return $data;
  74. }
  75.  
  76. /**
  77. * 解密算法
  78. * @User yaokai
  79. * @param $encrypted 加密后的字符串
  80. * @return bool|string
  81. */
  82. function decrypt($encrypted)
  83. {
  84. //对使用 MIME base64 编码的数据进行解码
  85. $encrypted = base64_decode($encrypted); //如需转换二进制可改成 bin2hex 转换
  86. //使用另一个字符串填充字符串为指定长度 获取秘钥
  87. $key = str_pad($this->key, 8, '0'); //3DES加密将8改为24
  88. //打开算法和模式对应的模块
  89. $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_CBC, '');//3DES加密将MCRYPT_DES改为MCRYPT_3DES
  90. //判断混淆向量是否为空
  91. if ($this->iv == '') {
  92. //从算法源随机生成混淆向量
  93. $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  94. } else {
  95. //反之取设置的混淆向量
  96. $iv = $this->iv;
  97. }
  98. //返回打开的模式所能支持的最长密钥 没用上
  99. $ks = mcrypt_enc_get_key_size($td);//DES 8 3DES 24
  100. //初始化加密所需的缓冲区
  101. @mcrypt_generic_init($td, $key, $iv);
  102. //解密数据 $td为算法对象模块 $encrypted为需要解密的数据
  103. $decrypted = mdecrypt_generic($td, $encrypted);//类似于 "15549070665\x05\x05\x05\x05\x05" 之前加密的数据
  104. //对加密模块进行清理工作
  105. mcrypt_generic_deinit($td);
  106. //关闭加密模块
  107. mcrypt_module_close($td);
  108. //返回取出解密数据
  109. $data = $this->pkcs5_unpad($decrypted);
  110.  
  111. return $data;
  112. }
  113.  
  114. /**
  115. * 填补需加密的字符串
  116. * PKCS7Padding VS PKCS5Padding
  117. * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
  118. * @User yaokai
  119. * @param $text
  120. * @param $blocksize
  121. * @return string
  122. */
  123. function pkcs5_pad($text, $blocksize)
  124. {
  125. //$pad=5 blocksize=11 $test=8 %取余
  126. $pad = $blocksize - (strlen($text) % $blocksize);//5
  127. //返回ascii填补后的字符串, 类似 "15549070665\x05\x05\x05\x05\x05"
  128. return $text . str_repeat(chr($pad), $pad);
  129. }
  130.  
  131. /**
  132. * 去除加密填补的字符串
  133. * PKCS7Padding VS PKCS5Padding
  134. * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
  135. * @User yaokai
  136. * @param $text
  137. * @return bool|string
  138. */
  139. function pkcs5_unpad($text)
  140. {
  141. //取出最后一个字符串 {15} ord返回字符的 ASCII 码值
  142. $pad = ord($text{strlen($text) - 1});//5
  143. //判断$pad的值是否大于本身字符串
  144. if ($pad > strlen($text)) {
  145. //如果大于 则多余
  146. return false;
  147. }
  148. //计算ASCII 码值中全部字符都存在于$text字符集合中的第一段子串的长度是否等于取出的$pad
  149. if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
  150. //如果不相等 则缺失
  151. return false;
  152. }
  153. //返回字符串的子串
  154. return substr($text, 0, -1 * $pad);
  155. }
  156.  
  157. /**
  158. * 填补需加密的字符串
  159. * PKCS7Padding VS PKCS5Padding
  160. * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
  161. * @User yaokai
  162. * @param $text
  163. * @param $blocksize
  164. * @return string
  165. */
  166. function PaddingPKCS7($data)
  167. {
  168. $block_size = mcrypt_get_block_size(MCRYPTDES, MCRYPT_MODE_CBC);//3DES加密将MCRYPT_DES改为MCRYPT_3DES
  169. $padding_char = $block_size - (strlen($data) % $block_size);
  170. $data .= str_repeat(chr($padding_char), $padding_char);
  171. return $data;
  172. }
  173.  
  174. /**
  175. * 去除加密填补的字符串
  176. * PKCS7Padding VS PKCS5Padding
  177. * 区别,PKCS5Padding的blocksize为8字节,而PKCS7Padding的blocksize可以为1到255字节
  178. * @User yaokai
  179. * @param $text
  180. * @return bool|string
  181. */
  182. private function UnPaddingPKCS7($text)
  183. {
  184. $pad = ord($text{strlen($text) - 1});
  185. if ($pad > strlen($text)) {
  186. return false;
  187. }
  188. if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
  189. return false;
  190. }
  191. return substr($text, 0, -1 * $pad);
  192. }
  193.  
  194. }

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

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

PHP版DES算法加密数据(3DES)另附openssl_encrypt版本的更多相关文章

  1. PHP版DES算法加密数据

    php7之后的版本 php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被废弃并且被 OpenSSL 所取代. 从PHP 7.2起它将被从核心代码中移除并且移到PECL中.PHP手 ...

  2. 分组密码(三)DES 算法— 密码学复习(六)

    在介绍完Feistel结构之后,接下来进入到著名的DES算法. 6.1 DES算法的意义 在正式介绍DES之前,首先介绍几个重要的历史时间节点. ① 1973年,美国国家标准局(NBS)向社会公开征集 ...

  3. DES 算法的 C++ 与 JAVA 互相加解密

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  4. Asp.Net 常用工具类之加密——对称加密DES算法(2)

    又到周末,下午博客园看了两篇文章,关于老跳和老赵的程序员生涯,不禁感叹漫漫程序路,何去何从兮! 转眼毕业的第三个年头,去过苏州,跑过上海,从一开始的凌云壮志,去年背起行囊默默回到了长沙准备买房,也想有 ...

  5. AES算法,DES算法,RSA算法JAVA实现

    1     AES算法 1.1    算法描述 1.1.1      设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...

  6. Web安全学习笔记之DES算法实例详解

    转自http://www.hankcs.com/security/des-algorithm-illustrated.html 译自J. Orlin Grabbe的名作<DES Algorith ...

  7. DES算法解析

    DES算法  美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告. 1977年1月,美国 ...

  8. DES算法实现

    概述(团队项目) DES是一个分组加密算法,它以64位为分组对数据加密.同时DES也是一个对称算法:加密和解密用的是同一个算法.DES是一个包含16个阶段的"替换–置换"的分组加密 ...

  9. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

随机推荐

  1. Java第二十二天,异常

    异常 程序在执行过程中,出现的非正常的情况,最终会导致JVM非正常停止. 注意: 在Java等面向对象编程语言当中,异常本身是一个类,产生异常的本质就是抛出一个异常对象.Java对异常采取中断处理方式 ...

  2. 37.1 net-- udp传输

    一.打开接收端 package day35_net_网络编程.udp传输; import java.io.IOException; import java.net.*; /* * 使用UDP协议接收数 ...

  3. mysql导出

    --all-databases , -A 导出全部数据库. mysqldump -uroot -p --all-databases --all-tablespaces , -Y 导出全部表空间. my ...

  4. CH5701 开车旅行(倍增dp+set)

    传送门 解题思路: 一道比较有趣的题,解题工作主要分为两块: ①找出k(k=0表示小A先走,k=1表示小B先走,下面同理)从点i出发下一个到达的点to[k][i]; 一开始偷懒用了vector(偷懒一 ...

  5. 虚拟机安装windows sever2008

    1.打开并进行新建虚拟机 2.默认选择“典型” 3.选择“安装程序盘映像文件”,并‘浏览’选择本地的文件 4. 5.后面的默认选择即可,安装路径可自己修改 6.这一步的磁盘大小可自己修改的,这里先预设 ...

  6. Keepalived实现Nginx负载均衡高可用

    第一章:keepalived介绍 VRRP协议 目的就是为了解决静态路由单点故障问题的 第二章: keepalived工作原理 2.1 作为系统网络服务的高可用功能(failover) keepali ...

  7. 09-sass

    一.sass和scss sass最初是为了配合haml设计的,不需要大括号,用tab缩进 从第三代开始,保留缩进风格,完全向下兼容普通的css代码 二.下载配置sass compass是sass的一个 ...

  8. Mac 窗口管理软件 Spectacle

    我个人使用的窗口管理软件是 Magnet(本人在 Mac 下付费的首款软件,记得是 6 元~),今天为大家介绍一款类似的开源软件. 简介 Spectacle 是一款可以快速调整窗口大小与位置的开源软件 ...

  9. notepad++批量每行加字符

    移动光标到头 选择正则 输入^ 下面输入需要加的文本. 点替换

  10. Linux安装PHP的Redis扩展(已安装Redis)

    1.下载需要的php操作redis的扩展包 下载地址 http://pecl.php.net/package/redis    下载对应php版本,我的php版本为7.3,下载的是最新的版本5.0.2 ...