观察一下就可以发现,这个代码是改写asp里的,只是仿写,所以调试时出错,我修改了一下错误,结果发现还是不能正确输出结果,不是哪位能给指点一下<?php
define("BITS_TO_A_BYTE",8);
define("BYTES_TO_A_WORD",4);
define("BITS_TO_A_WORD",32);
$m_lOnBits=array(30);  //ASP函数中的定义变量数组,这里没有用到
$m_l2Power=array(30);function LShift($lValue,$iShiftBits)
{
        if ($iShiftBits==0) return $lValue;
        if ($iShiftBits==31)
        {
                if ($lValue&1) { return 0x80000000; }
                else { return 0; }
        }
        if ($iShiftBits < 0 || $iShiftBits > 31) { }
        if (($lValue&$GLOBALS[31-$iShiftBits]))
        {        $tmpstr=(($lValue&$GLOBALS[31-($iShiftBits+1)])*$GLOBALS[$iShiftBits])|0x80000000; }
        else
        { $tmpstr=(($lValue&$GLOBALS[31-$iShiftBits])*$GLOBALS[$iShiftBits]); }
        return $tmpstr;
}function RShift($lValue,$iShiftBits)
{
        if ($iShiftBits==0)return $lValue;
        if ($iShiftBits==31)
        {
                if ($lValue&0x80000000) { return 1; }
                else { return 0; }
        }
        if ($iShiftBits<0 || $iShiftBits>31) { }
        $tmpstr=floor(($lValue&0x7FFFFFFE)/$GLOBALS[$iShiftBits]);
        if ($lValue&0x80000000) { $tmpstr=$tmpstr|floor(0x40000000/$GLOBALS[$iShiftBits-1]); }
        return $tmpstr;
}function RotateLeft($lValue,$iShiftBits)
{
        return LShift($lValue,$iShiftBits)|RShift($lValue,(32-$iShiftBits));
}function AddUnsigned($lX,$lY)
{
        $lX8=$lX&0x80000000;
        $lY8=$lY&0x80000000;
        $lX4=$lX&0x40000000;
        $lY4=$lY&0x40000000;
        $lResult=($lX&0x3FFFFFFF)+($lY&0x3FFFFFFF);        if ($lX4&$lY4) { $lResult=$lResult^0x80000000^$lX8^$lY8; }
        if ($lX4|$lY4)
        {
                if ($lResult&0x40000000)
                { $lResult=$lResult^0xC0000000^$lX8^$lY8; }
                else
                { $lResult=$lResult^0x40000000^$lX8^$lY8; }
        }
        else
        { $lResult=$lResult^$lX8^$lY8; }
        return $lResult;
}function md5_F($x,$y,$z)
{
        return ($x&$y)|((~$x)&$z);
}function md5_G($x,$y,$z)
{
        return ($x&$z)|($y&(~$z));
}function md5_H($x,$y,$z)
{
        return ($x^$y^$z);
}function md5_I($x,$y,$z)
{
        return ($y^($x|(~$z)));
}function md5_FF(&$a,$b,$c,$d,$x,$s,$ac)
{
        $a=AddUnsigned($a,AddUnsigned(AddUnsigned(md5_F($b,$c,$d),$x),$ac));
        $a=RotateLeft($a,$s);
        $a=AddUnsigned($a,$b);
}function md5_GG(&$a,$b,$c,$d,$x,$s,$ac)
{
        $a=AddUnsigned($a,AddUnsigned(AddUnsigned(md5_G($b,$c,$d),$x),$ac));
        $a=RotateLeft($a,$s);
        $a=AddUnsigned($a,$b);
}function md5_HH(&$a,$b,$c,$d,$x,$s,$ac)
{
        $a=AddUnsigned($a,AddUnsigned(AddUnsigned(md5_H($b,$c,$d),$x),$ac));
        $a=RotateLeft($a,$s);
        $a=AddUnsigned($a,$b);
}function md5_II(&$a,$b,$c,$d,$x,$s,$ac)
{
        $a=AddUnsigned($a,AddUnsigned(AddUnsigned(md5_I($b,$c,$d),$x),$ac));
        $a=RotateLeft($a,$s);
        $a=AddUnsigned($a,$b);

解决方案 »

  1.   

    function ConvertToWordArray($sMessage)
    {
            $lWordArray=array();
            $MODULUS_BITS=512;
            $CONGRUENT_BITS=448;
            $lMessageLength=strlen($sMessage);
            $lNumberOfWords=(floor(($lMessageLength+floor(($MODULUS_BITS-$CONGRUENT_BITS)/BITS_TO_A_BYTE))/floor($MODULUS_BITS/BITS_TO_A_BYTE))+1)*floor($MODULUS_BITS/BITS_TO_A_WORD);
            $lBytePosition=0;
            $lByteCount=0;
            while(!($lByteCount>=$lMessageLength))
            {
                    $lWordCount=floor($lByteCount/BYTES_TO_A_WORD);
                    $lBytePosition=($lByteCount%BYTES_TO_A_WORD)*BITS_TO_A_BYTE;
                    $lWordArray[$lWordCount]=$lWordArray[$lWordCount]|LShift(ord(substr($sMessage,$lByteCount+1-1,1)),$lBytePosition);
                    $lByteCount=$lByteCount+1;
            }
            $lWordCount=floor($lByteCount/BYTES_TO_A_WORD);
            $lBytePosition=($lByteCount%BYTES_TO_A_WORD)*BITS_TO_A_BYTE;
            $lWordArray[$lWordCount]=$lWordArray[$lWordCount]|LShift(0x80,$lBytePosition);
            $lWordArray[$lNumberOfWords-2]=LShift($lMessageLength,3);
            $lWordArray[$lNumberOfWords-1]=RShift($lMessageLength,29);
            return $lWordArray;
    }function WordToHex($lValue)
    {
            $tmpstr="";
            for ($lCount=0; $lCount<=3; $lCount++)
            {
                    $lByte=RShift($lValue,$lCount*BITS_TO_A_BYTE)&$GLOBALS[BITS_TO_A_BYTE-1];
                     //$tmpstr=$tmpstr.(substr("0".dechex($lByte),strlen("0".dechex($lByte))-2));   //这行可能有问题,但我调试后发现没有错
                       $tmpstr=$tmpstr.(substr("0".dechex($lByte),-2,2)); 
            }
            return $tmpstr;
    }
    /*作者上面注释会在上面几行出错,但是仔细对照asp的MD5函数,发现并没错,翻译过去是正确的,下面是asp函数原型
    Private Function WordToHex(lValue) 
        Dim lByte 
        Dim lCount 
     
        For lCount = 0 To 3 
            lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1) 
            WordToHex = WordToHex & Right("0" & Hex(lByte), 2)   '取右侧两位
        Next 
    End Function 
    */
    function php_MD5($sMessage)
    {
            $GLOBALS[0]=intval(1);
            $GLOBALS[1]=intval(3);
            $GLOBALS[2]=intval(7);
            $GLOBALS[3]=intval(15);
            $GLOBALS[4]=intval(31);
            $GLOBALS[5]=intval(63);
            $GLOBALS[6]=intval(127);
            $GLOBALS[7]=intval(255);
            $GLOBALS[8]=intval(511);
            $GLOBALS[9]=intval(1023);
            $GLOBALS[10]=intval(2047);
            $GLOBALS[11]=intval(4095);
            $GLOBALS[12]=intval(8191);
            $GLOBALS[13]=intval(16383);
            $GLOBALS[14]=intval(32767);
            $GLOBALS[15]=intval(65535);
            $GLOBALS[16]=intval(131071);
            $GLOBALS[17]=intval(262143);
            $GLOBALS[18]=intval(524287);
            $GLOBALS[19]=intval(1048575);
            $GLOBALS[20]=intval(2097151);
            $GLOBALS[21]=intval(4194303);
            $GLOBALS[22]=intval(8388607);
            $GLOBALS[23]=intval(16777215);
            $GLOBALS[24]=intval(33554431);
            $GLOBALS[25]=intval(67108863);
            $GLOBALS[26]=intval(134217727);
            $GLOBALS[27]=intval(268435455);
            $GLOBALS[28]=intval(536870911);
            $GLOBALS[29]=intval(1073741823);
            $GLOBALS[30]=intval(2147483647);        $GLOBALS[0]=intval(1);  //明显出错,重复定义,以下均错误
            $GLOBALS[1]=intval(2);
            $GLOBALS[2]=intval(4);
            $GLOBALS[3]=intval(8);
            $GLOBALS[4]=intval(16);
            $GLOBALS[5]=intval(32);
            $GLOBALS[6]=intval(64);
            $GLOBALS[7]=intval(128);
            $GLOBALS[8]=intval(256);
            $GLOBALS[9]=intval(512);
            $GLOBALS[10]=intval(1024);
            $GLOBALS[11]=intval(2048);
            $GLOBALS[12]=intval(4096);
            $GLOBALS[13]=intval(8192);
            $GLOBALS[14]=intval(16384);
            $GLOBALS[15]=intval(32768);
            $GLOBALS[16]=intval(65536);
            $GLOBALS[17]=intval(131072);
            $GLOBALS[18]=intval(262144);
            $GLOBALS[19]=intval(524288);
            $GLOBALS[20]=intval(1048576);
            $GLOBALS[21]=intval(2097152);
            $GLOBALS[22]=intval(4194304);
            $GLOBALS[23]=intval(8388608);
            $GLOBALS[24]=intval(16777216);
            $GLOBALS[25]=intval(33554432);
            $GLOBALS[26]=intval(67108864);
            $GLOBALS[27]=intval(134217728);
            $GLOBALS[28]=intval(268435456);
            $GLOBALS[29]=intval(536870912);
            $GLOBALS[30]=intval(1073741824);        $S11=7;
            $S12=12;
            $S13=17;
            $S14=22;
            $S21=5;
            $S22=9;
            $S23=14;
            $S24=20;
            $S31=4;
            $S32=11;
            $S33=16;
            $S34=23;
            $S41=6;
            $S42=10;
            $S43=15;
            $S44=21;        $x=ConvertToWordArray($sMessage);        $a=0x67452301;
            $b=0xEFCDAB89;
            $c=0x98BADCFE;
            $d=0x10325476;        for ($k=0; $k<=count($x); $k=$k+16)
            {
                    $AA=$a;
                    $BB=$b;
                    $CC=$c;
                    $DD=$d;
                    md5_FF($a,$b,$c,$d,$x[$k+0],$S11,0xD76AA478);
            md5_FF($d,$a,$b,$c,$x[$k+1],$S12,0xE8C7B756);
            md5_FF($c,$d,$a,$b,$x[$k+2],$S13,0x242070DB);
            md5_FF($b,$c,$d,$a,$x[$k+3],$S14,0xC1BDCEEE);
            md5_FF($a,$b,$c,$d,$x[$k+4],$S11,0xF57C0FAF);
            md5_FF($d,$a,$b,$c,$x[$k+5],$S12,0x4787C62A);
            md5_FF($c,$d,$a,$b,$x[$k+6],$S13,0xA8304613);
            md5_FF($b,$c,$d,$a,$x[$k+7],$S14,0xFD469501);
            md5_FF($a,$b,$c,$d,$x[$k+8],$S11,0x698098D8);
            md5_FF($d,$a,$b,$c,$x[$k+9],$S12,0x8B44F7AF);
            md5_FF($c,$d,$a,$b,$x[$k+10],$S13,0xFFFF5BB1);
            md5_FF($b,$c,$d,$a,$x[$k+11],$S14,0x895CD7BE);
            md5_FF($a,$b,$c,$d,$x[$k+12],$S11,0x6B901122);
            md5_FF($d,$a,$b,$c,$x[$k+13],$S12,0xFD987193);
            md5_FF($c,$d,$a,$b,$x[$k+14],$S13,0xA679438E);
            md5_FF($b,$c,$d,$a,$x[$k+15],$S14,0x49B40821);        md5_GG($a,$b,$c,$d,$x[$k+1],$S21,0xF61E2562);
            md5_GG($d,$a,$b,$c,$x[$k+6],$S22,0xC040B340);
            md5_GG($c,$d,$a,$b,$x[$k+11],$S23,0x265E5A51);
            md5_GG($b,$c,$d,$a,$x[$k+0],$S24,0xE9B6C7AA);
            md5_GG($a,$b,$c,$d,$x[$k+5],$S21,0xD62F105D);
            md5_GG($d,$a,$b,$c,$x[$k+10],$S22,0x2441453);
            md5_GG($c,$d,$a,$b,$x[$k+15],$S23,0xD8A1E681);
            md5_GG($b,$c,$d,$a,$x[$k+4],$S24,0xE7D3FBC8);
            md5_GG($a,$b,$c,$d,$x[$k+9],$S21,0x21E1CDE6);
            md5_GG($d,$a,$b,$c,$x[$k+14],$S22,0xC33707D6);
            md5_GG($c,$d,$a,$b,$x[$k+3],$S23,0xF4D50D87);
            md5_GG($b,$c,$d,$a,$x[$k+8],$S24,0x455A14ED);
            md5_GG($a,$b,$c,$d,$x[$k+13],$S21,0xA9E3E905);
            md5_GG($d,$a,$b,$c,$x[$k+2],$S22,0xFCEFA3F8);
            md5_GG($c,$d,$a,$b,$x[$k+7],$S23,0x676F02D9);
            md5_GG($b,$c,$d,$a,$x[$k+12],$S24,0x8D2A4C8A);        md5_HH($a,$b,$c,$d,$x[$k+5],$S31,0xFFFA3942);
            md5_HH($d,$a,$b,$c,$x[$k+8],$S32,0x8771F681);
            md5_HH($c,$d,$a,$b,$x[$k+11],$S33,0x6D9D6122);
            md5_HH($b,$c,$d,$a,$x[$k+14],$S34,0xFDE5380C);
            md5_HH($a,$b,$c,$d,$x[$k+1],$S31,0xA4BEEA44);
            md5_HH($d,$a,$b,$c,$x[$k+4],$S32,0x4BDECFA9);
            md5_HH($c,$d,$a,$b,$x[$k+7],$S33,0xF6BB4B60);
            md5_HH($b,$c,$d,$a,$x[$k+10],$S34,0xBEBFBC70);
            md5_HH($a,$b,$c,$d,$x[$k+13],$S31,0x289B7EC6);
            md5_HH($d,$a,$b,$c,$x[$k+0],$S32,0xEAA127FA);
            md5_HH($c,$d,$a,$b,$x[$k+3],$S33,0xD4EF3085);
            md5_HH($b,$c,$d,$a,$x[$k+6],$S34,0x4881D05);
            md5_HH($a,$b,$c,$d,$x[$k+9],$S31,0xD9D4D039);
            md5_HH($d,$a,$b,$c,$x[$k+12],$S32,0xE6DB99E5);
            md5_HH($c,$d,$a,$b,$x[$k+15],$S33,0x1FA27CF8);
            md5_HH($b,$c,$d,$a,$x[$k+2],$S34,0xC4AC5665);        md5_II($a,$b,$c,$d,$x[$k+0],$S41,0xF4292244);
            md5_II($d,$a,$b,$c,$x[$k+7],$S42,0x432AFF97);
            md5_II($c,$d,$a,$b,$x[$k+14],$S43,0xAB9423A7);
            md5_II($b,$c,$d,$a,$x[$k+5],$S44,0xFC93A039);
            md5_II($a,$b,$c,$d,$x[$k+12],$S41,0x655B59C3);
            md5_II($d,$a,$b,$c,$x[$k+3],$S42,0x8F0CCC92);
            md5_II($c,$d,$a,$b,$x[$k+10],$S43,0xFFEFF47D);
            md5_II($b,$c,$d,$a,$x[$k+1],$S44,0x85845DD1);
            md5_II($a,$b,$c,$d,$x[$k+8],$S41,0x6FA87E4F);
            md5_II($d,$a,$b,$c,$x[$k+15],$S42,0xFE2CE6E0);
            md5_II($c,$d,$a,$b,$x[$k+6],$S43,0xA3014314);
            md5_II($b,$c,$d,$a,$x[$k+13],$S44,0x4E0811A1);
            md5_II($a,$b,$c,$d,$x[$k+4],$S41,0xF7537E82);
            md5_II($d,$a,$b,$c,$x[$k+11],$S42,0xBD3AF235);
            md5_II($c,$d,$a,$b,$x[$k+2],$S43,0x2AD7D2BB);
            md5_II($b,$c,$d,$a,$x[$k+9],$S44,0xEB86D391);
                    $a=AddUnsigned($a,$AA);
                    $b=AddUnsigned($b,$BB);
                    $c=AddUnsigned($c,$CC);
                    $d=AddUnsigned($d,$DD);
            }
            return strtolower(WordToHex($a).WordToHex($b).WordToHex($c).WordToHex($d));
    }
           $aaa="abcd";   //这个函数是错误的,和php自带的md5结果不一致
         echo PHP_MD5($aaa);   //输出自定义函数结果
         echo "<br>".md5($aaa); //使用内置的函数返回结果
    ?>输出结果:80808000008080008080008000808000
    e2fc714c4727ee9395f324cd2e7f331f
      

  2.   

    问一下,楼主,不知道你有没有试过,相同的字符在ASP里MD5加密与PHP里MD5加密后生成的字符是一样的吗?
    我以前测试JAVA和PHP的是不一样的,虽然它们都是MD5加密,但是,不同语言的算法好象也不一样。
    所以应该不是楼主写法有错,而是它们本来的结果就不一样,至于应该怎么调成一样的,这个我也不懂。
      

  3.   

    嗯, 可爱的头像...
    加上"雪"这样的名字....让人不得不参与一下 :)md5应该结果都是一样的,无论哪种语言.
    不过这样查错很烦的,不知道你只是要一个php写的md5程序还是一定要把这个错找出来,..或者你把原ASP程序贴出来更好一点.我试了一下好像第一个函数LShift出来的结果就不对?
    容我再查在报......
    ==========================================================================
    欢迎加入以google wave为交流工具的PHP讨论组: [email protected]
    加入办法:
    1。 从你的gmail可以直接发信到 [email protected]
    2。 PM你的邮箱给我,我直接加入
    3。 到http://groups.google.com/group/phpwave/subscribe?note=1申请
       如果该网址不能访问请尝试 https://groups.google.com/group/phpwave/subscribe?note=1
          或 http://groups.google.co.uk/group/phpwave/subscribe?note=1 ...(或换其它国家域名) 
       
      

  4.   

    感谢楼上这位朋友,其实我调试地差不多了,只是在16进制上搞不清楚
       <% a = &H67452301 
        b = &HEFCDAB89 
        c = &H98BADCFE 
        d = &H10325476 
     response.write a&"-"&b&"-"&c&"-"&d&%>输出:1732584193--271733879--1732584194-271733878<?        $a=0x67452301;
            $b=0xEFCDAB89;
            $c=0x98BADCFE;
            $d=0x10325476;
     echo $a."-".$b."-".$c."-".$d;?>结果输出:1732584193-4023233417-2562383102-271733878请高手解答一下为何有这样的差异?
      

  5.   

    更直观一些,换成换行
       <% a = &H67452301 
        b = &HEFCDAB89 
        c = &H98BADCFE 
        d = &H10325476 
     response.write a&"<br>"&b&"<br>"&c&"<br>"&d&%>输出:
    1732584193
    -271733879
    -1732584194
    -271733878<?        $a=0x67452301;
            $b=0xEFCDAB89;
            $c=0x98BADCFE;
            $d=0x10325476;
     echo $a."<br>".$b."<br>".$c."<br>".$d;?>结果输出:
    1732584193
    4023233417
    2562383102
    271733878请高手解答一下为何有这样的差异?同样都是16进制,结果ASP输出了负数,php却是正数
      

  6.   

    更直观一些,换成换行
       <% a = &H67452301 
        b = &HEFCDAB89 
        c = &H98BADCFE 
        d = &H10325476 
     response.write a&"<br>"&b&"<br>"&c&"<br>"&d&%>结果输出:
    1732584193
    -271733879
    -1732584194
    271733878<?        $a=0x67452301;
            $b=0xEFCDAB89;
            $c=0x98BADCFE;
            $d=0x10325476;
     echo $a."<br>".$b."<br>".$c."<br>".$d;?>结果输出:
    1732584193
    4023233417
    2562383102
    271733878请高手解答一下为何有这样的差异?同样都是16进制,结果ASP输出了负数,php却是正数
      

  7.   


    我用過JAVA和PHP的md5 結果是一樣的
      

  8.   


    ASP 只是了解,沒有用過.不過樓主可以沿有C裏的 int, unsigned int 這個方面考慮
    ASP中最高位為1 的數,是不是會被解析為負數. 如何轉換才能不被解析為負數...
      

  9.   

    经过调试,发现ConvertToWordArray子函数有问题
      

  10.   

    php将正整数溢出为浮点数,而asp将正整数溢出为负数。因此$b和$c都已经是浮点数了。用$b=intval($b)一下强制转为整数,再echo就跟asp中的一样是负数了。
      

  11.   

    ConvertToWordArray函数里哪里出问题了!请楼主说明,谢谢,另外程序现在好用了吗?发出一份正确的代码呗
      

  12.   

    解决,楼主直接用php自带的函数md5就可以,结果和asp的md5结果一样。