找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 572|回复: 0
打印 上一主题 下一主题

php加密解密函数authcode的用法详细解析

[复制链接]

2487

主题

2487

帖子

7391

积分

论坛元老

Rank: 8Rank: 8

积分
7391
跳转到指定楼层
楼主
发表于 2018-2-14 08:11:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

            核心提示:康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。
  
康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。
   
原理如下,假如:
  
加密
  
明文:1010 1001
  
密匙:1110 0011
  
密文:0100 1010
  
得出密文0100 1010,解密之需和密匙异或下就可以了
  
解密
  
密文:0100 1010
  
密匙:1110 0011
  
明文:1010 1001
  
并没有什么高深的算法,密匙重要性很高,所以,关键在于怎么生成密匙。
  
那我们一起看下康盛的authcode怎么做的吧
// 参数解释  
// $string: 明文 或 密文  
// $operation:DECODE表示解密,其它表示加密  
// $key: 密匙  
// $expiry:密文有效期  
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {  
   // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙  
   $ckey_length = 4;  
     
   // 密匙  
   $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);  
     
   // 密匙a会参与加解密  
   $keya = md5(substr($key, 0, 16));  
   // 密匙b会用来做数据完整性验证  
   $keyb = md5(substr($key, 16, 16));  
   // 密匙c用于变化生成的密文  
   $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
substr(md5(microtime()), -$ckey_length)) : '';  
   // 参与运算的密匙  
   $cryptkey = $keya.md5($keya.$keyc);  
   $key_length = strlen($cryptkey);  
   // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性  
   // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确  
   $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :
sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;  
   $string_length = strlen($string);  
   $result = '';  
   $box = range(0, 255);  
   $rndkey = array();  
   // 产生密匙簿  
   for($i = 0; $i  0 验证数据有效性  
     // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性  
     // 验证数据有效性,请看未加密明文的格式  
     if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {  
       return substr($result, 26);  
     } else {  
       return '';  
     }  
   } else {  
     // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因  
     // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码  
     return $keyc.str_replace('=', '', base64_encode($result));  
   }  
}
            
            
您可能感兴趣的文章:
  • PHP 加密解密内部算法
  • 微盾PHP脚本加密专家php解密算法
  • PHP可逆加密/解密函数分享
  • 怎样给PHP源代码加密?PHP二进制加密与解密的解决办法
  • PHP加密函数 Javascript/Js 解密函数
  • 一个PHP针对数字的加密解密类
  • 2个比较经典的PHP加密解密函数分享
  • php中base64_decode与base64_encode加密解密函数实例
  • php rsa加密解密使用详解
  • PHP使用自定义key实现对数据加密解密的方法
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端