PHP COntinued...
function DigestHex($strHex,$strH0,$strH1,$strH2,$strH3,$strH4)
{
extract($GLOBALS);
//Constant hex words are used for encryption, these can be any valid 8 digit hex value
$strK[0]="5A827999";
$strK[1]="6ED9EBA1";
$strK[2]="8F1BBCDC";
$strK[3]="CA62C1D6";
//Hex words are used in the encryption process, these can be any valid 8 digit hex value
$strH[0]=$strH0;
$strH[1]=$strH1;
$strH[2]=$strH2;
$strH[3]=$strH3;
$strH[4]=$strH4;
//divide the Hex block into 16 hex words
for ($intPos=0; $intPos<=(strlen($strHex)/8)-1; $intPos=$intPos+1)
{
$strWords[intval($intPos)]=substr($strHex,(intval($intPos)*8)+1-1,8);
}
//encode the Hex words using the constants above
//innitialize 80 hex word positions
for ($intPos=16; $intPos<=79; $intPos=$intPos+1)
{
$strTemp=$strWords[intval($intPos)-3];
$strTemp1=HexBlockToBinary($strTemp);
$strTemp=$strWords[intval($intPos)-8];
$strTemp2=HexBlockToBinary($strTemp);
$strTemp=$strWords[intval($intPos)-14];
$strTemp3=HexBlockToBinary($strTemp);
$strTemp=$strWords[intval($intPos)-16];
$strTemp4=HexBlockToBinary($strTemp);
$strTemp=BinaryXOR($strTemp1,$strTemp2);
$strTemp=BinaryXOR($strTemp,$strTemp3);
$strTemp=BinaryXOR($strTemp,$strTemp4);
$strWords[intval($intPos)]=BlockToHex(BinaryShift($strTemp,1));
print "<br>->".$strWords[intval($intPos)]."<br>";
}
//initialize the changing word variables with the initial word variables
$strA[0]=$strH[0];
$strA[1]=$strH[1];
$strA[2]=$strH[2];
$strA[3]=$strH[3];
$strA[4]=$strH[4];
//print "<br>->".$strWords[0]."<br>";
//Main encryption loop on all 80 hex word positions
for ($intPos=0; $intPos<=79; $intPos=$intPos+1)
{
$strTemp=BinaryShift(HexBlockToBinary($strA[0]),5);
$strTemp1=HexBlockToBinary($strA[3]);
$strTemp2=HexBlockToBinary($strWords[intval($intPos)]);
print "<br>".$intPos." -> ".$strA[4]."<br>";
switch ($intPos)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
$strTemp3=HexBlockToBinary($strK[0]);
$strTemp4=BinaryOR(BinaryAND(HexBlockToBinary($strA[1]),
HexBlockToBinary($strA[2])),BinaryAND(BinaryNOT(HexBlockToBinary($strA[1])),
HexBlockToBinary($strA[3])));
echo "<br> - > Case1";
break;
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
$strTemp3=HexBlockToBinary($strK[1]);
$strTemp4=BinaryXOR(BinaryXOR(HexBlockToBinary($strA[1]),
HexBlockToBinary($strA[2])),HexBlockToBinary($strA[3]));
break;
case 40:
case 41:
case 42:
case 43:
case 44:
case 45:
case 46:
case 47:
case 48:
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
case 58:
case 59:
$strTemp3=HexBlockToBinary($strK[2]);
$strTemp4=BinaryOR(BinaryOR(BinaryAND(HexBlockToBinary($strA[1]),
HexBlockToBinary($strA[2])),BinaryAND(HexBlockToBinary($strA[1]),
HexBlockToBinary($strA[3]))),BinaryAND(HexBlockToBinary($strA[2]),
HexBlockToBinary($strA[3])));
break;
case 60:
case 61:
case 62:
case 63:
case 64:
case 65:
case 66:
case 67:
case 68:
case 69:
case 70:
case 71:
case 72:
case 73:
case 74:
case 75:
case 76:
case 77:
case 78:
case 79:
$strTemp3=HexBlockToBinary($strK[3]);
$strTemp4=BinaryXOR(BinaryXOR(HexBlockToBinary($strA[1]),
HexBlockToBinary($strA[2])),HexBlockToBinary($strA[3]));
break;
}
$strTemp=BlockToHex($strTemp);
$strTemp1=BlockToHex($strTemp1);
$strTemp2=BlockToHex($strTemp2);
$strTemp3=BlockToHex($strTemp3);
$strTemp4=BlockToHex($strTemp4);
$strTemp=HexAdd($strTemp,$strTemp1);
$strTemp=HexAdd($strTemp,$strTemp2);
$strTemp=HexAdd($strTemp,$strTemp3);
$strTemp=HexAdd($strTemp,$strTemp4);
$strA[4]=$strA[3];
$strA[3]=$strA[2];
$strA[2]=BlockToHex(BinaryShift(HexBlockToBinary($strA[1]),30));
$strA[1]=$strA[0];
$strA[0]=$strTemp;
}
//Concatenate the final Hex Digest
$function_ret=$strA[0].$strA[1].$strA[2].$strA[3].$strA[4];
return $function_ret;
}
function HexAdd($strHex1,$strHex2)
{
extract($GLOBALS);
$intCalc=0;
$intCalc=doubleval(doubleval(HexToInt($strHex1))+doubleval(HexToInt($strHex2)));
while(doubleval($intCalc)> pow(2,32))
{
$intCalc=doubleval($intCalc)- pow(2,32);
}
$strNew=IntToBinary(doubleval($intCalc));
while(strlen($strNew)<32)
{
$strNew="0".$strNew;
}
$strNew=BlockToHex($strNew);
if ((strpos($strNew,"00") ? strpos($strNew,"00")+1 : 0)==1 && strlen($strNew)==10)
{
$strNew=substr($strNew,strlen($strNew)-(8));
}
$function_ret=$strNew;
return $function_ret;
}
function getHexDec($strHex)
{
extract($GLOBALS);
switch ($strHex)
{
case "0":
$function_ret=0;
break;
case "1":
$function_ret=1;
break;
case "2":
$function_ret=2;
break;
case "3":
$function_ret=3;
break;
case "4":
$function_ret=4;
break;
case "5":
$function_ret=5;
break;
case "6":
$function_ret=6;
break;
case "7":
$function_ret=7;
break;
case "8":
$function_ret=8;
break;
case "9":
$function_ret=9;
break;
case "A":
$function_ret=10;
break;
case "B":
$function_ret=11;
break;
case "C":
$function_ret=12;
break;
case "D":
$function_ret=13;
break;
case "E":
$function_ret=14;
break;
case "F":
$function_ret=15;
break;
default:
$function_ret=-1;
break;
}
return $function_ret;
}
function getDecHex($strHex)
{
extract($GLOBALS);
switch (intval($strHex))
{
case 0:
$function_ret="0";
break;
case 1:
$function_ret="1";
break;
case 2:
$function_ret="2";
break;
case 3:
$function_ret="3";
break;
case 4:
$function_ret="4";
break;
case 5:
$function_ret="5";
break;
case 6:
$function_ret="6";
break;
case 7:
$function_ret="7";
break;
case 8:
$function_ret="8";
break;
case 9:
$function_ret="9";
break;
case 10:
$function_ret="A";
break;
case 11:
$function_ret="B";
break;
case 12:
$function_ret="C";
break;
case 13:
$function_ret="D";
break;
case 14:
$function_ret="E";
break;
case 15:
$function_ret="F";
break;
default:
$function_ret="Z";
break;
}
return $function_ret;
}