<
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 阅读(603)
评论(0) 编辑 收藏 所属分类:
JavaScript