国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

MD5加密的JavaScript實現(xiàn)

2024-09-06 12:40:47
字體:
供稿:網(wǎng)友

  MD5加密,共分5步:詳細內(nèi)容大家可以查看http://www.survivalescaperooms.com/article/2006/3463.shtml

  (1) 補位
  MD5算法是對輸入的數(shù)據(jù)進行補位,使得如果數(shù)據(jù)位長度LEN對512求余的結(jié)果是448。即數(shù)
  據(jù)擴展至K*512+448位。即K*64+56個字節(jié),K為整數(shù)。補位操作始終要執(zhí)行,即使數(shù)據(jù)長度LEN
  對512求余的結(jié)果已是448。
  具體補位操作:補一個1,然后補0至滿足上述要求。總共最少要補一位,最多補512位。
  (2) 補數(shù)據(jù)長度
  用一個64位的數(shù)字表示數(shù)據(jù)的原始長度b,把b用兩個32位數(shù)表示。那么只取B的低64位。
  當(dāng)遇到b大于2^64這種極少遇到的情況時,這時,數(shù)據(jù)就被填補成長度為512位的倍數(shù)。也就是說,
  此時的數(shù)據(jù)長度是16個字(32位)的整數(shù)倍數(shù)。用M[0 ... N-1]表示此時的數(shù)據(jù),其中的N是16
  的倍數(shù)。
  (3) 初始化MD緩沖器
  (4)處理位操作函數(shù)
  (5)16進制形式輸出結(jié)果。
  OK,下面就開始用javascript實現(xiàn)MD5加密。
  首先,我們要思考一下為了實現(xiàn)以上五步,我們需要哪些功能函數(shù)。
  第一、補位、補數(shù)據(jù)長度需要,可以定義為Inital(str),其中str是需要加密的原始字符串,該函數(shù)輸出處理完后的數(shù)組。
  第二、處理位操作的四個函數(shù),F(xiàn)F、GG、HH、II需要定義。
  第三、最后輸出時要用16進制輸出,并且高位0不可省略。
  好了,首先寫第一個Inital函數(shù)。
  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;
  }
  下面簡單說明一下這個函數(shù),因為最后2個32位是用原始字符串長度來填充的(不明白的先去看MD5算法描述!哪個地方有?-_-!文章開頭的鏈接就是。)所以我們先把原始字符串長度 + 8,(64位就是8個字節(jié),這樣就是假設(shè)最后的2個32位已經(jīng)補充好了)。然后把中間的第一位補1,其余補0即可。
  不過呢,這里要注意一下字符串的順序,假如字符串"abc",那么他們一共占3*8=24位,其中a先進入數(shù)組,然后b左移8位后進入,c左移16位后進入,作后要補的1000000(16進制的0x80)左移24位后進入。
  好了,下面就要定義位操作函數(shù)FF、GG、HH、II
  這里要注意的是,我們要重新定義32位操作數(shù)的+的操作和移位操作。
  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<<iShiftBits) | (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);
  }
  說明一下FF(a,b,c,d,x,s,ac) 其實就是a = a + F(b, c, d) + x +ac;然后返回(a<<s) + b;只不過這里的+要用我們自己定義的加,就是mod 2^32后的結(jié)果,<<也是我們自己定義的左移。很容易理解的。
  下面就是輸出16進制數(shù)的函數(shù)了
  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;
  }
  這個函數(shù)就是為了防止漏掉0而設(shè)的。
  好了,最后的就是主要的函數(shù)MD5(str)了。
  function MD55(str)
  {
   var smessage =new Array();
   // step 1 and 2:補位、補數(shù)據(jù)長度
   smessage = Inital(str);
   var i = 0,j =0;
   var a, b, c, d;
   // step 3 初始化位操作數(shù)
   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();
  }
  大家可以看到里面用了Rotal[]、SS[]、TT[]數(shù)組,其中Rotal[]是定義每次smessage移位數(shù)的,不明白的看看MD5算法描述。
  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];
  OK了,大功告成。這里再提供幾組測試數(shù)據(jù):
  MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
  MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
  MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
  MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
  MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
  MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
  d174ab98d277d9f5a5611c2c9f419d9f
  MD5 ("123456789012345678901234567890123456789012345678901234567890123456
  78901234567890") = 57edf4a22be3c955ac49da2e2107b67a

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 都江堰市| 梁山县| 秀山| 特克斯县| 道真| 沙坪坝区| 万州区| 新野县| 平罗县| 政和县| 巧家县| 大足县| 克拉玛依市| 麻栗坡县| 大安市| 嘉善县| 扎赉特旗| 珲春市| 滕州市| 稷山县| 东至县| 龙井市| 绥德县| 铜山县| 张家界市| 武功县| 根河市| 女性| 白玉县| 纳雍县| 湖南省| 新泰市| 谢通门县| 伊金霍洛旗| 平南县| 邵阳县| 岐山县| 余庆县| 广宗县| 密山市| 永春县|