PHP版DES算法加密数据
php7之后的版本
php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移到PECL中。PHP手册在7.1迁移页面给出了替代方案,就是用OpenSSL取代MCrypt.
function encrypt($input)
{
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
$size = 16;
$k = C('KEY_LONG');
$input = pkcs5_pad($input, $size);
$data = openssl_encrypt($input, 'AES-128-CBC', $k, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $k);
} else {
$size = 8;
$k = C('KEY_SHORT');
$input = pkcs5_pad($input, $size);
$td = mcrypt_module_open(MCRYPT_DES, '', 'cbc', '');
mcrypt_generic_init($td, $k, $k);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
}
$data = base64_encode($data);
return $data;
}
function decrypt($input)
{
$crypt = base64_decode($input);
if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
$size = 16;
$k = C('KEY_LONG');
$data = openssl_decrypt($crypt, 'AES-128-CBC', $k, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $k);
} else {
$size = 8;
$k = C('KEY_SHORT');
$td = mcrypt_module_open(MCRYPT_DES, '', 'cbc', '');
mcrypt_generic_init($td, $k, $k);
$data = mdecrypt_generic($td, $crypt);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
}
$data = pkcs5_unpad($data);
$data = rtrim($data);
return $data;
}
function pkcs5_pad($string, $blocksize = 16)
{
$len = strlen($string);
$pad = $blocksize - ($len % $blocksize);
$string .= str_repeat(chr($pad), $pad);
return $string;
}
function pkcs5_unpad($string)
{
$slast = ord(substr($string, -1));
$slastc = chr($slast);
$pcheck = substr($string, -$slast);
if (preg_match("/$slastc{" . $slast . "}/", $string)) {
$string = substr($string, 0, strlen($string) - $slast);
return $string;
} else {
return false;
}
}
function hexToStr($hex)
{
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2)
{
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
return $string;
}
php7之前的版本
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);
}
}
PHP版DES算法加密数据的更多相关文章
- PHP版DES算法加密数据(3DES)另附openssl_encrypt版本
PHP版DES算法加密数据(3DES) 可与java的DES(DESede/CBC/PKCS5Padding)加密方式兼容 <?php /** * Created by PhpStorm. * ...
- 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个阶段的"替换–置换"的分组加密 ...
- 分组密码(三)DES 算法— 密码学复习(六)
在介绍完Feistel结构之后,接下来进入到著名的DES算法. 6.1 DES算法的意义 在正式介绍DES之前,首先介绍几个重要的历史时间节点. ① 1973年,美国国家标准局(NBS)向社会公开征集 ...
- DES算法详解
本文主要介绍了DES算法的步骤,包括IP置换.密钥置换.E扩展置换.S盒代替.P盒置换和末置换. 1.DES算法简介 DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准. DES是一个分组 ...
- 基于DES算法加密的防撞库密码系统项目总结
项目内容:基于DES算法加密的防撞库密码系统 小组名:zqhzkzkj 目标:1.对用户输入的8位字符进行DES加密,要求用户输入8位密钥 2.对于不同的网站,不同的用户名生成不同的密码 小组成员:周 ...
随机推荐
- Java数组之二分查找
简单的二分查找 package com.kangkang.array; public class demo03 { public static void main(String[] args) { / ...
- python:虚拟环境与pip
原生pip镜像下载速度较慢,配置使用国内镜像.这里选择清华镜像,文档地址:https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ pip 镜像配置 临时使用: ...
- 图文详解:阿里宠儿【小兔】RabbitMQ的养成攻略
- 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新
从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个s ...
- BIMFACE二次开发【C#系列】
本系列文章主要介绍使用 C# .ASP.NET(MVC)技术对 BIMFACE 平台进行二次开发,以满足本公司针对建筑行业施工图审查系统的业务需求,例如图纸模型(PDF 文件.二维 CAD 模型.三维 ...
- [SNOI2019] 通信
一.题目 点此看题 二.解法 一看就是傻逼补流模型,不会真的有人这个图都建不出来吧 别走啊,我不阴阳怪气了,如果你不知道怎么建这里有图嘛(思路来源是餐巾计划问题): 其中标红的边数量级很大,因为 \( ...
- ECMAScript 2017(ES8)新特性简介
目录 简介 Async函数 共享内存和原子操作 Object的新方法 String的新方法 逗号可以添加到函数的参数列表后面了 简介 ES8是ECMA协会在2017年6月发行的一个版本,因为是ECMA ...
- Srping源码之BeanFactory.getBean
本文是针对Srping的BeanFactory.getBean来进行源码解析,如果您是第一次看请先看一下XMLBeanFactory解析:https://www.cnblogs.com/technol ...
- C++11正则表达式
- [LeetCode]2. 两数相加(难度:中等)
题目: 给你两个非空的链表,表示两个非负的整数.它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字.请你将两个数相加,并以相同形式返回一个表示和的链表.你可以假设除了数字0之外,这两个 ...