最近看见一篇文章讲的是PHP的加解密方法,正好也自己学习下,顺便以后有用到的地方也好能快速用上,仅供自己学习和复习,好了不多BB,上代码。

基于这几个函数可逆转的加密为:base64_encode()、urlencode() 相对应的解密函数:base64_decode() 、urldecode() ,示例如下

1、第一种加密解密算法

  1. <?php
  2. function encryptDecrypt($key, $string, $decrypt){
  3. if($decrypt){
  4. $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");
  5. return $decrypted;
  6. }else{
  7. $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
  8. return $encrypted;
  9. }
  10. }
  11.  
  12. //加密:"z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk="
  13. echo encryptDecrypt('password', 'Helloweba欢迎您',0);
  14. //解密:"Helloweba欢迎您"
  15. echo encryptDecrypt('password', 'z0JAx4qMwcF+db5TNbp/xwdUM84snRsXvvpXuaCa4Bk=',1);
  16. ?>

2、第二种加密解密算法

  1. <?php
  2. //加密函数
  3. function lock_url($txt,$key='www.xxxx.com'){
  4. $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
  5. $nh = rand(0,64);
  6. $ch = $chars[$nh];
  7. $mdKey = md5($key.$ch);
  8. $mdKey = substr($mdKey,$nh%8, $nh%8+7);
  9. $txt = base64_encode($txt);
  10. $tmp = '';
  11. $i=0;$j=0;$k = 0;
  12. for ($i=0; $i<strlen($txt); $i++) {
  13. $k = $k == strlen($mdKey) ? 0 : $k;
  14. $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;
  15. $tmp .= $chars[$j];
  16. }
  17. return urlencode($ch.$tmp);
  18. }
  19. //解密函数
  20. function unlock_url($txt,$key='www.xxxx.com'){
  21. $txt = urldecode($txt);
  22. $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
  23. $ch = $txt[0];
  24. $nh = strpos($chars,$ch);
  25. $mdKey = md5($key.$ch);
  26. $mdKey = substr($mdKey,$nh%8, $nh%8+7);
  27. $txt = substr($txt,1);
  28. $tmp = '';
  29. $i=0;$j=0; $k = 0;
  30. for ($i=0; $i<strlen($txt); $i++) {
  31. $k = $k == strlen($mdKey) ? 0 : $k;
  32. $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);
  33. while ($j<0) $j+=64;
  34. $tmp .= $chars[$j];
  35. }
  36. return base64_decode($tmp);
  37. }
  38. ?>

3、第三种加密解密算法

  1. <?php
  2.  
  3. //改进后的算法
  4. //加密函数
  5. function lock_url($txt,$key='test'){
  6. $txt = $txt.$key;
  7. $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
  8. $nh = rand(0,64);
  9. $ch = $chars[$nh];
  10. $mdKey = md5($key.$ch);
  11. $mdKey = substr($mdKey,$nh%8, $nh%8+7);
  12. $txt = base64_encode($txt);
  13. $tmp = '';
  14. $i=0;$j=0;$k = 0;
  15. for ($i=0; $i<strlen($txt); $i++) {
  16. $k = $k == strlen($mdKey) ? 0 : $k;
  17. $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64;
  18. $tmp .= $chars[$j];
  19. }
  20. return urlencode(base64_encode($ch.$tmp));
  21. }
  22. //解密函数
  23. function unlock_url($txt,$key='test'){
  24. $txt = base64_decode(urldecode($txt));
  25. $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+";
  26. $ch = $txt[0];
  27. $nh = strpos($chars,$ch);
  28. $mdKey = md5($key.$ch);
  29. $mdKey = substr($mdKey,$nh%8, $nh%8+7);
  30. $txt = substr($txt,1);
  31. $tmp = '';
  32. $i=0;$j=0; $k = 0;
  33. for ($i=0; $i<strlen($txt); $i++) {
  34. $k = $k == strlen($mdKey) ? 0 : $k;
  35. $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);
  36. while ($j<0) $j+=64;
  37. $tmp .= $chars[$j];
  38. }
  39. return trim(base64_decode($tmp),$key);
  40. }
  41.  
  42. ?>

