当前页面: 开发资料首页 → Javascript 专题 → MD5加密[JavaScript实现]
摘要: MD5加密[JavaScript实现]
function Inital(str)
{
var len = str.length,count=0,wordIndex = 0;
var m = len + 8;
var wordNum = (m - m%64)/64 + 1;
wordNum = wordNum * 16;
var WordByte = new Array(wordNum -1);
for(count = 0; count < len; count++)
{
wordIndex = (count - (count%4))/4;
WordByte[wordIndex] |= ( str.charCodeAt(count)<<((count%4)*8));
}
wordIndex = (count - (count%4))/4;
WordByte[wordIndex] |= (0x80<<((count%4)/8));
wordIndex++;
while(wordIndex < wordNum - 2)
{
WordByte[wordIndex] =0;
wordIndex++;
}
WordByte[wordNum - 2] = len <<3;
WordByte[wordNum - 1] = len >> 29;
return WordByte;
}
function F(x,y,z) { return (x & y) | ((~x) & z); }
function G(x,y,z) { return (x & z) | (y & (~z)); }
function H(x,y,z) { return (x ^ y ^ z); }
function I(x,y,z) { return (y ^ (x | (~z))); }
function ADD(x, y){ return (x+y)&0xFFFFFFFF; }
function RotateLeft(lValue, iShiftBits)
{ return (lValue<>>(32-iShiftBits)); }
function FF(a,b,c,d,x,s,ac)
{
a = ADD(a, ADD(ADD(F(b, c, d), x), ac));
return ADD(RotateLeft(a, s), b);
}
function GG(a,b,c,d,x,s,ac)
{
a = ADD(a, ADD(ADD(G(b, c, d), x), ac));
return ADD(RotateLeft(a, s), b);
}
function HH(a,b,c,d,x,s,ac)
{
a = ADD(a, ADD(ADD(H(b, c, d), x), ac));
return ADD(RotateLeft(a, s), b);
}
function II(a,b,c,d,x,s,ac) {
a = ADD(a, ADD(ADD(I(b, c, d), x), ac));
return ADD(RotateLeft(a, s), b);
}
function Word2Hex(str)
{
var hexValue = "",temp_str="";
var i = 0,lByte;
for(; i < 4; i++)
{
lByte = (str>>(i*8))& 0xFF;
temp_str = "0" + lByte.toString(16);
hexValue += temp_str.substr(temp_str.length - 2, 2);
}
return hexValue;
}
function MD55(str)
{
var smessage =new Array();
// step 1 and 2:补位、补数据长度
smessage = Inital(str);
var i = 0,j =0;
var a, b, c, d;
// step 3 初始化位操作数
a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
// step 4位处理
for(i = 0; i< smessage.length; i+=16)
{
AA = a;
BB = b;
CC = c;
DD = d;
for(j = 0; j < 4; j++)
{
a = FF(a, b, c, d, smessage[i + 4*j+0], SS[0], TT[4*j+0]);
d = FF(d, a, b, c, smessage[i + 4*j+1], SS[1], TT[4*j+1]);
c = FF(c, d, a, b, smessage[i + 4*j+2], SS[2], TT[4*j+2]);
b = FF(b, c, d, a, smessage[i + 4*j+3], SS[3], TT[4*j+3]);
}
for(j = 0; j < 4; j++)
{
a = GG(a, b, c, d, smessage[i + Rotal[4*j+0]], SS[4],TT[16+4*j+0]);
d = GG(d, a, b, c, smessage[i + Rotal[4*j+1]], SS[5],TT[16+4*j+1]);
c = GG(c, d, a, b, smessage[i + Rotal[4*j+2]], SS[6],TT[16+4*j+2]);
b = GG(b, c, d, a, smessage[i + Rotal[4*j+3]], SS[7],TT[16+4*j+3]);
}
for(j = 0; j < 4; j++)
{
a = HH(a, b, c, d, smessage[i + Rotal[16+4*j+0]], SS[8], TT[32+4*j+0]);
d = HH(d, a, b, c, smessage[i + Rotal[16+4*j+1]], SS[9], TT[32+4*j+1]);
c = HH(c, d, a, b, smessage[i + Rotal[16+4*j+2]], SS[10], TT[32+4*j+2]);
b = HH(b, c, d, a, smessage[i + Rotal[16+4*j+3]], SS[11], TT[32+4*j+3]);
}
for(j= 0; j < 4; j++)
{
a = II(a, b, c, d, smessage[i + Rotal[4*j+32]], SS[12], TT[48+4*j+0]);
d = II(d, a, b, c, smessage[i + Rotal[4*j+33]], SS[13], TT[48+4*j+1]);
c = II(c, d, a, b, smessage[i + Rotal[4*j+34]], SS[14], TT[48+4*j+2]);
b = II(b, c, d, a, smessage[i + Rotal[4*j+35]], SS[15], TT[48+4*j+3]);
}
a = ADD(a, AA);
b = ADD(b, BB);
c = ADD(c, CC);
d = ADD(d, DD);
}
// step5
var lResult = Word2Hex(a)+Word2Hex(b)+Word2Hex(c)+Word2Hex(d);
document.message.test1.value = lResult.toLowerCase();
}
var AA = 0x67452301, BB = 0xEFCDAB89, CC = 0x98BADCFE, DD = 0x10325476;
var SS = [7, 12, 17, 22, // step1
5, 9, 14, 20, // step2
4, 11, 16, 23,// step3
6, 10, 15, 21];// step4
var TT = [0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d, 0x2441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085, 0x4881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391];
var Rotal = [1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8,13, 2, 7,12,
5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2,
0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9];