【4858.com】异常的赞的PHP字符串加密函数,php加密解密函数

By admin in 4858.com on 2019年7月28日

规律如下,假设:
加密
明文:1010 1001
密匙:1110 0011
密文:0100 1010
得出密文0100 1010,解密之需和密匙异或下就足以了
解密
密文:0100 1010
密匙:1110 0011
明文:1010 1001
并不曾什么奥密的算法,密匙首要性异常高,所以,关键在于怎么变卦密匙。
那大家一齐看下康盛的authcode如何做的吧

/**

多年来, 从discuz里面发掘了三个很牛的加密解密函数。

规律如下,假若:
  加密
  明文: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;

*@param string $string 必要加密或许解密的函数

**这样大家就足以拿此函数来做过多用处了,比方:单点登入的token加密传输啦,有的时候密码啦等等

// 参数解释
// $string: 明文 或 密文
// $operation:DECODE表示解密,另外代表加密
// $key: 密匙
// $expiry:密文有效期
function authcode($string, $operation = ‘DECODE’, $key = ”, $expiry =
0) {
// 动态密匙长度,一样的明文仲生成差别密文正是依赖动态密匙
$ckey_length = 4;

// 密匙
$key = md5($key ? $key : $GLOBALS[‘discuz_auth_key’]);

*@param string $operation 加密恐怕解密 DECODE为解密、其余为加密

 1 /**
 2   * @param string $string 原著或许密文
 3   * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE
 4   * @param string $key 密钥
 5    * @param int $expiry 密文保藏期, 加密时候使得, 单位 秒,0 为世代有效
 6    * @return string 管理后的 原来的书文可能 经过 base64_encode 管理后的密文
 7    *
 8      * @example
 9      *
10      *  $a = authcode(‘abc’, ‘ENCODE’, ‘key’);
11      *  $b = authcode($a, ‘DECODE’, ‘key’);  // $b(abc)
12      *
13      *  $a = authcode(‘abc’, ‘ENCODE’, ‘key’, 3600);
14      *  $b = authcode(‘abc’, ‘DECODE’, ‘key’); // 在一个钟头内,$b(abc),不然 $b 为空
15      */
16 function authcode($string, $operation = ‘DECODE’, $key = ”, $expiry = 3600) {
17 
18         $ckey_length = 4;   
19         // 随机密钥长度 取值 0-32;
20         // 加入随机密钥,能够令密文无别的规律,即就是原来的小说和密钥完全同样,加密结果也会每一趟差异,增大破解难度。
21         // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方
22         // 当此值为 0 时,则不发出随机密钥
23 
24         $key = md5($key ? $key : ‘default_key’);
//这里能够填充暗中同意key值 25         $keya = md5(substr($key, 0, 16));
26         $keyb = md5(substr($key, 16, 16));
27         $keyc = $ckey_length ? ($operation == ‘DECODE’ ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ”;
28 
29         $cryptkey = $keya.md5($keya.$keyc);
30         $key_length = strlen($cryptkey);
31 
32         $string = $operation == ‘DECODE’ ? base64_decode(substr($string, $ckey_length)) : sprintf(‘%010d’, $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
33         $string_length = strlen($string);
34 
35         $result = ”;
36         $box = range(0, 255);
37 
38         $rndkey = array();
【4858.com】异常的赞的PHP字符串加密函数,php加密解密函数。39         for($i = 0; $i <= 255; $i++) {
40             $rndkey[$i] = ord($cryptkey[$i % $key_length]);
41         }
42 
43         for($j = $i = 0; $i < 256; $i++) {
44             $j = ($j + $box[$i] + $rndkey[$i]) % 256;
45             $tmp = $box[$i];
46             $box[$i] = $box[$j];
47             $box[$j] = $tmp;
48         }
49 
50         for($a = $j = $i = 0; $i < $string_length; $i++) {
51             $a = ($a + 1) % 256;
52             $j = ($j + $box[$a]) % 256;
53             $tmp = $box[$a];
54             $box[$a] = $box[$j];
55             $box[$j] = $tmp;
56             $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
57         }
58 
59         if($operation == ‘DECODE’) {
60             if((substr($result, 0, 10) == 0 || substr($result, 0, 10) – time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
61                 return substr($result, 26);
62             } else {
63                 return ”;
64             }
65         } else {
66             return $keyc.str_replace(‘=’, ”, base64_encode($result));
67         }
68 
69     }

// 密匙
$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);
//
明文,前12位用来保存时间戳,解密时证实数据有效性,10到二十八个人用来保存$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 <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
//
用固定的算法,打乱密匙簿,扩张随机性,好像很复杂,实际上对并不会追加密文的强度
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
// 主旨加解密部分
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
// 从密匙簿得出密匙举行异或,再转成字符
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) %
256]));
}
if($operation == ‘DECODE’) {
// substr($result, 0, 10) == 0 验证数占有效性
// substr($result, 0, 10) – time() > 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));
}
}

