• 首页
    • English
    • 中文
  • 关于我们
  • 服务项目
    • 谷歌SEO服务
    • WordPress建站服务
    • 谷歌ADS/SEM代运营
  • 项目案例
    • 医疗
    • 建材
    • 机械加工
    • 照明
    • 电商
    • 电脑硬件
  • 博客
    • 服务器运维
      • aliyun
      • 服务器安装
      • 宝塔面板
      • 虚拟化
      • 阿里云
      • Centos
      • linux
      • nginx
    • 电子商务
    • 免费资源
    • PHP
      • Magento
      • WordPress
    • 大数据采集
    • Python
    • Javascript
    • SEO
    • 未分类
  • 联系我们
What's Hot

机械模具加工公司网站设计案例

24 10 月, 2023

快速原型公司案例

24 10 月, 2023

陶瓷加工网站案例

24 10 月, 2023
Facebook Twitter Instagram
  • 中文
  • English
Facebook Twitter Instagram
VPSEO VPSEO
  • 首页
    • English
    • 中文
  • 关于我们
  • 服务项目
    • 谷歌SEO服务
    • WordPress建站服务
    • 谷歌ADS/SEM代运营
  • 项目案例
    • 医疗
    • 建材
    • 机械加工
    • 照明
    • 电商
    • 电脑硬件
  • 博客
    • 服务器运维
      • aliyun
      • 服务器安装
      • 宝塔面板
      • 虚拟化
      • 阿里云
      • Centos
      • linux
      • nginx
    • 电子商务
    • 免费资源
    • PHP
      • Magento
      • WordPress
    • 大数据采集
    • Python
    • Javascript
    • SEO
    • 未分类
  • 联系我们
VPSEO VPSEO
Home»PHP»一个经典的PHP加密解密算法
PHP

一个经典的PHP加密解密算法

chrispengcnBy chrispengcn7 8 月, 2021没有评论3 Mins Read
Facebook Twitter Pinterest LinkedIn Tumblr Email
Share
Facebook Twitter LinkedIn Pinterest Email

一个经典的PHP加密解密算法

项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。
最常见的应用在用户登录以及一些API数据交换的场景。

最常见的应用在用户登录以及一些API数据交换的场景。
笔者收录了一些比较经典的PHP加密解密函数代码,分享给大家。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。
1、非常给力的authcode加密函数,Discuz!经典代码(带详解):

 

  1. 1 function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
  2. 2 // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
  3. 3 $ckey_length = 4;
  4. 4
  5. 5 // 密匙
  6. 6 $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
  7. 7
  8. 8 // 密匙a会参与加解密
  9. 9 $keya = md5(substr($key, 0, 16));
  10. 10 // 密匙b会用来做数据完整性验证
  11. 11 $keyb = md5(substr($key, 16, 16));
  12. 12 // 密匙c用于变化生成的密文
  13. 13 $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
  14. 14 substr(md5(microtime()), -$ckey_length)) : '';
  15. 15 // 参与运算的密匙
  16. 16 $cryptkey = $keya.md5($keya.$keyc);
  17. 17 $key_length = strlen($cryptkey);
  18. 18 // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
  19. 19 //解密时会通过这个密匙验证数据完整性
  20. 20 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
  21. 21 $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :
  22. 22 sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  23. 23 $string_length = strlen($string);
  24. 24 $result = '';
  25. 25 $box = range(0, 255);
  26. 26 $rndkey = array();
  27. 27 // 产生密匙簿
  28. 28 for($i = 0; $i <= 255; $i++) {
  29. 29 $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  30. 30 }
  31. 31 // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
  32. 32 for($j = $i = 0; $i < 256; $i++) {
  33. 33 $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  34. 34 $tmp = $box[$i];
  35. 35 $box[$i] = $box[$j];
  36. 36 $box[$j] = $tmp;
  37. 37 }
  38. 38 // 核心加解密部分
  39. 39 for($a = $j = $i = 0; $i < $string_length; $i++) {
  40. 40 $a = ($a + 1) % 256;
  41. 41 $j = ($j + $box[$a]) % 256;
  42. 42 $tmp = $box[$a];
  43. 43 $box[$a] = $box[$j];
  44. 44 $box[$j] = $tmp;
  45. 45 // 从密匙簿得出密匙进行异或,再转成字符
  46. 46 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  47. 47 }
  48. 48 if($operation == 'DECODE') {
  49. 49 // 验证数据有效性,请看未加密明文的格式
  50. 50 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
  51. 51 substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  52. 52 return substr($result, 26);
  53. 53 } else {
  54. 54 return '';
  55. 55 }
  56. 56 } else {
  57. 57 // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
  58. 58 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
  59. 59 return $keyc.str_replace('=', '', base64_encode($result));
  60. 60 }
  61. 61 }

 

