php - 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 哈希完成此操作。欢迎任何帮助,谢谢
解决方案
推荐阅读
- python - 颠倒行序和操作效率
- javascript - 如何制作与另一个按钮相同的按钮?
- c++ - 为什么 const 引用不能延长通过函数传递的临时对象的寿命?
- php - 更新同一表的另一列后如何更新列?
- angular - 如何将 HTTP/2 用于 manifest.json?
- vagrant - vagrant 命令 - vagrant init 与 add
- android - 错误代码 9003,“places_api_access_not_configured”使用 google place api 和 android
- python - 有没有办法可以替换/删除字符串中除某些短语之外的所有内容?
- vue.js - 如何根据条件显示选择?(元素-ui表)
- drupal-8 - 使用暴露过滤器时如何在 drupal 8 页面管理器中更改 URL