首页 > 解决方案 > PHP MD5 哈希算法给出错误的哈希

问题描述

作为我的 A-level 课程的一部分,我创建了一个 MD5 哈希算法。我花了很长时间试图弄清楚它是如何工作的,但我没有得到输入字符串的正确哈希值。

// Conversion of password to binary
    $String = "ab";
    $StringToBin = "";
    for ($x= 0; $x < strlen($String); $x++) {
        $CharToASCIINum = ord(substr($String,$x,1));
        $CharToBin = decbin($CharToASCIINum);
        while (strlen($CharToBin) < 8){
            $CharToBin = "0".$CharToBin;
        }
        $StringToBin .= $CharToBin; //.= means $stringToBinary + ...
    } 

    //Add padding bits
    $PaddedString = $StringToBin."1";
    while (Strlen($PaddedString) < (448%512)){
        $PaddedString .="0";
    }
    
    // Append 64 bit representation
    $LenStringToBin = decbin(strlen($StringToBin));
    while ( strlen($LenStringToBin)< 64){
            $LenStringToBin = "0".$LenStringToBin;
        }
    $PlainText = $PaddedString.$LenStringToBin;
    print $PlainText;
    print "<br></br>";
    //Initialise Buffers as constants
    $A0=0x67452301;
    $B0=0xefcdab89;
    $C0=0x98badcfe;
    $D0=0x10325476;
    
    //Split plain text into 16 words of 32 bits
    $M = str_split($PlainText,32);
    //Values of circular left shift
    $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 );

    
    //Values of constants
    for ($x = 0; $x <=63; $x++){
        $K[$x]= floor(abs(sin($x + 1))*(2**32));
    }
    //Main loop Calculating hash
    $A=intval($A0);
    $B=intval($B0);
    $C=intval($C0);
    $D=intval($D0);
    for ($i = 0; $i <= 63; $i++){
        if ($i >=0 and $i <=15){
            $F =(($B and $C) or ((!$B) and $D));
            $g = $i;
        }elseif ($i >= 16 and $i <= 31){
            $F=(($D and $B) or ($C and (!$D)));
            $g=(5* $i+1)%16;
        }elseif ($i >= 32 and $i <= 47){
            $F= ($B xor $C xor $D);
            $g=(3*$i+5)%16;
        }elseif ($i >= 48 and $i <= 63){
            $F=($C xor($B or (!$D)));
            $g=(7*$i)%16;
        }
        $Result =((((($F + $A)%4294967296)+bindec($M[$g]))%4294967296)+ $K[$i])%4294967296;
        
        // circular left shift
        $Result = decbin($Result);
        for ($x = 0; $x <= $S[$i]; $x++){
            $Temp = substr($Result,0,1);
            $Result = substr($Result,1,strlen($Result)-1).$Temp;
        }
 
    
        $Result = str_pad(decbin((bindec($Result)+$B)%4294967296),32,"0",STR_PAD_LEFT);
        
        
        $A = $D;
        $D = $C;
        $C = $B;
        $B = bindec($Result);
        
    }
    
    
    $A0 = (intval($A0) + $A)%4294967296;
    
    $B0 = ($B0 +$B)%4294967296;
    
    $C0 = ($C0 +$C)%4294967296;
    
    $D0 = ($D0 +$D)%4294967296;
    
    
    $Hash = dechex($A0).dechex($B0).dechex($C0).dechex($D0);
    print $Hash;

我相信问题出在我显示缓冲区的位置,但是我在任何地方都找不到如何为 MD5 哈希完成此操作。欢迎任何帮助,谢谢

标签: phphashmd5

解决方案


推荐阅读