4、第四种加密解密算法

  1. <?php
  2.  
  3. function passport_encrypt($txt, $key = 'www.zhuoyuexiazai.com') {
  4. srand((double)microtime() * 1000000);
  5. $encrypt_key = md5(rand(0, 32000));
  6. $ctr = 0;
  7. $tmp = '';
  8. for($i = 0;$i < strlen($txt); $i++) {
  9. $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
  10. $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);
  11. }
  12. return urlencode(base64_encode(passport_key($tmp, $key)));
  13. }
  14.  
  15. function passport_decrypt($txt, $key = 'www.zhuoyuexiazai.com') {
  16. $txt = passport_key(base64_decode(urldecode($txt)), $key);
  17. $tmp = '';
  18. for($i = 0;$i < strlen($txt); $i++) {
  19. $md5 = $txt[$i];
  20. $tmp .= $txt[++$i] ^ $md5;
  21. }
  22. return $tmp;
  23. }
  24.  
  25. function passport_key($txt, $encrypt_key) {
  26. $encrypt_key = md5($encrypt_key);
  27. $ctr = 0;
  28. $tmp = '';
  29. for($i = 0; $i < strlen($txt); $i++) {
  30. $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;
  31. $tmp .= $txt[$i] ^ $encrypt_key[$ctr++];
  32. }
  33. return $tmp;
  34. }
  35.  
  36. $txt = "1";
  37. $key = "testkey";
  38. $encrypt = passport_encrypt($txt,$key);
  39. $decrypt = passport_decrypt($encrypt,$key);
  40.  
  41. echo $encrypt."<br>";
  42. echo $decrypt."<br>";
  43.  
  44. ?>

5、第五种加密解密算法:discuz中使用的加密解密算法

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

6、第六种加密解密算法

  1. <?php
  2. //函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。
  3. function encrypt($string,$operation,$key=''){
  4. $key=md5($key);
  5. $key_length=strlen($key);
  6. $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;
  7. $string_length=strlen($string);
  8. $rndkey=$box=array();
  9. $result='';
  10. for($i=0;$i<=255;$i++){
  11. $rndkey[$i]=ord($key[$i%$key_length]);
  12. $box[$i]=$i;
  13. }
  14. for($j=$i=0;$i<256;$i++){
  15. $j=($j+$box[$i]+$rndkey[$i])%256;
  16. $tmp=$box[$i];
  17. $box[$i]=$box[$j];
  18. $box[$j]=$tmp;
  19. }
  20. for($a=$j=$i=0;$i<$string_length;$i++){
  21. $a=($a+1)%256;
  22. $j=($j+$box[$a])%256;
  23. $tmp=$box[$a];
  24. $box[$a]=$box[$j];
  25. $box[$j]=$tmp;
  26. $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));
  27. }
  28. if($operation=='D'){
  29. if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){
  30. return substr($result,8);
  31. }else{
  32. return'';
  33. }
  34. }else{
  35. return str_replace('=','',base64_encode($result));
  36. }
  37. }
  38.  
  39. $str = 'abc';
  40. $key = 'www.helloweba.com';
  41. $token = encrypt($str, 'E', $key);
  42. echo '加密:'.encrypt($str, 'E', $key);
  43. echo '解密:'.encrypt($str, 'D', $key);
  44.  
  45. ?>

以上就是这次文章的全部内容了,对于有需要的人,可以自己挑选哪种加密方式

参考链接:https://mp.weixin.qq.com/s/JdrYlc-Xwf8E29XjDz0acw

