设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 7387|回复: 5
收起左侧

[PHP/ASP/JSP] 64位PHP7计算SHA1哈希摘要散列加密算法公式正式版(各种长度数据已与内置函数比对通过)

[复制链接]
发表于 2019-4-22 21:31:24 | 显示全部楼层 |阅读模式
本帖最后由 QAQ 于 2019-4-22 21:32 编辑

QQ拼音截图20190422212756.png




  1. <?php
  2. $int_data = array();
  3. $int_size = 0;
  4. function dechex8($value,$rib = 0){
  5.         and32($value);
  6.         $value = $rib ? ReverseIntBytes($value) : $value;
  7.         $return = dechex($value);
  8.         do {
  9.         $return = chr(48).$return;
  10.         } while(strlen($return) < 8);
  11.         return substr($return,-8);
  12. }


  13. function and32(&$value){
  14.                 $value&= 0xFFFFFFFF;
  15. }
  16. function rol32($v,$b){
  17.         and32($v);
  18.         $b &= 31;
  19.         $v = $v << $b | $v >> 32-$b;
  20.         return $v;
  21. }

  22. function ReverseShortBytes($short){
  23.         return ($short&255)<<8|($short>>8);

  24. }

  25. function ReverseIntBytes($int){
  26.         return ReverseShortBytes($int & 0xFFFF) << 16 | ReverseShortBytes($int >> 16);
  27. }

  28. function bin2array($bin,$xor3 = 0){
  29.         $len = strlen($bin);
  30.         for($i=0;$i<$len;$i++){
  31.                 @$return[$i>>2] |= ord($bin[$i]) << (($i&3^($xor3?3:0))<<3);
  32.         }
  33.         return $return ?? array(0);
  34. }
  35. function sha1_read_int_data($address){
  36.         global $len;

  37.         if($address == ($len >> 5)){
  38.         return sha1_read_int_data2($len>>5) | (128 << ((24-$len)&31));
  39.         } elseif($address == (((($len+64) >> 9)<<4)+15)){
  40.                 return $len;
  41.         }
  42.         return sha1_read_int_data2($address);
  43.                
  44. }
  45. function sha1_read_int_data2($address){
  46.         global $int_size,$int_data;
  47.         if($address >= $int_size) return 0;
  48.         return $int_data[$address];
  49. }

  50. function sha1_kt($t){
  51.         if($t < 20){
  52.         return 0x5A827999;
  53.         } elseif($t < 40){
  54.         return 0x6ED9EBA1;
  55.         } elseif($t < 60){
  56.         return 0x8F1BBCDC;
  57.         }
  58.         return 0xCA62C1D6;
  59. }


  60. function sha1_ft($t,$b,$c,$d){

  61.         if($t < 20){
  62.         return ($b&$c) | ((0xFFFFFFFF^$b)&$d);
  63.         } elseif($t < 40){
  64.         return $b^$c^$d;
  65.         } elseif($t < 60){
  66.         return ($b&$c) | ($b&$d) | ($c&$d);
  67.         }
  68.         return $b^$c^$d;
  69. }


  70. function sha1_($data,$raw =0){
  71.         global $int_data,$int_size,$len;
  72.         $len = strlen($data) << 3;
  73.         $int_data = bin2array($data,1);
  74.         $int_data2 = array();
  75.         $int_size = sizeof($int_data);
  76.         $a = 0x67452301;
  77.         $b = 0xEFCDAB89;
  78.         $c = 0x98BADCFE;
  79.         $d = 0x10325476;
  80.         $e = 0xC3D2E1F0;
  81.         $while_size = ((($len+64)>>9)<<4)+16;
  82.         for($i=0;$i < $while_size;$i+=16){
  83.                 $oa = $a;$ob = $b;$oc = $c;$od = $d;$oe = $e;
  84.                         for($j=0;$j<80;$j++){
  85.                         if($j < 16){
  86.                                 $int_data2[$j] = sha1_read_int_data($i+$j);
  87.                         } else {
  88.                                 $int_data2[$j] = rol32($int_data2[$j-3] ^ $int_data2[$j-8] ^ $int_data2[$j-14] ^ $int_data2[$j-16],1);
  89.                         }
  90.                                 $t = rol32($a,5) + sha1_ft($j,$b,$c,$d) + $e + $int_data2[$j] + sha1_kt($j);
  91.                                 and32($t);
  92.                                 $e = $d;$d = $c;
  93.                                 $c = rol32($b,30);
  94.                                 $b = $a;$a = $t;
  95.                         }
  96.         
  97.                 $a+=$oa;$b+=$ob;$c+=$oc;$d+=$od;$e+=$oe;
  98.                 and32($a);and32($b);and32($c);and32($d);and32($e);


  99.         }

  100.         $return = dechex8($a);
  101.         $return .= dechex8($b);
  102.         $return .= dechex8($c);
  103.         $return .= dechex8($d);
  104.         $return .= dechex8($e);
  105.         return $raw ? hex2bin($return) : $return;

  106. }

  107. //=========================================

  108. $len2 = 0;
  109. $data = null;
  110. while(1){





  111.         $b = rand(0,1);
  112.         $user_sha1 = sha1_($data,$b);
  113.         $system_sha1 = sha1($data,$b);

  114. if($user_sha1 != $system_sha1){
  115. echo "Error! {$len2} {$user_sha1} {$system_sha1}";
  116. while(1);
  117. }
  118. echo "OK!! {$len2} {$user_sha1}\r\n";

  119. $data.=chr(rand(0,255));
  120. $len2++;
  121. }

  122. ?>


复制代码
发表于 2019-4-23 10:02:24 | 显示全部楼层
表示看不懂
您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-28 14:16 , Processed in 1.168066 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表