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)代码: / ...
随机推荐
- Linux强大屏幕截图方法,理论能截取任何图形界面,包括登录界面
众所周知,屏幕截图可以使用“Print Screen”按键,但是,此按键的响应是靠系统的后台服务实现的,Linux在某些场景下,是不响应此按键的. 这里介绍一种更强大的截图方法,它是靠转储X图形环境的 ...
- 【第二章】黎姿的python学习笔记
- MySQL学习之路5-数据表的常用操作
排序 :order by desc select * from <tablename> order by <字段名> desc:order by默认升序 desc 降序 分组 ...
- 【LeetCode】23.合并K个排序链表
题目描述 23.合并K个排序链表 合并k个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] ...
- Salesforce元数据入门指南,管理员必看!
元数据是Salesforce基础架构的核心,是Salesforce中的核心组件或功能.没有元数据,大部分功能都无法实现. 但是,某些Salesforce管理员仍然很难掌握元数据的整个范围,并且无法充分 ...
- Missing artifact net.sf.json-lib:json-lib:jar:2.2.3
<!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib --><dependency> <gro ...
- python selenium模块 css定位
selenium是python的非标准库,使用时需要下载安装 安装命令 pip install selenium selenium是python的自动化测试模块,可以模拟浏览器的行为 所以在使用之前 ...
- CAS原理解析
CAS底层原理 概念 CAS的全称是Compare-And-Swap,它是CPU并发原语 它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的 CAS并发原语体现在Jav ...
- RocketMQ存储机制与确认重传机制
引子 消息队列之前就听说过,但一直没有学习和接触,直到最近的工作流引擎项目用到,需要了解学习一下.本文主要从一个初学者的角度针对RocketMQ的存储机制和确认重传机制做一个浅显的总结. 存储机制 我 ...
- MVC-前端设计
来源于:https://www.cnblogs.com/miro/p/4030622.html 从前端的UI开始 MVC分离的比较好,开发顺序没有特别要求,先开发哪一部分都可以,这次我们主要讲解前端U ...