MD5加密过程简析(以111111为例)

来源:互联网 发布:淘宝模版免费一键装修 编辑:程序博客网 时间:2024/06/14 00:46

1.本文是通过html调用JS方法进行加密,具体步骤是按MD5的加密脚本说明,以hex_md5加密111111为例

/*
 * Perform a simple self-test to see if the VM is working
 */
function md5_vm_test()
{
  var password=document.getElementById("password");

  show.innerHTML="password的MD5(hex_md5)加密后是:"+hex_md5(password.value);
}

function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));}

2.str2binl(s)函数

function str2binl(str)
{
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32);
  return bin;
}

mash是256(1的左移8位)-1。

i的右移8位分别为0,0,0,0,1,1。

得出结果为bin[0]=825307441,bin[1]=12593.

3.function core_md5(x, len)

本函数通过调用一个个复杂的位运输,得到a,b,c,d四个变化后的数字。

验算的a:412280726.b:750214806.c:-582376046.d:302068570

4.binl2hex函数,将数值通过位运算从0123456789abcdef取得一个字符。

/*
 * Convert an array of little-endian words to a hex string.
 */
function binl2hex(binarray)
{
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  alert(binarray.length);
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
  {
    str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
  }
  return str;
}

最终结果为96e79218965eb72c92a549dd5a330112.

这个算法只是字符的变化,没有涉及到密匙的问题,不知道有没有反解算法。

不过好像没听过有,都是调用数据库写入的信息获取的。