*@param string $key 秘钥

二〇一〇/6/4 改良了24行错误,特别多谢大唐秀提议此错误

// 密匙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到贰19人用来保存$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 <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
//
用固定的算法,打乱密匙簿,扩大随机性,好像很复杂,实际上对并不会增加密文的强度
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i]4858.com, + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
// 大旨加解密部分
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
// 从密匙簿得出密匙举办异或,再转成字符
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) %
256]));
}
if($operation == ‘DECODE’) {
// substr($result, 0, 10) == 0 验证数据有效性
// substr($result, 0, 10) – time() > 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用户密码加密算法深入分析【Discuz加密算法】
  • discuz程序的PHP加密函数原理分析
  • Discuz论坛密码与密保加密准则
  • 浅谈discuz密码加密的点子
  • discuz加密解密函数使用格局和中文注释
  • 2个比较精粹的PHP加密解密函数分享
  • PHP完成加密的二种办法介绍
  • PHP中加密解密函数与DES加密解密实例
  • php中AES加密解密的事例小结
  • php中base64_decode与base64_encode加密解密函数实例
  • PHP可逆加密/解密函数分享
  • PHP 加密解密内部算法
  • php加密之discuz内容美丽加密方法实例详解

*@param int $expiry 秘钥保质期


而是多少缺憾,那几个函数全数权属于康盛创想,并不能轻便使用的

*/

您大概感兴趣的文章:

  • php用户密码加密算法深入分析【Discuz加密算法】
  • discuz authcode
    卓绝php加密解密函数剖析
  • Discuz论坛密码与密保加密法则
  • 浅谈discuz密码加密的措施
  • discuz加密解密函数使用方法和国文注释
  • 2个相比卓越的PHP加密解密函数分享
  • PHP完结加密的二种方法介绍
  • PHP中加密解密函数与DES加密解密实例
  • php中AES加密解密的事例小结
  • php中base64_decode与base64_encode加密解密函数实例
  • PHP可逆加密/解密函数分享
  • PHP 加密解密内部算法
  • php加密之discuz内容卓越加密方法实例详解

 public static function authcode($string,  $operation = ‘DECODE’,  $key
= ”,  $expiry = 0) {

        // 动态密匙长度,同样的明文仲生成分裂密文就是依据动态密匙

        //
到场随机密钥,能够令密文无其余规律,即就是原著和密钥一模二样,加密结果也会每一回不一样,增大破解难度。

        // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length
次方

        // 当此值为 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);

        //
明文,前12个人用来保存时间戳,解密时表达数据有效性,10到二十几个人用来保存$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  <=  255;  $i++) {

            $rndkey[$i] = ord($cryptkey[$i % $key_length]);

        }

        //
用固定的算法,打乱密匙簿,增添随机性,好像很复杂,实际上并不会追加密文的强度

        for($j = $i = 0;  $i < 256;  $i++) {

            $j = ($j + $box[$i] + $rndkey[$i]) % 256;

            $tmp = $box[$i];

            $box[$i] = $box[$j];

            $box[$j] = $tmp;

        }

        // 主旨加解密部分

        for($a = $j = $i = 0;  $i < $string_length;  $i++) {

            $a = ($a + 1) % 256;

            $j = ($j + $box[$a]) % 256;

            $tmp = $box[$a];

            $box[$a] = $box[$j];

            $box[$j] = $tmp;

            // 从密匙簿得出密匙实行异或,再转成字符

            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] +
$box[$j]) % 256]));

        }

        if($operation  ==  ‘DECODE’) {

            // substr($result,  0,  10)  ==  0 验证数据有效性

            // substr($result,  0,  10) – time() > 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));

        }

    }

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有