用 JavaScript 实现的 md5 算法
Friday, 17. July 2009, 11:21:32
function md5(sText) {
var MD5_T = [
0x00000000, 0xd76aa478, 0xe8c7b756, 0x242070db,
0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613,
0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1,
0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e,
0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51,
0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681,
0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87,
0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9,
0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122,
0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60,
0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085,
0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8,
0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7,
0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d,
0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314,
0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb,
0xeb86d391
];
var MD5_round1 = [
[ 0, 7, 1], [ 1,12, 2],
[ 2,17, 3], [ 3,22, 4],
[ 4, 7, 5], [ 5,12, 6],
[ 6,17, 7], [ 7,22, 8],
[ 8, 7, 9], [ 9,12,10],
[10,17,11], [11,22,12],
[12, 7,13], [13,12,14],
[14,17,15], [15,22,16]
];
var MD5_round2 = [
[ 1, 5,17], [ 6, 9,18],
[11,14,19], [ 0,20,20],
[ 5, 5,21], [10, 9,22],
[15,14,23], [ 4,20,24],
[ 9, 5,25], [14, 9,26],
[ 3,14,27], [ 8,20,28],
[13, 5,29], [ 2, 9,30],
[ 7,14,31], [12,20,32]
];
var MD5_round3 = [
[ 5, 4,33], [ 8,11,34],
[11,16,35], [14,23,36],
[ 1, 4,37], [ 4,11,38],
[ 7,16,39], [10,23,40],
[13, 4,41], [ 0,11,42],
[ 3,16,43], [ 6,23,44],
[ 9, 4,45], [12,11,46],
[15,16,47], [ 2,23,48]
];
var MD5_round4 = [
[ 0, 6,49], [ 7,10,50],
[14,15,51], [ 5,21,52],
[12, 6,53], [ 3,10,54],
[10,15,55], [ 1,21,56],
[ 8, 6,57], [15,10,58],
[ 6,15,59], [13,21,60],
[ 4, 6,61], [11,10,62],
[ 2,15,63], [ 9,21,64]
];
function MD5_F(x, y, z) { return (x & y) | (~x & z); }
function MD5_G(x, y, z) { return (x & z) | (y & ~z); }
function MD5_H(x, y, z) { return x ^ y ^ z; }
function MD5_I(x, y, z) { return y ^ (x | ~z); }
var MD5_round = [
[MD5_F, MD5_round1],
[MD5_G, MD5_round2],
[MD5_H, MD5_round3],
[MD5_I, MD5_round4]
];
function MD5_pack(n32) {
return String.fromCharCode(n32 & 0xff)
+ String.fromCharCode((n32 >>> 8) & 0xff)
+ String.fromCharCode((n32 >>> 16) & 0xff)
+ String.fromCharCode((n32 >>> 24) & 0xff);
}
function MD5_unpack(s4) {
return s4.charCodeAt(0)
| (s4.charCodeAt(1) << 8)
| (s4.charCodeAt(2) << 16)
| (s4.charCodeAt(3) << 24);
}
function MD5_number(n) {
while (n < 0)
n += 4294967296;
while (n > 4294967295)
n -= 4294967296;
return n;
}
function MD5_apply_round(x, s, f, abcd, r) {
var a, b, c, d;
var kk, ss, ii;
var t, u;
a = abcd[0];
b = abcd[1];
c = abcd[2];
d = abcd[3];
kk = r[0];
ss = r[1];
ii = r[2];
u = f(s[b], s[c], s[d]);
t = s[a] + u + x[kk] + MD5_T[ii];
t = MD5_number(t);
t = ((t<<ss) | (t>>>(32-ss)));
t += s[b];
s[a] = MD5_number(t);
}
function MD5_hash(data) {
var abcd, x, state, s;
var len, index, padLen, f, r;
var i, j, k;
var tmp;
state = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476];
len = data.length;
index = len & 0x3f;
padLen = (index < 56) ? (56 - index) : (120 - index);
if(padLen > 0) {
data += '\x80';
for(i = 0; i < padLen - 1; i++)
data += '\x00';
}
data += MD5_pack(len * 8);
data += MD5_pack(0);
len += padLen + 8;
abcd = [0, 1, 2, 3];
x = [16];
s = [4];
for(k = 0; k < len; k += 64) {
for(i = 0, j = k; i < 16; i++, j += 4) {
x[i] = data.charCodeAt(j)
| (data.charCodeAt(j + 1) << 8)
| (data.charCodeAt(j + 2) << 16)
| (data.charCodeAt(j + 3) << 24);
}
for(i = 0; i < 4; i++)
s[i] = state[i];
for(i = 0; i < 4; i++) {
f = MD5_round[i][0];
r = MD5_round[i][1];
for(j = 0; j < 16; j++) {
MD5_apply_round(x, s, f, abcd, r[j]);
tmp = abcd[0];
abcd[0] = abcd[3];
abcd[3] = abcd[2];
abcd[2] = abcd[1];
abcd[1] = tmp;
}
}
for(i = 0; i < 4; i++) {
state[i] += s[i];
state[i] = MD5_number(state[i]);
}
}
return MD5_pack(state[0])
+ MD5_pack(state[1])
+ MD5_pack(state[2])
+ MD5_pack(state[3]);
}
var i, out, c;
var bit128;
bit128 = MD5_hash(sText);
out = '';
for(i = 0; i < 16; i++) {
c = bit128.charCodeAt(i);
out += '0123456789abcdef'.charAt((c>>4) & 0xf);
out += '0123456789abcdef'.charAt(c & 0xf);
}
return out;
}







