RIPEMD-160 Hashing in JavaScript : RIPEMD 160 Hashing : Security JAVASCRIPT DHTML TUTORIALS


JAVASCRIPT DHTML TUTORIALS » Security » RIPEMD 160 Hashing »

 

RIPEMD-160 Hashing in JavaScript



<html>
  <head>
    <!--
      CryptoMX Tools
      Copyright (C2004 2006 Derek Buitenhuis

      This program is free software; you can redistribute it and/or
      modify it under the terms of the GNU General Public License
      as published by the Free Software Foundation; either version 2
      of the License, or (at your optionany later version.

      This program is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      GNU General Public License for more details.

      You should have received a copy of the GNU General Public License
      along with this program; if not, write to the Free Software
      Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
    -->
    <title>RIPEMD-160 Hashing</title>
  </head>
  <body>
      <!-- ripemd-160.js -->
    <script language="JavaScript">
var RMDsize   = 160;
var X = new Array();

function ROL(x, n)
{
  return new Number ((x << nx >>> (32 - n)));
}

function F(x, y, z)
{
  return new Number(x ^ y ^ z);
}

function G(x, y, z)
{
  return new Number((x & y(~x & z));
}

function H(x, y, z)
{
  return new Number((x | ~y^ z);
}

function I(x, y, z)
{
  return new Number((x & z(y & ~z));
}

function J(x, y, z)
{
  return new Number(x ^ (y | ~z));
}

function mixOneRound(a, b, c, d, e, x, s, roundNumber)
{
  switch (roundNumber)
  {
    case : a += F(b, c, d+ x + 0x00000000break;
    case : a += G(b, c, d+ x + 0x5a827999break;
    case : a += H(b, c, d+ x + 0x6ed9eba1break;
    case : a += I(b, c, d+ x + 0x8f1bbcdcbreak;
    case : a += J(b, c, d+ x + 0xa953fd4ebreak;
    case : a += J(b, c, d+ x + 0x50a28be6break;
    case : a += I(b, c, d+ x + 0x5c4dd124break;
    case : a += H(b, c, d+ x + 0x6d703ef3break;
    case : a += G(b, c, d+ x + 0x7a6d76e9break;
    case : a += F(b, c, d+ x + 0x00000000break;
    
    default : document.write("Bogus round number")break;
  }  
  
  a = ROL(a, s+ e;
  c = ROL(c, 10);

  a &= 0xffffffff;
  b &= 0xffffffff;
  c &= 0xffffffff;
  d &= 0xffffffff;
  e &= 0xffffffff;

  var retBlock = new Array();
  retBlock[0= a;
  retBlock[1= b;
  retBlock[2= c;
  retBlock[3= d;
  retBlock[4= e;
  retBlock[5= x;
  retBlock[6= s;

  return retBlock;
}

function MDinit (MDbuf)
{
  MDbuf[00x67452301;
  MDbuf[10xefcdab89;
  MDbuf[20x98badcfe;
  MDbuf[30x10325476;
  MDbuf[40xc3d2e1f0;
}

var ROLs = [
  [11141512,  5,  8,  7,  911131415,  6,  7,  9,  8],
  7,  6,  81311,  9,  715,  71215,  911,  71312],
  [1113,  6,  714,  9131514,  813,  6,  512,  7,  5],
  [111214151415,  9,  8,  914,  5,  6,  8,  6,  512],
  915,  511,  6,  81312,  512131411,  8,  5,  6],
  8,  9,  911131515,  5,  7,  7,  811141412,  6],
  91315,  712,  8,  911,  7,  712,  7,  6151311],
  9,  71511,  8,  6,  6141213,  5141313,  7,  5],
  [15,  5,  8111414,  614,  6,  912,  912,  515,  8],
  8,  512,  912,  514,  6,  813,  6,  515131111]
];

var indexes = [
  0,  1,  2,  3,  4,  5,  6,  7,  8,  9101112131415],
  7,  413,  110,  615,  312,  0,  9,  5,  21411,  8],
  31014,  4,  915,  8,  1,  2,  7,  0,  61311,  512],
  1,  91110,  0,  812,  413,  3,  71514,  5,  6,  2],
  4,  0,  5,  9,  712,  21014,  1,  3,  811,  61513],
  514,  7,  0,  9,  211,  413,  615,  8,  110,  312],
  611,  3,  7,  013,  5101415,  812,  4,  9,  1,  2],
  [15,  5,  1,  3,  714,  6,  911,  812,  210,  0,  413],
  8,  6,  4,  1,  31115,  0,  512,  213,  9,  71014],
  [121510,  4,  1,  5,  8,  7,  6,  21314,  0,  3,  911]
];

function compress (MDbuf, X)
{
  blockA = new Array();
  blockB = new Array();

  var retBlock;

  for (var i=0; i < 5; i++)
  {
    blockA[inew Number(MDbuf[i]);
    blockB[inew Number(MDbuf[i]);
  }

  var step = 0;
  for (var j = 0; j < 5; j++)
  {
    for (var i = 0; i < 16; i++)
    {
      retBlock = mixOneRound(
        blockA[(step+05],
        blockA[(step+15],   
        blockA[(step+25],   
        blockA[(step+35],   
        blockA[(step+45],  
        X[indexes[j][i]]
        ROLs[j][i],
        j
      );

      blockA[(step+05= retBlock[0];
      blockA[(step+15= retBlock[1];
      blockA[(step+25= retBlock[2];
      blockA[(step+35= retBlock[3];
      blockA[(step+45= retBlock[4];

      step += 4;
    }
  }

  step = 0;
  for (var j = 5; j < 10; j++)
  {
    for (var i = 0; i < 16; i++)
    {  
      retBlock = mixOneRound(
        blockB[(step+05]
        blockB[(step+15]
        blockB[(step+25]
        blockB[(step+35]
        blockB[(step+45],  
        X[indexes[j][i]]
        ROLs[j][i],
        j
      );

      blockB[(step+05= retBlock[0];
      blockB[(step+15= retBlock[1];
      blockB[(step+25= retBlock[2];
      blockB[(step+35= retBlock[3];
      blockB[(step+45= retBlock[4];

      step += 4;
    }
  }

  blockB[3+= blockA[2+ MDbuf[1];
  MDbuf[1]  = MDbuf[2+ blockA[3+ blockB[4];
  MDbuf[2]  = MDbuf[3+ blockA[4+ blockB[0];
  MDbuf[3]  = MDbuf[4+ blockA[0+ blockB[1];
  MDbuf[4]  = MDbuf[0+ blockA[1+ blockB[2];
  MDbuf[0]  = blockB[3];
}

function zeroX(X)
{
  for (var i = 0; i < 16; i++) { X[i0}
}

function MDfinish (MDbuf, strptr, lswlen, mswlen)
{
  var X = new Array(16);
  zeroX(X);

  var j = 0;
  for (var i=0; i < (lswlen & 63); i++)
  {
    X[i >>> 2^= (strptr.charCodeAt(j++255<< ((i & 3));
  }

  X[(lswlen >>> 215^= << ((lswlen & 37);

  if ((lswlen & 6355)
  {
    compress(MDbuf, X);
    var X = new Array(16);
    zeroX(X);
  }

  X[14= lswlen << 3;
  X[15(lswlen >>> 29(mswlen << 3);

  compress(MDbuf, X);
}

function BYTES_TO_DWORD(fourChars)
{
  var tmp  = (fourChars.charCodeAt(3255<< 24;
  tmp   |= (fourChars.charCodeAt(2255<< 16;
  tmp   |= (fourChars.charCodeAt(1255<< 8;
  tmp   |= (fourChars.charCodeAt(0255);  

  return tmp;
}

function RMD(message)
{
  var MDbuf   = new Array(RMDsize / 32);
  var hashcode   = new Array(RMDsize / 8);
  var length;  
  var nbytes;

  MDinit(MDbuf);
  length = message.length;

  var X = new Array(16);
  zeroX(X);

  var j=0;
  for (var nbytes=length; nbytes > 63; nbytes -= 64)
  {
    for (var i=0; i < 16; i++)
    {
      X[i= BYTES_TO_DWORD(message.substr(j, 4));
      j += 4;
    }
    compress(MDbuf, X);
  }

  MDfinish(MDbuf, message.substr(j), length, 0);

  for (var i=0; i < RMDsize / 8; i += 4)
  {
    hashcode[i]   =  MDbuf[i >>> 2]   255;
    hashcode[i+1(MDbuf[i >>> 2>>> 8)   255;
    hashcode[i+2(MDbuf[i >>> 2>>> 16255;
    hashcode[i+3(MDbuf[i >>> 2>>> 24255;
  }

  return hashcode;
}

function toHex32(x)
{
  var hexChars = "0123456789abcdef";
  var hex = "";

  for (var i = 0; i < 2; i++)
  {
    hex = String(hexChars.charAt(x & 0xf)).concat(hex);
    x >>>= 4;
  }

  return hex;
}

function toRMDstring(hashcode)
{
  var retString = "";

  for (var i=0; i < RMDsize/8; i++)
  {
    retString += toHex32(hashcode[i]);
  }  

  return retString;  
}


function RMDstring(message)
{
  var hashcode = RMD(message);
  var retString = "";

  for (var i=0; i < RMDsize/8; i++)
  {
    retString += toHex32(hashcode[i]);
  }  

  return retString;  
}

    </script>
    <form>
      <font color=#000000 size=3>Input</font>
      <input type=text name=input size=40><br>
      <font color=#000000 size=3>Result</font>
      <input type=text name=hash size=50><br>
      <input type=button value="Hash It!" onclick="hash.value = RMDstring(input.value)">
    </form>
  </body>
</html>
           
       



-

Leave a Comment / Note


 
Verification is used to prevent unwanted posts (spam). .

Follow Navioo On Twitter

JAVASCRIPT DHTML TUTORIALS

 Navioo Security
» RIPEMD 160 Hashing