Jump to content

javascript -> php conversion give error


fenska

Recommended Posts

hi folks.

i just tried to convert someone else script about md5 implementation to PHP language.

so here i tried, but i give an error at result

 

javascript (working)

<script>

function rhex(num)
{
  str = "";
  var hex_chr = "0123456789abcdef";
  for(j = 0; j <= 3; j++) 	
str += hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) +
           hex_chr.charAt((num >> (j * ) & 0x0F);  

  return str;  
}

/*
* Convert a string to a sequence of 16-word blocks, stored as an array.
* Append padding bits and the length, as described in the MD5 standard.
*/
function str2blks_MD5(str)
{
  nblk = ((str.length +  >> 6) + 1;
  blks = new Array(nblk * 16);
  for(i = 0; i < nblk * 16; i++) blks[i] = 0;
  for(i = 0; i < str.length; i++)
    blks[i >> 2] |= str.charCodeAt(i) << ((i % 4) * ;
  blks[i >> 2] |= 0x80 << ((i % 4) * ;
  blks[nblk * 16 - 2] = str.length * 8;
  return blks;
}

/*
* Add integers, wrapping at 2^32. This uses 16-bit operations internally 
* to work around bugs in some JS interpreters.
*/
function add(x, y)
{
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

/*
* Bitwise rotate a 32-bit number to the left
*/
function rol(num, cnt)
{
  return (num << cnt) | (num >>> (32 - cnt));
}

/*
* These functions implement the basic operation for each round of the
* algorithm.
*/
function cmn(q, a, b, x, s, t)
{
  return add(rol(add(add(a, q), add(x, t)), s), b);
}
function ff(a, b, c, d, x, s, t)
{
  return cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
function gg(a, b, c, d, x, s, t)
{
  return cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
function hh(a, b, c, d, x, s, t)
{
  return cmn(b ^ c ^ d, a, b, x, s, t);
}
function ii(a, b, c, d, x, s, t)
{
  return cmn(c ^ (b | (~d)), a, b, x, s, t);
}

/*
* Take a string and return the hex representation of its MD5.
*/
function calcMD5(str)
{
  x = str2blks_MD5(str);

  a =  1732584193;
  b = -271733879;
  c = -1732584194;
  d =  271733878;

  for(i = 0; i < x.length; i += 16)
  {              
    olda = a;
    oldb = b;
    oldc = c;
    oldd = d;
var i = 0;

    a = ff(a, b, c, d, x[i+ 0], 7 , -680876936);
    d = ff(d, a, b, c, x[i+ 1], 12, -389564586);
    c = ff(c, d, a, b, x[i+ 2], 17,  606105819);
    b = ff(b, c, d, a, x[i+ 3], 22, -1044525330);
    a = ff(a, b, c, d, x[i+ 4], 7 , -176418897);
    d = ff(d, a, b, c, x[i+ 5], 12,  1200080426);
    c = ff(c, d, a, b, x[i+ 6], 17, -1473231341);
    b = ff(b, c, d, a, x[i+ 7], 22, -45705983);
    a = ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
    d = ff(d, a, b, c, x[i+ 9], 12, -1958414417);
    c = ff(c, d, a, b, x[i+10], 17, -42063);
    b = ff(b, c, d, a, x[i+11], 22, -1990404162);
    a = ff(a, b, c, d, x[i+12], 7 ,  1804603682);
    d = ff(d, a, b, c, x[i+13], 12, -40341101);
    c = ff(c, d, a, b, x[i+14], 17, -1502002290);
    b = ff(b, c, d, a, x[i+15], 22,  1236535329); 	

    a = gg(a, b, c, d, x[i+ 1], 5 , -165796510);
    d = gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
    c = gg(c, d, a, b, x[i+11], 14,  643717713);
    b = gg(b, c, d, a, x[i+ 0], 20, -373897302);
    a = gg(a, b, c, d, x[i+ 5], 5 , -701558691);
    d = gg(d, a, b, c, x[i+10], 9 ,  38016083);
    c = gg(c, d, a, b, x[i+15], 14, -660478335);
    b = gg(b, c, d, a, x[i+ 4], 20, -405537848);
    a = gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
    d = gg(d, a, b, c, x[i+14], 9 , -1019803690);
    c = gg(c, d, a, b, x[i+ 3], 14, -187363961);
    b = gg(b, c, d, a, x[i+ 8], 20,  1163531501);
    a = gg(a, b, c, d, x[i+13], 5 , -1444681467);
    d = gg(d, a, b, c, x[i+ 2], 9 , -51403784);
    c = gg(c, d, a, b, x[i+ 7], 14,  1735328473);
    b = gg(b, c, d, a, x[i+12], 20, -1926607734);
    
    a = hh(a, b, c, d, x[i+ 5], 4 , -378558);
    d = hh(d, a, b, c, x[i+ 8], 11, -2022574463);
    c = hh(c, d, a, b, x[i+11], 16,  1839030562);
    b = hh(b, c, d, a, x[i+14], 23, -35309556);
    a = hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
    d = hh(d, a, b, c, x[i+ 4], 11,  1272893353);
    c = hh(c, d, a, b, x[i+ 7], 16, -155497632);
    b = hh(b, c, d, a, x[i+10], 23, -1094730640);
    a = hh(a, b, c, d, x[i+13], 4 ,  681279174);
    d = hh(d, a, b, c, x[i+ 0], 11, -358537222);
    c = hh(c, d, a, b, x[i+ 3], 16, -722521979);
    b = hh(b, c, d, a, x[i+ 6], 23,  76029189);
    a = hh(a, b, c, d, x[i+ 9], 4 , -640364487);
    d = hh(d, a, b, c, x[i+12], 11, -421815835);
    c = hh(c, d, a, b, x[i+15], 16,  530742520);
    b = hh(b, c, d, a, x[i+ 2], 23, -995338651);

    a = ii(a, b, c, d, x[i+ 0], 6 , -198630844);
    d = ii(d, a, b, c, x[i+ 7], 10,  1126891415);
    c = ii(c, d, a, b, x[i+14], 15, -1416354905);
    b = ii(b, c, d, a, x[i+ 5], 21, -57434055);
    a = ii(a, b, c, d, x[i+12], 6 ,  1700485571);
    d = ii(d, a, b, c, x[i+ 3], 10, -1894986606);
    c = ii(c, d, a, b, x[i+10], 15, -1051523);
    b = ii(b, c, d, a, x[i+ 1], 21, -2054922799);
    a = ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
    d = ii(d, a, b, c, x[i+15], 10, -30611744);
    c = ii(c, d, a, b, x[i+ 6], 15, -1560198380);
    b = ii(b, c, d, a, x[i+13], 21,  1309151649);
    a = ii(a, b, c, d, x[i+ 4], 6 , -145523070);
    d = ii(d, a, b, c, x[i+11], 10, -1120210379);
    c = ii(c, d, a, b, x[i+ 2], 15,  718787259);
    b = ii(b, c, d, a, x[i+ 9], 21, -343485551);

    a = add(a, olda);
    b = add(b, oldb);
    c = add(c, oldc);
    d = add(d, oldd);

  }

  return rhex(a) + rhex(b) + rhex(c) + rhex(d);  
  
}

var result = calcMD5('test');
document.write(result);

</script>

 

and my translation in php

<?php

function zeroFill($a,$b) {
    if($a >= 0) {
        return bindec(decbin($a>>$b)); 
    }
    $bin = decbin($a>>$b);
    $bin = substr($bin, $b); 
    $o = bindec($bin);
    return $o;
}

function str_to_blocks($str) {
$nblk = ((strlen($str) +  >> 6) + 1;
$blks = new SplFixedArray($nblk*16);
for($i=0; $i<$nblk*16; $i++) {
	$blks[$i] = 0;
}
for($i=0; $i<strlen($str); $i++) {
	$blks[$i >> 2] |= ord(substr($str,$i)) << (($i % 4) * ;
}
$blks[$i >> 2] |= 0x80 << (($i % 4) * ;
$blks[$nblk * 16 - 2] = strlen($str) * 8;

return $blks; 
}

function add($x, $y) {
$lsw = ($x & 0xFFFF) + ($y & 0xFFFF);
$msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);

return ($msw << 16) | ($lsw & 0xFFFF);
}
function rol($num, $cnt) {
return ($num << $cnt) | (zeroFill($num,32-$cnt));
}
function cmn($q, $a, $b, $x, $s, $t) {
return add(rol(add(add($a, $q), add($x, $t)), $s), $b);
}
function ff($a, $b, $c, $d, $x, $s, $t) {
return cmn(($b & $c) | ((~$b) & $d), $a, $b, $x, $s, $t);
}
function gg($a, $b, $c, $d, $x, $s, $t) {
return cmn(($b & $d) | ($c & (~$d)), $a, $b, $x, $s, $t);
}
function hh($a, $b, $c, $d, $x, $s, $t) {
return cmn($b ^ $c ^ $d, $a, $b, $x, $s, $t);
}
function ii($a, $b, $c, $d, $x, $s, $t) {
  return cmn($c ^ ($b | (~$d)), $a, $b, $x, $s, $t);
}

function rhex($num) {
$str = "";
$hex_chr = "0123456789abcdef";
for($j = 0; $j <= 3; $j++) 	
	$str += substr($hex_chr,($num >> ($j * 8 + 4)) & 0x0F) + substr($hex_chr,($num >> ($j * 

) & 0x0F);	
return $str; 	
}

function hashmd5($string) {

$x = str_to_blocks($string); 

$a =  1732584193;

$b = -271733879;

$c = -1732584194;

$d =  271733878; 



for($i = 0; $i < count($x); $i+=16) {

  $olda = $a;

  $oldb = $b;

  $oldc = $c;

  $oldd = $d;  
  
  
/*   ???
function Pad($binary, $pad_length) {
	$pad_length = $pad_length - strlen($binary);
	for($i = 0; $i < $pad_length; $i++) {
		$padding .= '0';
	}
	return $padding . $binary;
}

for($i = 0; $i < 64; $i++) {
	$T[] = Pad(decbin(floor(4294967296 * abs(sin($i+1)))), 32);
}	
*/
    $a = ff($a, $b, $c, $d, $x[$i+ 0], 7 , -680876936);

    $d = ff($d, $a, $b, $c, $x[$i+ 1], 12, -389564586);

    $c = ff($c, $d, $a, $b, $x[$i+ 2], 17,  606105819);

    $b = ff($b, $c, $d, $a, $x[$i+ 3], 22, -1044525330);

    $a = ff($a, $b, $c, $d, $x[$i+ 4], 7 , -176418897);

    $d = ff($d, $a, $b, $c, $x[$i+ 5], 12,  1200080426);

    $c = ff($c, $d, $a, $b, $x[$i+ 6], 17, -1473231341);

    $b = ff($b, $c, $d, $a, $x[$i+ 7], 22, -45705983);

    $a = ff($a, $b, $c, $d, $x[$i+ 8], 7 ,  1770035416);

    $d = ff($d, $a, $b, $c, $x[$i+ 9], 12, -1958414417);

    $c = ff($c, $d, $a, $b, $x[$i+10], 17, -42063);

    $b = ff($b, $c, $d, $a, $x[$i+11], 22, -1990404162);

    $a = ff($a, $b, $c, $d, $x[$i+12], 7 ,  1804603682);

    $d = ff($d, $a, $b, $c, $x[$i+13], 12, -40341101);

    $c = ff($c, $d, $a, $b, $x[$i+14], 17, -1502002290);

    $b = ff($b, $c, $d, $a, $x[$i+15], 22,  1236535329);    


    $a = gg($a, $b, $c, $d, $x[$i+ 1], 5 , -165796510);

    $d = gg($d, $a, $b, $c, $x[$i+ 6], 9 , -1069501632);

    $c = gg($c, $d, $a, $b, $x[$i+11], 14,  643717713);

    $b = gg($b, $c, $d, $a, $x[$i+ 0], 20, -373897302);

    $a = gg($a, $b, $c, $d, $x[$i+ 5], 5 , -701558691);

    $d = gg($d, $a, $b, $c, $x[$i+10], 9 ,  38016083);

    $c = gg($c, $d, $a, $b, $x[$i+15], 14, -660478335);

    $b = gg($b, $c, $d, $a, $x[$i+ 4], 20, -405537848);

    $a = gg($a, $b, $c, $d, $x[$i+ 9], 5 ,  568446438);

    $d = gg($d, $a, $b, $c, $x[$i+14], 9 , -1019803690);

    $c = gg($c, $d, $a, $b, $x[$i+ 3], 14, -187363961);

    $b = gg($b, $c, $d, $a, $x[$i+ 8], 20,  1163531501);

    $a = gg($a, $b, $c, $d, $x[$i+13], 5 , -1444681467);

    $d = gg($d, $a, $b, $c, $x[$i+ 2], 9 , -51403784);

    $c = gg($c, $d, $a, $b, $x[$i+ 7], 14,  1735328473);

    $b = gg($b, $c, $d, $a, $x[$i+12], 20, -1926607734);

    

    $a = hh($a, $b, $c, $d, $x[$i+ 5], 4 , -378558);

    $d = hh($d, $a, $b, $c, $x[$i+ 8], 11, -2022574463);

    $c = hh($c, $d, $a, $b, $x[$i+11], 16,  1839030562);

    $b = hh($b, $c, $d, $a, $x[$i+14], 23, -35309556);

    $a = hh($a, $b, $c, $d, $x[$i+ 1], 4 , -1530992060);

    $d = hh($d, $a, $b, $c, $x[$i+ 4], 11,  1272893353);

    $c = hh($c, $d, $a, $b, $x[$i+ 7], 16, -155497632);

    $b = hh($b, $c, $d, $a, $x[$i+10], 23, -1094730640);

    $a = hh($a, $b, $c, $d, $x[$i+13], 4 ,  681279174);

    $d = hh($d, $a, $b, $c, $x[$i+ 0], 11, -358537222);

    $c = hh($c, $d, $a, $b, $x[$i+ 3], 16, -722521979);

    $b = hh($b, $c, $d, $a, $x[$i+ 6], 23,  76029189);

    $a = hh($a, $b, $c, $d, $x[$i+ 9], 4 , -640364487);

    $d = hh($d, $a, $b, $c, $x[$i+12], 11, -421815835);

    $c = hh($c, $d, $a, $b, $x[$i+15], 16,  530742520);

    $b = hh($b, $c, $d, $a, $x[$i+ 2], 23, -995338651);



    $a = ii($a, $b, $c, $d, $x[$i+ 0], 6 , -198630844);

    $d = ii($d, $a, $b, $c, $x[$i+ 7], 10,  1126891415);

    $c = ii($c, $d, $a, $b, $x[$i+14], 15, -1416354905);

    $b = ii($b, $c, $d, $a, $x[$i+ 5], 21, -57434055);

    $a = ii($a, $b, $c, $d, $x[$i+12], 6 ,  1700485571);

    $d = ii($d, $a, $b, $c, $x[$i+ 3], 10, -1894986606);

    $c = ii($c, $d, $a, $b, $x[$i+10], 15, -1051523);

    $b = ii($b, $c, $d, $a, $x[$i+ 1], 21, -2054922799);

    $a = ii($a, $b, $c, $d, $x[$i+ 8], 6 ,  1873313359);

    $d = ii($d, $a, $b, $c, $x[$i+15], 10, -30611744);

    $c = ii($c, $d, $a, $b, $x[$i+ 6], 15, -1560198380);

    $b = ii($b, $c, $d, $a, $x[$i+13], 21,  1309151649);

    $a = ii($a, $b, $c, $d, $x[$i+ 4], 6 , -145523070);

    $d = ii($d, $a, $b, $c, $x[$i+11], 10, -1120210379);

    $c = ii($c, $d, $a, $b, $x[$i+ 2], 15,  718787259);

    $b = ii($b, $c, $d, $a, $x[$i+ 9], 21, -343485551);


    $a = add($a, $olda);

    $b = add($b, $oldb);

    $c = add($c, $oldc);

    $d = add($d, $oldd);	

  }    

return rhex($a) + rhex($b) + rhex($c) + rhex($d);  

}


$string="test";

echo hashmd5($string);


?>

 

take note i have add a function for bitwise operation >>>  :D

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.