函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。
用法:

 

  1. 1 $str = 'abcdef';
  2. 2 $key = 'www.fyunw.com';
  3. 3 $authcode = authcode($str,'ENCODE',$key,0); //加密
  4. 4 echo $authcode;
  5. 5 echo authcode($authcode,'DECODE',$key,0); //解密

 

 

2、加解密函数encrypt():

 

  1. 1 function encrypt($string,$operation,$key=''){
  2. 2 $key=md5($key);
  3. 3 $key_length=strlen($key);
  4. 4 $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;
  5. 5 $string_length=strlen($string);
  6. 6 $rndkey=$box=array();
  7. 7 $result='';
  8. 8 for($i=0;$i<=255;$i++){
  9. 9 $rndkey[$i]=ord($key[$i%$key_length]);
  10. 10 $box[$i]=$i;
  11. 11 }
  12. 12 for($j=$i=0;$i<256;$i++){
  13. 13 $j=($j+$box[$i]+$rndkey[$i])%256;
  14. 14 $tmp=$box[$i];
  15. 15 $box[$i]=$box[$j];
  16. 16 $box[$j]=$tmp;
  17. 17 }
  18. 18 for($a=$j=$i=0;$i<$string_length;$i++){
  19. 19 $a=($a+1)%256;
  20. 20 $j=($j+$box[$a])%256;
  21. 21 $tmp=$box[$a];
  22. 22 $box[$a]=$box[$j];
  23. 23 $box[$j]=$tmp;
  24. 24 $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));
  25. 25 }
  26. 26 if($operation=='D'){
  27. 27 if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){
  28. 28 return substr($result,8);
  29. 29 }else{
  30. 30 return'';
  31. 31 }
  32. 32 }else{
  33. 33 return str_replace('=','',base64_encode($result));
  34. 34 }
  35. 35 }

 

函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。
用法:

 

  1. 1 $str = 'abc';
  2. 2 $key = 'www.fyunw.com';
  3. 3 $token = encrypt($str, 'E', $key);
  4. 4 echo '加密:'.encrypt($str, 'E', $key);
  5. 5 echo '解密:'.encrypt($str, 'D', $key);

 

如果觉得这文章还算用心,请劳驾点击右下角的推荐,这是对我们这些做开源分享的最大的肯定,谢谢。

 

Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
chrispengcn
  • Website

Related Posts

PHP读取文本文件内容并随机输出任意一行

10 11 月, 2021

PHP中获取远程文件的三种方法

10 11 月, 2021

PHP array_rand() 函数随机输出数组内容

10 11 月, 2021

drupal 后台使用教程

7 8 月, 2021
Add A Comment

Leave A Reply Cancel Reply

*

code

导航
  • 首页
  • 关于我们
  • 服务项目
  • 项目案例
  • 博客文章
  • 联系我们
博客
  • 服务器运维
  • 服务器安装
  • nginx
  • PHP
  • WordPress
  • Python
  • Javascript
  • SEO
  • 电子商务
  • 大数据采集
  • 宝塔面板
  • 数据库
  • 电子商务
  • 虚拟化
  • 阿里云
导航
  • 首页
  • 关于我们
  • 谷歌SEO服务
  • 谷歌ADS/SEM代运营
  • WordPress建站服务
  • 项目案例
  • 博客
  • 联系我们
最新文章
  • 机械模具加工公司网站设计案例
  • 快速原型公司案例
  • 陶瓷加工网站案例
  • CNC数控加工日文网站案例
  • 触摸一体机数字标牌厂家网站案例
关于我们
关于我们

广州纬来科技有限公司
联系地址:广东省广州市番禺区富华中路富源二街18号合和大厦809

QQ : 13602156
Email : 13926026058@139.com
Contact: +86 13926026058

Facebook Twitter YouTube LinkedIn
© 2025 广州纬来科技有限公司 粤ICP备2023105857号-2
  • 首页
  • 关于我们
  • 谷歌SEO服务
  • 谷歌ADS/SEM代运营
  • WordPress建站服务
  • 项目案例
  • 博客
  • 联系我们

Type above and press Enter to search. Press Esc to cancel.