0

0

通过PHP的内置函数,通过DES算法对数据加密和解密

高洛峰

高洛峰

发布时间:2016-12-21 09:49:19

|

1284人浏览过

|

来源于php中文网

原创

由于项目的需要,要写一个能生成“授权码”的类(授权码主要包含项目使用的到期时间),生成的授权码将会写入到一个文件当中,每当项目运行的时候,会自动读取出文件中的密文,然后使用唯一的“密钥”来调用某个函数,对密文进行解密,从中解读出项目的使用到期时间。 
之前,自己有先试着写了下,主要是base64+md5+反转字符串。算法太过简单,很容易被破解,而且也没有能过做到“密钥”在加解密中的重要性,故而舍之。 
后来,查找了相关资料,发现,原来php中内置了一个功能强大的函数库,即mcrypt。 
其实,mcrypt本身就提供了强大的加密解密方法,并且支持很多流行的公开的加密算法,如des, tripledes, blowfish (默认), 3-way, safer-sk64, safer-sk128, twofish, tea, rc2 and gost in cbc, ofb, cfb and ecb。 
  这里简单的引用下百度百科关于“加密算法”的解释: 
  数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。 
  加密技术通常分为两大类:“对称式”和“非对称式”。 
  对称式加密就是加密和解密使用同一个密钥,通常称之为“session key ”这种加密技术目前被广泛采用,如美国政府所采用的des加密标准就是一种典型的“对称式”加密法,它的session key长度为56bits。 
  非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。这里的“公钥”是指可以对外公布的,“私钥”则不能,只能由持有人一个人知道。它的优越性就在这里,因为对称式的加密方法如果是在网络上传输加密文件就很难把密钥告诉对方,不管用什么方法都有可能被别窃听到。而非对称式的加密方法有两个密钥,且其中的“公钥”是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题。 
  前面提到过,mcrypt支持多种国际公开的算法,我在这次的项目中使用的是des算法,des(data encryption standard),这是一个对称算法,速度较快,适用于加密大量数据的场合。 
接下来我简要的说明下加密类中会使用到的几个函数。 

-------------------------------------------------------------------------------- 
resource mcrypt_module_open ( string $algorithm , string $algorithm_directory , string $mode , string $mode_directory ) 
参数$algorithm:要使用的算法,可以通过函数mcrypt_list_algorithms()来查看所有支持的算法名称 
参数$ mode:要使用哪种模式,同样,可以内置函数mcrypt_list_algorithms()来查看所有支持的模式 

-------------------------------------------------------------------------------- 
int mcrypt_enc_get_iv_size ( resource $td ) 
该函数将返回使用的算法的初始化向量(iv)的大小(看着有点抽象),如果iv在算法中被忽略的话讲返回0。 
参数$td就是使用mcrypt_module_open函数的返回值。 

-------------------------------------------------------------------------------- 
string mcrypt_create_iv ( int $size [, int $source = mcrypt_dev_random ] ) 
该函数会创建一个初始化向量(iv) 
参数: 
$source可以使mcrypt_rand,mcrypt_dev_random, 
mcrypt_dev_urandom 
注意:php5.3.0以上的版本,只支持mcrypt_rand 
返回值: 
成功,则返回一个字符串型的初始向量,失败,则返回false 

-------------------------------------------------------------------------------- 
int mcrypt_enc_get_key_size ( resource $td ) 
该函数能够取得当前算法所支持的最大的密钥长度(以字节计算) 
int mcrypt_generic_init ( resource $td , string $key , string $iv ) 
调用mcrypt_generic() or mdecrypt_generic()之前,首先需要调用该函数,该函数能够帮我们初始化缓冲区,用以存放加密数据。 
参数$key:密钥长度,记住,当前$key的值,要比函数mcrypt_enc_get_key_size()返回的值小 
问题:$key的值,越大越好吗?有同学会的,帮忙解答下。 

-------------------------------------------------------------------------------- 
string mcrypt_generic ( resource $td , string $data ) 
完成了前面的工作之后,就可以调用该函数用以加密数据了。 
参数$data:要加密的数据内容 
返回值:返回加密后的密文 

-------------------------------------------------------------------------------- 
bool mcrypt_generic_deinit ( resource $td ) 
该函数能够帮我们卸载当前使用的加密模块。 
返回值 
成功时返回 true, 或者在失败时返回 false. 

