MD5加密的javascript实现例子

1 /* MD5 Message-Digest Algorithm - JavaScript
  2 ' MODIFICATION HISTORY:
  3 ' 1.0    16-Feb-2001 - Phil Fresle ([email protected]) - Initial Version (VB/ASP code)
  4 ' 1.0    21-Feb-2001 - Enrico Mosanghini ([email protected]) - JavaScript porting
  5 */
  6 function MD5(sMessage) {
  7 function RotateLeft(lValue, iShiftBits) { return (lValue << iShiftBits) | (lValue >>> ( 32 - iShiftBits)); }
  8 function AddUnsigned(lX,lY) {
  9     var lX4,lY4,lX8,lY8,lResult;
10     lX8 = (lX & 0x80000000 );
11     lY8 = (lY & 0x80000000 );
12     lX4 = (lX & 0x40000000 );
13     lY4 = (lY & 0x40000000 );
14     lResult = (lX & 0x3FFFFFFF ) + (lY & 0x3FFFFFFF );
15     if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
16     if (lX4 | lY4) {
17         if (lResult & 0x40000000 ) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
18         else return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
19     } else return (lResult ^ lX8 ^ lY8);
20 }
21 function F(x,y,z) { return (x & y) | (( ~ x) & z); }
22 function G(x,y,z) { return (x & z) | (y & ( ~ z)); }
23 function H(x,y,z) { return (x ^ y ^ z); }
24 function I(x,y,z) { return (y ^ (x | ( ~ z))); }
25 function FF(a,b,c,d,x,s,ac) {
26     a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
27     return AddUnsigned(RotateLeft(a, s), b);
28 }
29 function GG(a,b,c,d,x,s,ac) {
30     a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
31     return AddUnsigned(RotateLeft(a, s), b);
32 }
33 function HH(a,b,c,d,x,s,ac) {
34     a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
35     return AddUnsigned(RotateLeft(a, s), b);
36 }
37 function II(a,b,c,d,x,s,ac) {
38     a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
39     return AddUnsigned(RotateLeft(a, s), b);
40 }
41 function ConvertToWordArray(sMessage) {
42     var lWordCount;
43     var lMessageLength = sMessage.length;
44     var lNumberOfWords_temp1 = lMessageLength + 8 ;
45     var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64 )) / 64 ;
46     var lNumberOfWords = (lNumberOfWords_temp2 + 1 ) * 16 ;
47     var lWordArray = Array(lNumberOfWords - 1 );
48     var lBytePosition = 0 ;
49     var lByteCount = 0 ;
50     while ( lByteCount < lMessageLength ) {
51         lWordCount = (lByteCount - (lByteCount % 4 )) / 4 ;
52         lBytePosition = (lByteCount % 4 ) * 8 ;
53         lWordArray[lWordCount] = (lWordArray[lWordCount] | (sMessage.charCodeAt(lByteCount) << lBytePosition));
54         lByteCount ++ ;
55     }
56     lWordCount = (lByteCount - (lByteCount % 4 )) / 4 ;
57     lBytePosition = (lByteCount % 4 ) * 8 ;
58     lWordArray[lWordCount] = lWordArray[lWordCount] | ( 0x80 << lBytePosition);
59     lWordArray[lNumberOfWords - 2 ] = lMessageLength << 3 ;
60     lWordArray[lNumberOfWords - 1 ] = lMessageLength >>> 29 ;
61     return lWordArray;
62 }
63 function WordToHex(lValue) {
64     var WordToHexValue = "" ,WordToHexValue_temp = "" ,lByte,lCount;
65     for (lCount = 0 ;lCount <= 3 ;lCount ++ ) {
66         lByte = (lValue >>> (lCount * 8 )) & 255 ;
67         WordToHexValue_temp = " 0 " + lByte.toString( 16 );
68         WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2 , 2 );
69     }
70     return WordToHexValue;
71 }
72     var x = Array();
73     var k,AA,BB,CC,DD,a,b,c,d
74     var S11 = 7 , S12 = 12 , S13 = 17 , S14 = 22 ;
75     var S21 = 5 , S22 = 9 , S23 = 14 , S24 = 20 ;
76     var S31 = 4 , S32 = 11 , S33 = 16 , S34 = 23 ;
77     var S41 = 6 , S42 = 10 , S43 = 15 , S44 = 21 ;
78     // Steps 1 and 2.  Append padding bits and length and convert to words
79     x = ConvertToWordArray(sMessage);
80     // Step 3.  Initialise
81     a = 0x67452301 ; b = 0xEFCDAB89 ; c = 0x98BADCFE ; d = 0x10325476 ;
82     // Step 4.  Process the message in 16-word blocks
83     for (k = 0 ;k < x.length;k += 16 ) {
84         AA = a; BB = b; CC = c; DD = d;
85         a = FF(a,b,c,d,x[k + 0 ], S11, 0xD76AA478 );
86         d = FF(d,a,b,c,x[k + 1 ], S12, 0xE8C7B756 );
87         c = FF(c,d,a,b,x[k + 2 ], S13, 0x242070DB );
88         b = FF(b,c,d,a,x[k + 3 ], S14, 0xC1BDCEEE );
89         a = FF(a,b,c,d,x[k + 4 ], S11, 0xF57C0FAF );
90         d = FF(d,a,b,c,x[k + 5 ], S12, 0x4787C62A );
91         c = FF(c,d,a,b,x[k + 6 ], S13, 0xA8304613 );
92         b = FF(b,c,d,a,x[k + 7 ], S14, 0xFD469501 );
93         a = FF(a,b,c,d,x[k + 8 ], S11, 0x698098D8 );
94         d = FF(d,a,b,c,x[k + 9 ], S12, 0x8B44F7AF );
95         c = FF(c,d,a,b,x[k + 10 ],S13, 0xFFFF5BB1 );
96         b = FF(b,c,d,a,x[k + 11 ],S14, 0x895CD7BE );
97         a = FF(a,b,c,d,x[k + 12 ],S11, 0x6B901122 );
98         d = FF(d,a,b,c,x[k + 13 ],S12, 0xFD987193 );
99         c = FF(c,d,a,b,x[k + 14 ],S13, 0xA679438E );
100         b = FF(b,c,d,a,x[k + 15 ],S14, 0x49B40821 );
101         a = GG(a,b,c,d,x[k + 1 ], S21, 0xF61E2562 );
102         d = GG(d,a,b,c,x[k + 6 ], S22, 0xC040B340 );
103         c = GG(c,d,a,b,x[k + 11 ],S23, 0x265E5A51 );
104         b = GG(b,c,d,a,x[k + 0 ], S24, 0xE9B6C7AA );
105         a = GG(a,b,c,d,x[k + 5 ], S21, 0xD62F105D );
106         d = GG(d,a,b,c,x[k + 10 ],S22, 0x2441453 );
107         c = GG(c,d,a,b,x[k + 15 ],S23, 0xD8A1E681 );
108         b = GG(b,c,d,a,x[k + 4 ], S24, 0xE7D3FBC8 );
109         a = GG(a,b,c,d,x[k + 9 ], S21, 0x21E1CDE6 );
110         d = GG(d,a,b,c,x[k + 14 ],S22, 0xC33707D6 );
111         c = GG(c,d,a,b,x[k + 3 ], S23, 0xF4D50D87 );
112         b = GG(b,c,d,a,x[k + 8 ], S24, 0x455A14ED );
113         a = GG(a,b,c,d,x[k + 13 ],S21, 0xA9E3E905 );
114         d = GG(d,a,b,c,x[k + 2 ], S22, 0xFCEFA3F8 );
115         c = GG(c,d,a,b,x[k + 7 ], S23, 0x676F02D9 );
116         b = GG(b,c,d,a,x[k + 12 ],S24, 0x8D2A4C8A );
117         a = HH(a,b,c,d,x[k + 5 ], S31, 0xFFFA3942 );
118         d = HH(d,a,b,c,x[k + 8 ], S32, 0x8771F681 );
119         c = HH(c,d,a,b,x[k + 11 ],S33, 0x6D9D6122 );
120         b = HH(b,c,d,a,x[k + 14 ],S34, 0xFDE5380C );
121         a = HH(a,b,c,d,x[k + 1 ], S31, 0xA4BEEA44 );
122         d = HH(d,a,b,c,x[k + 4 ], S32, 0x4BDECFA9 );
123         c = HH(c,d,a,b,x[k + 7 ], S33, 0xF6BB4B60 );
124         b = HH(b,c,d,a,x[k + 10 ],S34, 0xBEBFBC70 );
125         a = HH(a,b,c,d,x[k + 13 ],S31, 0x289B7EC6 );
126         d = HH(d,a,b,c,x[k + 0 ], S32, 0xEAA127FA );
127         c = HH(c,d,a,b,x[k + 3 ], S33, 0xD4EF3085 );
128         b = HH(b,c,d,a,x[k + 6 ], S34, 0x4881D05 );
129         a = HH(a,b,c,d,x[k + 9 ], S31, 0xD9D4D039 );
130         d = HH(d,a,b,c,x[k + 12 ],S32, 0xE6DB99E5 );
131         c = HH(c,d,a,b,x[k + 15 ],S33, 0x1FA27CF8 );
132         b = HH(b,c,d,a,x[k + 2 ], S34, 0xC4AC5665 );
133         a = II(a,b,c,d,x[k + 0 ], S41, 0xF4292244 );
134         d = II(d,a,b,c,x[k + 7 ], S42, 0x432AFF97 );
135         c = II(c,d,a,b,x[k + 14 ],S43, 0xAB9423A7 );
136         b = II(b,c,d,a,x[k + 5 ], S44, 0xFC93A039 );
137         a = II(a,b,c,d,x[k + 12 ],S41, 0x655B59C3 );
138         d = II(d,a,b,c,x[k + 3 ], S42, 0x8F0CCC92 );
139         c = II(c,d,a,b,x[k + 10 ],S43, 0xFFEFF47D );
140         b = II(b,c,d,a,x[k + 1 ], S44, 0x85845DD1 );
141         a = II(a,b,c,d,x[k + 8 ], S41, 0x6FA87E4F );
142         d = II(d,a,b,c,x[k + 15 ],S42, 0xFE2CE6E0 );
143         c = II(c,d,a,b,x[k + 6 ], S43, 0xA3014314 );
144         b = II(b,c,d,a,x[k + 13 ],S44, 0x4E0811A1 );
145         a = II(a,b,c,d,x[k + 4 ], S41, 0xF7537E82 );
146         d = II(d,a,b,c,x[k + 11 ],S42, 0xBD3AF235 );
147         c = II(c,d,a,b,x[k + 2 ], S43, 0x2AD7D2BB );
148         b = II(b,c,d,a,x[k + 9 ], S44, 0xEB86D391 );
149         a = AddUnsigned(a,AA); b = AddUnsigned(b,BB); c = AddUnsigned(c,CC); d = AddUnsigned(d,DD);
150     }
151     // Step 5.  Output the 128 bit digest
152     var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
153     return temp.toLowerCase();
154 }

你可能感兴趣的:(MD5加密的javascript实现例子)