|
本帖最后由 QAQ 于 2019-4-22 21:32 编辑
- <?php
- $int_data = array();
- $int_size = 0;
- function dechex8($value,$rib = 0){
- and32($value);
- $value = $rib ? ReverseIntBytes($value) : $value;
- $return = dechex($value);
- do {
- $return = chr(48).$return;
- } while(strlen($return) < 8);
- return substr($return,-8);
- }
- function and32(&$value){
- $value&= 0xFFFFFFFF;
- }
- function rol32($v,$b){
- and32($v);
- $b &= 31;
- $v = $v << $b | $v >> 32-$b;
- return $v;
- }
- function ReverseShortBytes($short){
- return ($short&255)<<8|($short>>8);
- }
- function ReverseIntBytes($int){
- return ReverseShortBytes($int & 0xFFFF) << 16 | ReverseShortBytes($int >> 16);
- }
- function bin2array($bin,$xor3 = 0){
- $len = strlen($bin);
- for($i=0;$i<$len;$i++){
- @$return[$i>>2] |= ord($bin[$i]) << (($i&3^($xor3?3:0))<<3);
- }
- return $return ?? array(0);
- }
- function sha1_read_int_data($address){
- global $len;
- if($address == ($len >> 5)){
- return sha1_read_int_data2($len>>5) | (128 << ((24-$len)&31));
- } elseif($address == (((($len+64) >> 9)<<4)+15)){
- return $len;
- }
- return sha1_read_int_data2($address);
-
- }
- function sha1_read_int_data2($address){
- global $int_size,$int_data;
- if($address >= $int_size) return 0;
- return $int_data[$address];
- }
- function sha1_kt($t){
- if($t < 20){
- return 0x5A827999;
- } elseif($t < 40){
- return 0x6ED9EBA1;
- } elseif($t < 60){
- return 0x8F1BBCDC;
- }
- return 0xCA62C1D6;
- }
- function sha1_ft($t,$b,$c,$d){
- if($t < 20){
- return ($b&$c) | ((0xFFFFFFFF^$b)&$d);
- } elseif($t < 40){
- return $b^$c^$d;
- } elseif($t < 60){
- return ($b&$c) | ($b&$d) | ($c&$d);
- }
- return $b^$c^$d;
- }
- function sha1_($data,$raw =0){
- global $int_data,$int_size,$len;
- $len = strlen($data) << 3;
- $int_data = bin2array($data,1);
- $int_data2 = array();
- $int_size = sizeof($int_data);
- $a = 0x67452301;
- $b = 0xEFCDAB89;
- $c = 0x98BADCFE;
- $d = 0x10325476;
- $e = 0xC3D2E1F0;
- $while_size = ((($len+64)>>9)<<4)+16;
- for($i=0;$i < $while_size;$i+=16){
- $oa = $a;$ob = $b;$oc = $c;$od = $d;$oe = $e;
- for($j=0;$j<80;$j++){
- if($j < 16){
- $int_data2[$j] = sha1_read_int_data($i+$j);
- } else {
- $int_data2[$j] = rol32($int_data2[$j-3] ^ $int_data2[$j-8] ^ $int_data2[$j-14] ^ $int_data2[$j-16],1);
- }
- $t = rol32($a,5) + sha1_ft($j,$b,$c,$d) + $e + $int_data2[$j] + sha1_kt($j);
- and32($t);
- $e = $d;$d = $c;
- $c = rol32($b,30);
- $b = $a;$a = $t;
- }
-
- $a+=$oa;$b+=$ob;$c+=$oc;$d+=$od;$e+=$oe;
- and32($a);and32($b);and32($c);and32($d);and32($e);
- }
- $return = dechex8($a);
- $return .= dechex8($b);
- $return .= dechex8($c);
- $return .= dechex8($d);
- $return .= dechex8($e);
- return $raw ? hex2bin($return) : $return;
- }
- //=========================================
- $len2 = 0;
- $data = null;
- while(1){
- $b = rand(0,1);
- $user_sha1 = sha1_($data,$b);
- $system_sha1 = sha1($data,$b);
- if($user_sha1 != $system_sha1){
- echo "Error! {$len2} {$user_sha1} {$system_sha1}";
- while(1);
- }
- echo "OK!! {$len2} {$user_sha1}\r\n";
- $data.=chr(rand(0,255));
- $len2++;
- }
- ?>
复制代码 |
|