?
<
HTML
>
<
HEAD
>
<
META?http
-
equiv
=
'
Content-Type
'
?content
=
'
text/html;?charset=gb2312
'
>
<
TITLE
>
非常流行的JS的md5加密辦法
</
TITLE
>
</
HEAD
>
<
BODY?
>
<
input?id
=
test?value
=
webasp
>
<
input?type
=
button?value
=
md5?onclick
=
"
alert(hex_md5(test.value))
"
>
<
script
>
var?hexcase?
=
?
0
;??
/*
?hex?output?format.?0?-?lowercase;?1?-?uppercase????????
*/
var?b64pad??
=
?
""
;?
/*
?base-64?pad?character.?"="?for?strict?RFC?compliance???
*/
var?chrsz???
=
?
8
;??
/*
?bits?per?input?character.?8?-?ASCII;?16?-?Unicode??????
*/
/*
?*?These?are?the?functions?you'll?usually?want?to?call
?*?They?take?string?arguments?and?return?either?hex?or?base-64?encoded?strings
?
*/
function?hex_md5(s){?
return
?binl2hex(core_md5(str2binl(s),?s.length?
*
?chrsz));}
function?b64_md5(s){?
return
?binl2b64(core_md5(str2binl(s),?s.length?
*
?chrsz));}
function?hex_hmac_md5(key,?data)?{?
return
?binl2hex(core_hmac_md5(key,?data));?}
function?b64_hmac_md5(key,?data)?{?
return
?binl2b64(core_hmac_md5(key,?data));?}
/*
?Backwards?compatibility?-?same?as?hex_md5()?
*/
function?calcMD5(s){?
return
?binl2hex(core_md5(str2binl(s),?s.length?
*
?chrsz));}
/*
?
?*?Perform?a?simple?self-test?to?see?if?the?VM?is?working?
?
*/
function?md5_vm_test()
{
??
return
?hex_md5(
"
abc
"
)?
==
?
"
900150983cd24fb0d6963f7d28e17f72
"
;
}
/*
?*?Calculate?the?MD5?of?an?array?of?little-endian?words,?and?a?bit?length
?
*/
function?core_md5(x,?len)
{
??
/*
?append?padding?
*/
??x[len?
>>
?
5
]?
|=
?
0x80
?
<<
?((len)?
%
?
32
);
??x[(((len?
+
?
64
)?
>>>
?
9
)?
<<
?
4
)?
+
?
14
]?
=
?len;
??
??var?a?
=
??
1732584193
;
??var?b?
=
?
-
271733879
;
??var?c?
=
?
-
1732584194
;
??var?d?
=
??
271733878
;
??
for
(var?i?
=
?
0
;?i?
<
?x.length;?i?
+=
?
16
)
??{
????var?olda?
=
?a;
????var?oldb?
=
?b;
????var?oldc?
=
?c;
????var?oldd?
=
?d;
?
????a?
=
?md5_ff(a,?b,?c,?d,?x[i
+
?
0
],?
7
?,?
-
680876936
);
????d?
=
?md5_ff(d,?a,?b,?c,?x[i
+
?
1
],?
12
,?
-
389564586
);
????c?
=
?md5_ff(c,?d,?a,?b,?x[i
+
?
2
],?
17
,??
606105819
);
????b?
=
?md5_ff(b,?c,?d,?a,?x[i
+
?
3
],?
22
,?
-
1044525330
);
????a?
=
?md5_ff(a,?b,?c,?d,?x[i
+
?
4
],?
7
?,?
-
176418897
);
????d?
=
?md5_ff(d,?a,?b,?c,?x[i
+
?
5
],?
12
,??
1200080426
);
????c?
=
?md5_ff(c,?d,?a,?b,?x[i
+
?
6
],?
17
,?
-
1473231341
);
????b?
=
?md5_ff(b,?c,?d,?a,?x[i
+
?
7
],?
22
,?
-
45705983
);
????a?
=
?md5_ff(a,?b,?c,?d,?x[i
+
?
8
],?
7
?,??
1770035416
);
????d?
=
?md5_ff(d,?a,?b,?c,?x[i
+
?
9
],?
12
,?
-
1958414417
);
????c?
=
?md5_ff(c,?d,?a,?b,?x[i
+
10
],?
17
,?
-
42063
);
????b?
=
?md5_ff(b,?c,?d,?a,?x[i
+
11
],?
22
,?
-
1990404162
);
????a?
=
?md5_ff(a,?b,?c,?d,?x[i
+
12
],?
7
?,??
1804603682
);
????d?
=
?md5_ff(d,?a,?b,?c,?x[i
+
13
],?
12
,?
-
40341101
);
????c?
=
?md5_ff(c,?d,?a,?b,?x[i
+
14
],?
17
,?
-
1502002290
);
????b?
=
?md5_ff(b,?c,?d,?a,?x[i
+
15
],?
22
,??
1236535329
);
????a?
=
?md5_gg(a,?b,?c,?d,?x[i
+
?
1
],?
5
?,?
-
165796510
);
????d?
=
?md5_gg(d,?a,?b,?c,?x[i
+
?
6
],?
9
?,?
-
1069501632
);
????c?
=
?md5_gg(c,?d,?a,?b,?x[i
+
11
],?
14
,??
643717713
);
????b?
=
?md5_gg(b,?c,?d,?a,?x[i
+
?
0
],?
20
,?
-
373897302
);
????a?
=
?md5_gg(a,?b,?c,?d,?x[i
+
?
5
],?
5
?,?
-
701558691
);
????d?
=
?md5_gg(d,?a,?b,?c,?x[i
+
10
],?
9
?,??
38016083
);
????c?
=
?md5_gg(c,?d,?a,?b,?x[i
+
15
],?
14
,?
-
660478335
);
????b?
=
?md5_gg(b,?c,?d,?a,?x[i
+
?
4
],?
20
,?
-
405537848
);
????a?
=
?md5_gg(a,?b,?c,?d,?x[i
+
?
9
],?
5
?,??
568446438
);
????d?
=
?md5_gg(d,?a,?b,?c,?x[i
+
14
],?
9
?,?
-
1019803690
);
????c?
=
?md5_gg(c,?d,?a,?b,?x[i
+
?
3
],?
14
,?
-
187363961
);
????b?
=
?md5_gg(b,?c,?d,?a,?x[i
+
?
8
],?
20
,??
1163531501
);
????a?
=
?md5_gg(a,?b,?c,?d,?x[i
+
13
],?
5
?,?
-
1444681467
);
????d?
=
?md5_gg(d,?a,?b,?c,?x[i
+
?
2
],?
9
?,?
-
51403784
);
????c?
=
?md5_gg(c,?d,?a,?b,?x[i
+
?
7
],?
14
,??
1735328473
);
????b?
=
?md5_gg(b,?c,?d,?a,?x[i
+
12
],?
20
,?
-
1926607734
);
????a?
=
?md5_hh(a,?b,?c,?d,?x[i
+
?
5
],?
4
?,?
-
378558
);
????d?
=
?md5_hh(d,?a,?b,?c,?x[i
+
?
8
],?
11
,?
-
2022574463
);
????c?
=
?md5_hh(c,?d,?a,?b,?x[i
+
11
],?
16
,??
1839030562
);
????b?
=
?md5_hh(b,?c,?d,?a,?x[i
+
14
],?
23
,?
-
35309556
);
????a?
=
?md5_hh(a,?b,?c,?d,?x[i
+
?
1
],?
4
?,?
-
1530992060
);
????d?
=
?md5_hh(d,?a,?b,?c,?x[i
+
?
4
],?
11
,??
1272893353
);
????c?
=
?md5_hh(c,?d,?a,?b,?x[i
+
?
7
],?
16
,?
-
155497632
);
????b?
=
?md5_hh(b,?c,?d,?a,?x[i
+
10
],?
23
,?
-
1094730640
);
????a?
=
?md5_hh(a,?b,?c,?d,?x[i
+
13
],?
4
?,??
681279174
);
????d?
=
?md5_hh(d,?a,?b,?c,?x[i
+
?
0
],?
11
,?
-
358537222
);
????c?
=
?md5_hh(c,?d,?a,?b,?x[i
+
?
3
],?
16
,?
-
722521979
);
????b?
=
?md5_hh(b,?c,?d,?a,?x[i
+
?
6
],?
23
,??
76029189
);
????a?
=
?md5_hh(a,?b,?c,?d,?x[i
+
?
9
],?
4
?,?
-
640364487
);
????d?
=
?md5_hh(d,?a,?b,?c,?x[i
+
12
],?
11
,?
-
421815835
);
????c?
=
?md5_hh(c,?d,?a,?b,?x[i
+
15
],?
16
,??
530742520
);
????b?
=
?md5_hh(b,?c,?d,?a,?x[i
+
?
2
],?
23
,?
-
995338651
);
????a?
=
?md5_ii(a,?b,?c,?d,?x[i
+
?
0
],?
6
?,?
-
198630844
);
????d?
=
?md5_ii(d,?a,?b,?c,?x[i
+
?
7
],?
10
,??
1126891415
);
????c?
=
?md5_ii(c,?d,?a,?b,?x[i
+
14
],?
15
,?
-
1416354905
);
????b?
=
?md5_ii(b,?c,?d,?a,?x[i
+
?
5
],?
21
,?
-
57434055
);
????a?
=
?md5_ii(a,?b,?c,?d,?x[i
+
12
],?
6
?,??
1700485571
);
????d?
=
?md5_ii(d,?a,?b,?c,?x[i
+
?
3
],?
10
,?
-
1894986606
);
????c?
=
?md5_ii(c,?d,?a,?b,?x[i
+
10
],?
15
,?
-
1051523
);
????b?
=
?md5_ii(b,?c,?d,?a,?x[i
+
?
1
],?
21
,?
-
2054922799
);
????a?
=
?md5_ii(a,?b,?c,?d,?x[i
+
?
8
],?
6
?,??
1873313359
);
????d?
=
?md5_ii(d,?a,?b,?c,?x[i
+
15
],?
10
,?
-
30611744
);
????c?
=
?md5_ii(c,?d,?a,?b,?x[i
+
?
6
],?
15
,?
-
1560198380
);
????b?
=
?md5_ii(b,?c,?d,?a,?x[i
+
13
],?
21
,??
1309151649
);
????a?
=
?md5_ii(a,?b,?c,?d,?x[i
+
?
4
],?
6
?,?
-
145523070
);
????d?
=
?md5_ii(d,?a,?b,?c,?x[i
+
11
],?
10
,?
-
1120210379
);
????c?
=
?md5_ii(c,?d,?a,?b,?x[i
+
?
2
],?
15
,??
718787259
);
????b?
=
?md5_ii(b,?c,?d,?a,?x[i
+
?
9
],?
21
,?
-
343485551
);
????a?
=
?safe_add(a,?olda);
????b?
=
?safe_add(b,?oldb);
????c?
=
?safe_add(c,?oldc);
????d?
=
?safe_add(d,?oldd);
??}
??
return
?Array(a,?b,?c,?d);
??
}
/*
?*?These?functions?implement?the?four?basic?operations?the?algorithm?uses.
?
*/
function?md5_cmn(q,?a,?b,?x,?s,?t)
{
??
return
?safe_add(bit_rol(safe_add(safe_add(a,?q),?safe_add(x,?t)),?s),b);
}
function?md5_ff(a,?b,?c,?d,?x,?s,?t)
{
??
return
?md5_cmn((b?
&
?c)?
|
?((
~
b)?
&
?d),?a,?b,?x,?s,?t);
}
function?md5_gg(a,?b,?c,?d,?x,?s,?t)
{
??
return
?md5_cmn((b?
&
?d)?
|
?(c?
&
?(
~
d)),?a,?b,?x,?s,?t);
}
function?md5_hh(a,?b,?c,?d,?x,?s,?t)
{
??
return
?md5_cmn(b?
^
?c?
^
?d,?a,?b,?x,?s,?t);
}
function?md5_ii(a,?b,?c,?d,?x,?s,?t)
{
??
return
?md5_cmn(c?
^
?(b?
|
?(
~
d)),?a,?b,?x,?s,?t);
}
/*
?*?Calculate?the?HMAC-MD5,?of?a?key?and?some?data
?
*/
function?core_hmac_md5(key,?data)
{
??var?bkey?
=
?str2binl(key);
??
if
(bkey.length?
>
?
16
)?bkey?
=
?core_md5(bkey,?key.length?
*
?chrsz);
??var?ipad?
=
?Array(
16
),?opad?
=
?Array(
16
);
??
for
(var?i?
=
?
0
;?i?
<
?
16
;?i
++
)?
??{
????ipad[i]?
=
?bkey[i]?
^
?
0x36363636
;
????opad[i]?
=
?bkey[i]?
^
?
0x5C5C5C5C
;
??}
??var?hash?
=
?core_md5(ipad.concat(str2binl(data)),?
512
?
+
?data.length?
*
?chrsz);
??
return
?core_md5(opad.concat(hash),?
512
?
+
?
128
);
}
/*
?*?Add?integers,?wrapping?at?2^32.?This?uses?16-bit?operations?internally
?*?to?work?around?bugs?in?some?JS?interpreters.
?
*/
function?safe_add(x,?y)
{
??var?lsw?
=
?(x?
&
?
0xFFFF
)?
+
?(y?
&
?
0xFFFF
);
??var?msw?
=
?(x?
>>
?
16
)?
+
?(y?
>>
?
16
)?
+
?(lsw?
>>
?
16
);
??
return
?(msw?
<<
?
16
)?
|
?(lsw?
&
?
0xFFFF
);
}
/*
?*?Bitwise?rotate?a?32-bit?number?to?the?left.
?
*/
function?bit_rol(num,?cnt)
{
??
return
?(num?
<<
?cnt)?
|
?(num?
>>>
?(
32
?
-
?cnt));
}
/*
?*?Convert?a?string?to?an?array?of?little-endian?words
?*?If?chrsz?is?ASCII,?characters?>255?have?their?hi-byte?silently?ignored.
?
*/
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;
}
/*
?*?Convert?an?array?of?little-endian?words?to?a?hex?string.
?
*/
function?binl2hex(binarray)
{
??var?hex_tab?
=
?hexcase?
?
?
"
0123456789ABCDEF
"
?:?
"
0123456789abcdef
"
;
??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;
}
/*
?*?Convert?an?array?of?little-endian?words?to?a?base-64?string
?
*/
function?binl2b64(binarray)
{
??var?tab?
=
?
"
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
"
;
??var?str?
=
?
""
;
??
for
(var?i?
=
?
0
;?i?
<
?binarray.length?
*
?
4
;?i?
+=
?
3
)
??{
????var?triplet?
=
?(((binarray[i???
>>
?
2
]?
>>
?
8
?
*
?(?i???
%
4
))?
&
?
0xFF
)?
<<
?
16
)
????????????????
|
?(((binarray[i
+
1
?
>>
?
2
]?
>>
?
8
?
*
?((i
+
1
)
%
4
))?
&
?
0xFF
)?
<<
?
8
?)
????????????????
|
??((binarray[i
+
2
?
>>
?
2
]?
>>
?
8
?
*
?((i
+
2
)
%
4
))?
&
?
0xFF
);
????
for
(var?j?
=
?
0
;?j?
<
?
4
;?j
++
)
????{
??????
if
(i?
*
?
8
?
+
?j?
*
?
6
?
>
?binarray.length?
*
?
32
)?str?
+=
?b64pad;
??????
else
?str?
+=
?tab.charAt((triplet?
>>
?
6
*
(
3
-
j))?
&
?
0x3F
);
????}
??}
??
return
?str;
}
</
script
>
?
</
BODY
></
HTML
>
posted on 2006-12-25 17:11
kelven 閱讀(612)
評論(0) 編輯 收藏 所屬分類:
JavaScript