-------------------------------------------------------------------------------- 
string mdecrypt_generic ( resource $td , string $data ) 
该函数能够用来解密数据。 
注意:解密后的数据可能比实际上的更长,可能会有后续的\0,需去掉 

-------------------------------------------------------------------------------- 
bool mcrypt_module_close ( resource $td ) 
关闭指定的加密模块资源句柄 
返回值 
成功时返回 true, 或者在失败时返回 false. 

mac_addr=$this->getmac(PHP_OS); 
$this->filepath="./licence.txt"; 
$this->ttl="20120619";//到期时间 
$this->salt="~!@#$";//盐值,用以提高密文的安全性 
// echo "
".print_r(mcrypt_list_algorithms ())."
";  // echo "
".print_r(mcrypt_list_modes())."
";  }  /**  * 对明文信息进行加密  * @param $key 密钥  */  public function encode($key) {  $this->td = mcrypt_module_open(MCRYPT_DES,'','ecb',''); //使用MCRYPT_DES算法,ecb模式  $size=mcrypt_enc_get_iv_size($this->td);//设置初始向量的大小  $this->iv = mcrypt_create_iv($size, MCRYPT_RAND);//创建初始向量  $this->ks = mcrypt_enc_get_key_size($this->td);//返回所支持的最大的密钥长度(以字节计算)  $this->key_1 = substr(md5(md5($key).$this->salt),0,$this->ks);  mcrypt_generic_init($this->td, $this->key_1, $this->iv); //初始处理  //要保存到明文  $con=$this->mac_addr.$this->ttl;  //加密  $this->encode = mcrypt_generic($this->td, $con);  //结束处理  mcrypt_generic_deinit($this->td);  //将密文保存到文件中  $this->savetofile();  }  /**  * 对密文进行解密  * @param $key 密钥  */  public function decode($key) {  try {  if (!file_exists($this->filepath)){  throw new Exception("授权文件不存在");  }else{//如果授权文件存在的话,则读取授权文件中的密文  $fp=fopen($this->filepath,'r');  $secret=fread($fp,filesize($this->filepath));  $this->key_2 = substr(md5(md5($key).$this->salt),0,$this->ks);  //初始解密处理  mcrypt_generic_init($this->td, $this->key_2, $this->iv);  //解密  $decrypted = mdecrypt_generic($this->td, $secret);  //解密后,可能会有后续的\0,需去掉  $decrypted=trim($decrypted) . "\n";  //结束  mcrypt_generic_deinit($this->td);  mcrypt_module_close($this->td);  return $decrypted;  }  }catch (Exception $e){  echo $e->getMessage();  }  }  /**  * 将密文保存到文件中  */  public function savetofile(){  try {  $fp=fopen($this->filepath,'w+');  if (!$fp){  throw new Exception("文件操作失败");  }  fwrite($fp,$this->encode);  fclose($fp);  }catch (Exception $e){  echo $e->getMessage();  }  }  /**  * 取得服务器的MAC地址  */  public function getmac($os_type){  switch ( strtolower($os_type) ){  case "linux":  $this->forLinux();  break;  case "solaris":  break;  case "unix":  break;  case "aix":  break;  default:  $this->forWindows();  break;  }  $temp_array = array();  foreach( $this->return_array as $value ){  if (preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value,$temp_array )){  $mac_addr = $temp_array[0];  break;  }  }  unset($temp_array);  return $mac_addr;  }  /**  * windows服务器下执行ipconfig命令  */  public function forWindows(){  @exec("ipconfig /all", $this->return_array);  if ( $this->return_array )  return $this->return_array;  else{  $ipconfig = $_SERVER["WINDIR"]."\system32\ipconfig.exe";  if ( is_file($ipconfig) )  @exec($ipconfig." /all", $this->return_array);  else  @exec($_SERVER["WINDIR"]."\system\ipconfig.exe /all", $this->return_array);  return $this->return_array;  }  }  /**  * Linux服务器下执行ifconfig命令  */  public function forLinux(){  @exec("ifconfig -a", $this->return_array);  return $this->return_array;  }  }  $code=new authCode();  //加密  $code->encode("~!@#$%^");  //解密  echo $code->decode("~!@#$%^");  ?>

更多通过PHP的内置函数,通过DES算法对数据加密和解密相关文章请关注PHP中文网!

ECTouch移动商城系统
ECTouch移动商城系统

ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有

下载

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 序列化
Python 序列化

本专题整合了python序列化、反序列化相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.02

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

91

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

27

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

11

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

5

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

5

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

55

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

27

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号