javascript - Node.js/JS implementations of PHP's `hex2bin` returns wrong results. How to get the same result? -


this php code:

$h = hex2bin('db6dc3f86800da4f7c19e643e8941ebb'); $md5 = md5($h); echo $md5; // ==> b885730327999e8823d113161c3538d3 

and same in node.js. result different:

let h = hex2bin('db6dc3f86800da4f7c19e643e8941ebb'); let md5 = crypto.createhash('md5').update(h).digest('hex'); console.log(md5); ==> // a141519bf4b0acf2221ed94e721ddc7d 

i have used 4 different variants of js analogs of hex2bin find in internet. of them not return same php does. more that, none of these js functions return same result others js functions.

  1. from here http://locutus.io/php/strings/hex2bin/
  2. from answer https://stackoverflow.com/a/12987042/1114926
  3. from answer https://stackoverflow.com/a/41550641/1114926
  4. from answer https://stackoverflow.com/a/17224848/1114926

why so? impossible have php's hex2bin in js/node.js? need set whole php interpreter 1 function?

finally after time digging in web found correct solution you. think problem in javascript's md5 implementation because of hex2bin javascript functions found on web returning same results.

this md5 javascript implementation found here. can see hex2bin implementation quite short , can find on lot of places.

/*        md5 implementation    */    var hex_chr = "0123456789abcdef";    function rhex(num) {    str = "";    (j = 0; j <= 3; j++)      str += hex_chr.charat((num >> (j * 8 + 4)) & 0x0f) +      hex_chr.charat((num >> (j * 8)) & 0x0f);    return str;  }    /*   * convert string sequence of 16-word blocks, stored array.   * append padding bits , length, described in md5 standard.   */  function str2blks_md5(str) {    nblk = ((str.length + 8) >> 6) + 1;    blks = new array(nblk * 16);    (i = 0; < nblk * 16; i++) blks[i] = 0;    (i = 0; < str.length; i++)      blks[i >> 2] |= str.charcodeat(i) << ((i % 4) * 8);    blks[i >> 2] |= 0x80 << ((i % 4) * 8);    blks[nblk * 16 - 2] = str.length * 8;    return blks;  }    /*   * add integers, wrapping @ 2^32. uses 16-bit operations internally    * work around bugs in 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 32-bit number left   */  function rol(num, cnt) {    return (num << cnt) | (num >>> (32 - cnt));  }    /*   * these functions implement basic operation each round of   * 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 string , return hex representation of md5.   */  function calcmd5(str) {    x = str2blks_md5(str);    = 1732584193;    b = -271733879;    c = -1732584194;    d = 271733878;      (i = 0; < x.length; += 16) {      olda = a;      oldb = b;      oldc = c;      oldd = d;        = 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);      = 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);      = 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);      = 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);        = 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);      = 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);      = 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);      = 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);        = 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);      = 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);      = 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);      = 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);        = 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);      = 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);      = 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);      = 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);        = add(a, olda);      b = add(b, oldb);      c = add(c, oldc);      d = add(d, oldd);    }    return rhex(a) + rhex(b) + rhex(c) + rhex(d);  }      /*        hex2bin implementation    */  function hex2bin(hex) {    var bytes = [],      str;      (var = 0; < hex.length - 1; += 2)      bytes.push(parseint(hex.substr(i, 2), 16));      return string.fromcharcode.apply(string, bytes);  }  var inputstr = 'db6dc3f86800da4f7c19e643e8941ebb';  var hex2bin = hex2bin(inputstr);  console.log('initial = ' + inputstr);  console.log('hex2bin = ' + hex2bin);  console.log('md5 = ' + calcmd5(hex2bin));


Comments

Popular posts from this blog

python - Selenium remoteWebDriver (& SauceLabs) Firefox moseMoveTo action exception -

html - How to custom Bootstrap grid height? -

transpose - Maple isnt executing function but prints function term -