PHP 加解密方法大全的更多相关文章

  1. Java Des加解密方法(c#加密Java解密)

    最近我们用Java把一个用.net编写的老系统重新做了翻版,但是登录还是用.net的登录.这样就会遇到一个比较棘手的问题,我们登录用的cookie信息都是.net用des加密的,但我们不得不用Java ...

  2. Android中加解密算法大全

    Base64编码 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,本质上是一种将二进制数据转成文本数据的方案,对于非二进制数据,是先将其转换成二进制形式,然后每连续6比特(2的6次 ...

  3. C#常用字符串加解密方法封装

    C#中常用的字符串加密.解密方法封装,包含只加密但不解密的方法.收藏起来备用. //方法一 //须添加对System.Web的引用 //using System.Web.Security; /// & ...

  4. DES跨(C# Android IOS)三个平台通用的加解密方法

          #region   跨平台加解密(c# 安卓 IOS)       //  public static string sKey = "12345678";       ...

  5. 几种加解密方法:AES、DES、SHA数据加密

    一般项目都会用上加密,刚好手上的项目就用到DES加密,就贴一些代码记录一下 DES加密步奏: 1.初始化两个字符串,一个为指定的秘钥,一个为初始化向量,要求是8个字符. 2.加密:秘钥.向量.需加密的 ...

  6. C#实现AES加解密方法

    using System; using System.Collections.Generic; using System.Text; using System.Security.Cryptograph ...

  7. js 加解密方法

    一:最简单的加密解密 (ansi转usc2) 大家对于JAVASCRIPT函数escape()和unescape()想必是比较了解啦(很多网页加密在用它们),分别是编码和解码字符串,比如例子代码用es ...

  8. 关于Python实现Interface base64加解密方法

    ''' 以下Python Code运行环境为windows10, Python版本为3.5.3 涉及的库:base64,json,unittest ''' # coding=utf-8 # impor ...

  9. C# SHA512和Base64加解密方法

    /// <summary> /// Get SHA512 Hash From String /// </summary> /// <param name="or ...

随机推荐

  1. [20190401]跟踪dbms_lock.sleep调用.txt

    [20190401]跟踪dbms_lock.sleep调用.txt --//自己在semtimedop函数调用理解错误,加深理解,跟踪dbms_lock.sleep调用的情况. 1.环境:SCOTT@ ...

  2. PGSQL-通过SQL语句来计算两个日期相差的天数

    这是本人第一次写的~我在某次需求中遇到一个问题,如何在SQL语句中计算出两个日期的天数,然后用那个结果来进行数据的筛选呢?通过网上查阅了资料发现 date_part('day', cast(time1 ...

  3. SQLServer之DEFAULT约束

    DEFAULT约束添加规则 1.若在表中定义了默认值约束,用户在插入新的数据行时,如果该行没有指定数据,那么系统将默认值赋给该列,如果我们不设置默认值,系统默认为NULL. 2.如果“默认值”字段中的 ...

  4. (转载)最完整的自动化测试流程:Python编写执行测试用例及定时自动发送最新测试报告邮件

    今天笔者就要归纳总结下一整套测试流程,从无到有,实现零突破,包括如何编写测试用例,定时执行测试用例,查找最新生成的测试报告文件,自动发送最新测试报告邮件,一整套完整的测试流程.以后各位只要着重如何编写 ...

  5. 【Shell基础】字符串删除

    案例:将金额18.中的点去掉,结果为18 #!/bin/shold_value=. new_value=`echo ${old_value%%.*}` echo $new_value ${filena ...

  6. Windows Service 学习系列(三)——循环引擎 ICycleEngine

    摘要:转载:https://www.cnblogs.com/zhuweisky/archive/2009/09/01/1557792.html#undefined 1.缘起: 有些系统需要每隔一段时间 ...

  7. kafka-rest:A Comprehensive, Open Source REST Proxy for Kafka

    Ewen Cheslack-Postava  March 25, 2015  时间有点久,但讲的还是很清楚的 As part of Confluent Platform 1.0 released ab ...

  8. ZooKeeper Dynamic Reconfiguration (dynamicConfigFile) ZooKeeper动态配置

    有人翻译的地址:https://www.cnblogs.com/dupang/p/5649843.html ZooKeeper Dynamic Reconfiguration Overview Cha ...

  9. ElasticSearch(八):elasticsearch.yml配置说明

    集群名称:cluster.name: my-application确保在不同的环境中的集群的名称不重复,否则,节点可能会连接到错误的集群上 节点名称:node.name: node-1默认情况下,当节 ...

  10. ElasticSearch(七):Java操作elasticsearch基于smartcn中文分词查询

    package com.gxy.ESChap01; import java.net.InetAddress; import org.elasticsearch.action.search.Search ...