PHP MD5实现不起作用

时间:2016-07-22 09:07:27

标签: php

 <?php

$var1;
$var2;

function strToBin($input)
{   
    global $var1;
    global $var2;

    $var1=0;
    $l=strlen($input);
    for($i=0;$i<$l;$i++)
    {
        $arr[$i]=ord($input[$i]);
    }
    for($i=0;$i<$l;$i++)
    {
        $ar2[$i]=sprintf("%08d",decbin($arr[$i]));
    }
    echo "<br><br>";
    print_r($ar2);
    echo "<br><br>";
    $var1=implode($ar2);
    echo "<br><br>";
    $var2=strlen($var1);
    echo strlen($var1);
}

function append()
{
    global $var1;
    global $var2;

    if (strlen($var1)%448==strlen($var1))
    {
        pad(448-strlen($var1));
    }

    else if(strlen($var1)%448!=0)
    {
        pad(strlen($var1)%448);
        echo "hello";

    }   
    else if (strlen($var1)%448==1)
    {
        pad(1);
    }
}

function pad($p)
{
    echo "<br>";
    echo $p;
    global $var1;
    if ($p==1)
    {
        $var1=$var1.(0b1);  
    }
    else 
    {   $var1=$var1.(0b1);

        for ($i=0;$i<$p-1;$i++)
        {
            $var1=$var1.(0b0);
        }
    }
    echo "<br>";    
    echo $var1;
}   

function add_len()
{
    global $var1;
    global $var2;

    $h=sprintf("%08d",decbin($var2));
    echo "<br>";
    echo $h;
    $len_h=strlen($h);

    while(64-$len_h!=0)
    {
        $h=$h.(0b0);
        $len_h++;
    }
    echo "<br><br>";

    $addstr=implode(array_reverse(str_split($h,8)));
    echo strlen($addstr);

    $var1=$var1.$addstr;
    echo "<br><br>";
    echo strlen($var1);
}


function F($X, $Y, $Z)  
{
    $X = hexdec($X);
    $Y = hexdec($Y);
    $Z = hexdec($Z);
    $calc = (($X & $Y) | ((~ $X) & $Z)); // X AND Y OR NOT X AND Z
    return  $calc; 
}

function G($X, $Y, $Z)
{
    $X = hexdec($X);
    $Y = hexdec($Y);
    $Z = hexdec($Z);
    $calc = (($X & $Z) | ($Y & (~ $Z))); // X AND Z OR Y AND NOT Z
    return  $calc;  
}

function H($X, $Y, $Z)
{
    $X = hexdec($X);
    $Y = hexdec($Y);
    $Z = hexdec($Z);
    $calc = ($X ^ $Y ^ $Z); // X XOR Y XOR Z
    return  $calc;  
}

function I($X, $Y, $Z)
{
    $X = hexdec($X);
    $Y = hexdec($Y);
    $Z = hexdec($Z);
    $calc = ($Y ^ ($X | (~ $Z))) ; // Y XOR (X OR NOT Z)
    return  $calc;  
}



function rotateL($a,$b)
{
    return dechex(($a<<$b)|($a>>(32-$b)));
}

function md()
{
    global $var1;
    $g;
    $cal;
    $A0="67452301";
    $B0="EFCDAB89";
    $C0="98BADCFE";
    $D0="10325476";

    $s=array( 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22
        ,5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20
        ,4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23
        ,6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21);

    print_r($s);

    $k=array( 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee
        ,0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501
        ,0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be
        ,0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821
        ,0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa
        ,0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8
        ,0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed
        ,0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a
        ,0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c
        ,0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70
        ,0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05
        ,0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665
        ,0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039
        ,0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1
        ,0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1
        ,0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391);

    $n=strlen($var1)/512;
    $var3=str_split($var1,512);

    for ($j=0;$j<$n;$j++)
    {   
        $A=$A0;
        $B=$B0;
        $C=$C0;
        $D=$D0;

        $M=str_split($var3[$j],32);

        for($i=0;$i<63;$i++)
        {
            if($i>=0&&$i<=15)
            {
                $cal=F($B,$C,$D);
                $g=$i;  
            }

            if($i>=16&&$i<=31)
            {
                $cal=G($B,$C,$D);
                $g=(5*$i+1)%16; 
            }

            if($i>=32&&$i<=47)
            {
                $cal=H($B,$C,$D);
                $g=(3*$i+5)%16; 
            }

            if($i>=48&&$i<=63)
            {
                $cal=I($B,$C,$D);
                $g=(7*$i)%16;   
            }

            $tempD=$D;
            $D=$C;
            $C=$B;
                 $B=$B+rotateL($A+$cal+hexdec($k[$i])+bindec($M[$g]),$s[$i]);//things
            $A=$tempD;
        }

        $A0=hexdec($A0);
        $B0=hexdec($B0);
        $C0=hexdec($C0);
        $D0=hexdec($D0);
        $A=hexdec($A);
        $B=hexdec($B);
        $C=hexdec($C);
        $D=hexdec($D);

        $A0=$A0+$A;
        $B0=$B0+$B;
        $C0=$C0+$C;
        $D0=$D0+$D;

        $A0=dechex($A0);
        $B0=dechex($B0);
        $C0=dechex($C0);
        $D0=dechex($D0);
        $A=dechex($A);
        $B=dechex($B);
        $C=dechex($C);
        $D=dechex($D);
    }
    $digest=$A0.$B0.$C0.$D0;

    echo "<br><br>";
    echo "The checksum is: ".$digest;       
}

$st="hello world!";
echo $st;


echo "<br>";
strToBin($st);
append();
add_len();

echo "<br><br><br>";
md();

echo"<br><br><br>";
echo $var2;

?>

我得错了校验和。我确定我搞砸了md()函数。一些帮助将不胜感激。正确的校验和是=“fc3ff98e8c6a0d3087d515c0473f8677”。

我在PHP中制作MD5加密程序。代码运行正常,只是输出不正确。它看起来像一个逻辑错误。

0 个答案:

没有答案