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

从F到0 - From F to 0

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

[PHP/ASP/JSP] 64位PHP7计算MD5纯算法公式源码正式版 (与系统内置函数结果一致,各种长度已测试通过)

[复制链接]
发表于 2019-4-12 17:10:32 | 显示全部楼层 |阅读模式
本帖最后由 QAQ 于 2019-4-13 09:06 编辑

QQ拼音截图20190412170723.png



  1. <?php
  2. define("ss",[[7,12,17,22],[5,9,14,20],[4,11,16,23],[6,10,15,21]]);
  3. define("ti",[
  4.         0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
  5.         0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,
  6.         0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,
  7.         0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,
  8.         0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
  9.         0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,
  10.         0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,
  11.         0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,
  12.         0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,
  13.         0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,
  14.         0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,
  15.         0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,
  16.         0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
  17.         ]);

  18.         function and32(&$value){
  19.                 $value&= 0xFFFFFFFF;
  20.         }
  21.         function rol32($v,$b){
  22.                 and32($v);
  23.                 $b &= 31;
  24.                 $v = $v << $b | $v >> 32-$b;
  25.                 return $v;
  26.         }

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

  29. }

  30. function ReverseIntBytes($int){
  31.         return ReverseShortBytes($int & 0xFFFF) << 16 | ReverseShortBytes($int >> 16);
  32. }


  33. function bin2array($bin){
  34.         $return = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
  35.         for($i=0;$i<64;$i++){
  36.                 $return[$i>>2] |= ord($bin[$i]) << (($i&3)<<3);
  37.         }
  38.         return $return;
  39. }




  40. function dechex8($value,$rib = 0){
  41.         and32($value);
  42.         $value = $rib ? ReverseIntBytes($value) : $value;
  43.         $return = dechex($value);
  44.         do {
  45.         $return = chr(48).$return;
  46.         } while(strlen($return) < 8);
  47.         return substr($return,-8);
  48. }

  49. function md5_($data,$raw = 0){
  50.         $AA = 0x67452301;$BB = 0xefcdab89;   
  51.         $CC = 0x98badcfe;$DD = 0x10325476;
  52.         $len = strlen($data);
  53.         $gn=(($len+8)>>6)+1;
  54.         $s128 = 0;
  55.         $data64 = str_split($data,64);
  56.                 for($i=1;$i<=$gn;$i++){
  57.                         $len64 = strlen($data64[$i-1] ?? null);
  58.                         if(!$len64) $data64[$i-1] = null;
  59.                         if($len64 != 64){
  60.                         if(!$s128){
  61.                                 $s128 = 1;
  62.                                 $len64++;
  63.                                 $data64[$i-1].=chr(128);
  64.                         }
  65.                         $k = $i == $gn ? 56 : 64;
  66.                         for($j=$len64;$j<$k;$j++){
  67.                                 $data64[$i-1].=chr(0);
  68.                         }
  69.                         if($k == 56){
  70.                         $hex = dechex($len << 3);
  71.                                 do {
  72.                                 $hex = chr(48).$hex;
  73.                                 } while(strlen($hex) <16);
  74.                                 $hex = substr($hex,-16);
  75.                                 $data64[$i-1].= strrev(hex2bin($hex));
  76.                         }
  77.                                
  78.                         }

  79.         $d16 = bin2array($data64[$i-1]);
  80.         $A = $AA;$B=$BB;$C=$CC;$D=$DD;
  81.                 for($a=0;$a<64;$a++){
  82.                 switch($a>>4){
  83.                         case 0:$g=($B&$C)|((~$B)&$D);$c=$a;break;
  84.                         case 1:$g=($D&$B)|((~$D)&$C);$c=5*$a+1;break;
  85.                         case 2:$g=$B^$C^$D;$c=3*$a+5;break;
  86.                         case 3:$g=$C^($B|(~$D));$c=7*$a;break;
  87.                 }
  88.                 $A=$B+rol32($A+$g+$d16[$c&15]+ti[$a],ss[$a>>4][$a&3]);
  89.                         $aa=$A;$bb=$B;$cc=$C;$dd=$D;
  90.                         $A=$dd;$B=$aa;$C=$bb;$D=$cc;
  91.                                 }
  92.                         $AA+=$A;$BB+=$B;$CC+=$C;$DD+=$D;
  93.                         and32($AA);and32($BB);
  94.                         and32($CC);and32($DD);

  95.                 }

  96.                 $return = dechex8($AA,1);
  97.                 $return .= dechex8($BB,1);
  98.                 $return .= dechex8($CC,1);
  99.                 $return .= dechex8($DD,1);
  100.                 return $raw ? hex2bin($return) : $return;
  101.         }
  102. //=========================================
  103. $len = 0;
  104. while(1){
  105. $data = null;

  106. for($i=0;$i<$len;$i++){
  107.         $data.=chr(rand(0,255));
  108. }
  109.         $b = rand(0,1);
  110.         $user_md5 = md5_($data,$b);
  111.         $system_md5 = md5($data,$b);

  112. if($user_md5 != $system_md5){
  113. exit("Error! {$len} {$user_md5} {$system_md5}");
  114. while(1);
  115. } else {
  116. echo "OK!! {$len} {$user_md5}\r\n";
  117. }

  118. $len++;
  119. }

  120. ?>



复制代码

相关帖子

发表于 2019-4-12 17:33:10 来自手机 | 显示全部楼层
小弟看不懂,注释也没
发表于 2019-4-17 23:48:14 | 显示全部楼层
之前有个人发的算法有问题,所以进了回收站。
您需要登录后才可以回帖 登录 | 注册已关闭

本版积分规则

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

腾讯云安全认证

GMT+8, 2024-4-29 07:00 , Processed in 1.850106 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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