常用的MD5 public class MD5 { public byte[] digest; public boolean digestValid; private int state[]; private long count; private byte buffer[]; private static int transformBuffer[]; private static final int S11 = 7; private static final int S12 = 12; private static final int S13 = 17; private static final int S14 = 22; private static final int S21 = 5; private static final int S22 = 9; private static final int S23 = 14; private static final int S24 = 20; private static final int S31 = 4; private static final int S32 = 11; private static final int S33 = 16; private static final int S34 = 23; private static final int S41 = 6; private static final int S42 = 10; private static final int S43 = 15; private static final int S44 = 21; private static final int INIT_0 = 0x67452301; private static final int INIT_1 = 0xefcdab89; private static final int INIT_2 = 0x98badcfe; private static final int INIT_3 = 0x10325476; public MD5() { state = new int[4]; count = 0; if (transformBuffer == null) { transformBuffer = new int[16]; } buffer = new byte[64]; digest = new byte[16]; digestValid = false; } public MD5(byte mydigest[]) { state = new int[4]; count = 0; if (transformBuffer == null) { transformBuffer = new int[16]; } buffer = new byte[64]; digest = mydigest; digestValid = false; } private int F(int x, int y, int z) { return ((x & y) | ((~x) & z)); } private int G(int x, int y, int z) { return ((x & z) | (y & (~z))); } private int H(int x, int y, int z) { return ((x ^ y) ^ z); } private int I(int x, int y, int z) { return (y ^ (x | (~z))); } private int rotateLeft(int a, int n) { return ((a << n) | (a >>> (32 - n))); } private int FF(int a, int b, int c, int d, int x, int s, int ac) { a += F(b, c, d) + x + ac; a = rotateLeft(a, s); a += b; return a; } private int GG(int a, int b, int c, int d, int x, int s, int ac) { a += G(b, c, d) + x + ac; a = rotateLeft(a, s); a += b; return a; } private int HH(int a, int b, int c, int d, int x, int s, int ac) { a += H(b, c, d) + x + ac; a = rotateLeft(a, s); a += b; return a; } private int II(int a, int b, int c, int d, int x, int s, int ac) { a += I(b, c, d) + x + ac; a = rotateLeft(a, s); a += b; return a; } void transform(byte buf[], int offset) { int a, b, c, d; int x[] = transformBuffer; a = state[0]; b = state[1]; c = state[2]; d = state[3]; for (int i = 0; i < 16; i++) { x[i] = (int)buf[i*4+offset] & 0xff; for (int j = 1; j < 4; j++) { x[i] += ((int)buf[i*4+j+offset] & 0xff) << (j * 8); } } a = FF ( a, b, c, d, x[ 0], S11, 0xd76aa478); d = FF ( d, a, b, c, x[ 1], S12, 0xe8c7b756); c = FF ( c, d, a, b, x[ 2], S13, 0x242070db); b = FF ( b, c, d, a, x[ 3], S14, 0xc1bdceee); a = FF ( a, b, c, d, x[ 4], S11, 0xf57c0faf); d = FF ( d, a, b, c, x[ 5], S12, 0x4787c62a); c = FF ( c, d, a, b, x[ 6], S13, 0xa8304613); b = FF ( b, c, d, a, x[ 7], S14, 0xfd469501); a = FF ( a, b, c, d, x[ 8], S11, 0x698098d8); d = FF ( d, a, b, c, x[ 9], S12, 0x8b44f7af); c = FF ( c, d, a, b, x[10], S13, 0xffff5bb1); b = FF ( b, c, d, a, x[11], S14, 0x895cd7be); a = FF ( a, b, c, d, x[12], S11, 0x6b901122); d = FF ( d, a, b, c, x[13], S12, 0xfd987193); c = FF ( c, d, a, b, x[14], S13, 0xa679438e); b = FF ( b, c, d, a, x[15], S14, 0x49b40821); a = GG ( a, b, c, d, x[ 1], S21, 0xf61e2562); d = GG ( d, a, b, c, x[ 6], S22, 0xc040b340); c = GG ( c, d, a, b, x[11], S23, 0x265e5a51); b = GG ( b, c, d, a, x[ 0], S24, 0xe9b6c7aa); a = GG ( a, b, c, d, x[ 5], S21, 0xd62f105d); d = GG ( d, a, b, c, x[10], S22, 0x2441453); c = GG ( c, d, a, b, x[15], S23, 0xd8a1e681); b = GG ( b, c, d, a, x[ 4], S24, 0xe7d3fbc8); a = GG ( a, b, c, d, x[ 9], S21, 0x21e1cde6); d = GG ( d, a, b, c, x[14], S22, 0xc33707d6); c = GG ( c, d, a, b, x[ 3], S23, 0xf4d50d87); b = GG ( b, c, d, a, x[ 8], S24, 0x455a14ed); a = GG ( a, b, c, d, x[13], S21, 0xa9e3e905); d = GG ( d, a, b, c, x[ 2], S22, 0xfcefa3f8); c = GG ( c, d, a, b, x[ 7], S23, 0x676f02d9); b = GG ( b, c, d, a, x[12], S24, 0x8d2a4c8a); a = HH ( a, b, c, d, x[ 5], S31, 0xfffa3942); d = HH ( d, a, b, c, x[ 8], S32, 0x8771f681); c = HH ( c, d, a, b, x[11], S33, 0x6d9d6122); b = HH ( b, c, d, a, x[14], S34, 0xfde5380c); a = HH ( a, b, c, d, x[ 1], S31, 0xa4beea44); d = HH ( d, a, b, c, x[ 4], S32, 0x4bdecfa9); c = HH ( c, d, a, b, x[ 7], S33, 0xf6bb4b60); b = HH ( b, c, d, a, x[10], S34, 0xbebfbc70); a = HH ( a, b, c, d, x[13], S31, 0x289b7ec6); d = HH ( d, a, b, c, x[ 0], S32, 0xeaa127fa); c = HH ( c, d, a, b, x[ 3], S33, 0xd4ef3085); b = HH ( b, c, d, a, x[ 6], S34, 0x4881d05); a = HH ( a, b, c, d, x[ 9], S31, 0xd9d4d039); d = HH ( d, a, b, c, x[12], S32, 0xe6db99e5); c = HH ( c, d, a, b, x[15], S33, 0x1fa27cf8); b = HH ( b, c, d, a, x[ 2], S34, 0xc4ac5665); a = II ( a, b, c, d, x[ 0], S41, 0xf4292244); d = II ( d, a, b, c, x[ 7], S42, 0x432aff97); c = II ( c, d, a, b, x[14], S43, 0xab9423a7); b = II ( b, c, d, a, x[ 5], S44, 0xfc93a039); a = II ( a, b, c, d, x[12], S41, 0x655b59c3); d = II ( d, a, b, c, x[ 3], S42, 0x8f0ccc92); c = II ( c, d, a, b, x[10], S43, 0xffeff47d); b = II ( b, c, d, a, x[ 1], S44, 0x85845dd1); a = II ( a, b, c, d, x[ 8], S41, 0x6fa87e4f); d = II ( d, a, b, c, x[15], S42, 0xfe2ce6e0); c = II ( c, d, a, b, x[ 6], S43, 0xa3014314); b = II ( b, c, d, a, x[13], S44, 0x4e0811a1); a = II ( a, b, c, d, x[ 4], S41, 0xf7537e82); d = II ( d, a, b, c, x[11], S42, 0xbd3af235); c = II ( c, d, a, b, x[ 2], S43, 0x2ad7d2bb); b = II ( b, c, d, a, x[ 9], S44, 0xeb86d391); state[0] += a; state[1] += b; state[2] += c; state[3] += d; } public void init() { count = 0; state[0] = INIT_0; state[1] = INIT_1; state[2] = INIT_2; state[3] = INIT_3; digestValid = false; for (int i = 0; i < digest.length; i++) { digest[i] = 0; } } public void update(byte b) { int index; index = (int) ((count >>> 3) & 0x3f); count += 8; buffer[index] = b; if (index >= 63) { transform(buffer, 0); } } public void update(byte input[]) { for (int i = 0; i < input.length; i++) { update(input[i]); } } public void computeDigest(byte source[]) { init(); update(source); finish(); } public void finish() { byte bits[] = new byte[8]; byte padding[]; int i, index, padLen; for (i = 0; i < 8; i++) { bits[i] = (byte)((count >>> (i * 8)) & 0xff); } index = (int)(count >> 3) & 0x3f; padLen = (index < 56) ? (56 - index) : (120 - index); padding = new byte[padLen]; padding[0] = (byte) 0x80; update(padding); update(bits); for (i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { digest[i*4+j] = (byte)((state[i] >>> (j * 8)) & 0xff); } } digestValid = true; } public static void main(String[] args) { MD5 md5 = new MD5(); md5.computeDigest(args[0].getBytes()); System.out.println(md5.digest); } }
不错,.js,的我也有,发给你们, .js 源码: /* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as defined in RFC 1321. * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet * Distributed under the BSD License * See http://pajhome.org.uk/crypt/md5 for more info. *//* * Configurable variables. You may need to tweak these to be compatible with * the server-side, but the defaults work in most cases. */ 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 str_md5(s){ return binl2str(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)); } function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }/* * 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 string */ function binl2str(bin) { var str = ""; var mask = (1 << chrsz) - 1; for(var i = 0; i < bin.length * 32; i += chrsz) str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); return str; }/* * 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; }
* 将 字符串 source 进行MD5编码
* @param source 源字符串
* @return 转换后的字符串
*/
public static String getMd5(String source) {
char hexDigits[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'}; try {
byte[] strTemp = source.getBytes();
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(strTemp);
byte[] md = messageDigest.digest(); int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
}
catch (Exception e) {
return null;
} }
public class MD5 { public byte[] digest; public boolean digestValid; private int state[];
private long count;
private byte buffer[];
private static int transformBuffer[]; private static final int S11 = 7;
private static final int S12 = 12;
private static final int S13 = 17;
private static final int S14 = 22;
private static final int S21 = 5;
private static final int S22 = 9;
private static final int S23 = 14;
private static final int S24 = 20;
private static final int S31 = 4;
private static final int S32 = 11;
private static final int S33 = 16;
private static final int S34 = 23;
private static final int S41 = 6;
private static final int S42 = 10;
private static final int S43 = 15;
private static final int S44 = 21; private static final int INIT_0 = 0x67452301;
private static final int INIT_1 = 0xefcdab89;
private static final int INIT_2 = 0x98badcfe;
private static final int INIT_3 = 0x10325476; public MD5() {
state = new int[4];
count = 0;
if (transformBuffer == null) {
transformBuffer = new int[16];
}
buffer = new byte[64];
digest = new byte[16];
digestValid = false;
} public MD5(byte mydigest[]) {
state = new int[4];
count = 0;
if (transformBuffer == null) {
transformBuffer = new int[16];
}
buffer = new byte[64];
digest = mydigest;
digestValid = false;
} private int F(int x, int y, int z) {
return ((x & y) | ((~x) & z));
} private int G(int x, int y, int z) {
return ((x & z) | (y & (~z)));
} private int H(int x, int y, int z) {
return ((x ^ y) ^ z);
} private int I(int x, int y, int z) {
return (y ^ (x | (~z)));
} private int rotateLeft(int a, int n) {
return ((a << n) | (a >>> (32 - n)));
} private int FF(int a, int b, int c, int d, int x, int s, int ac) {
a += F(b, c, d) + x + ac;
a = rotateLeft(a, s);
a += b;
return a;
} private int GG(int a, int b, int c, int d, int x, int s, int ac) {
a += G(b, c, d) + x + ac;
a = rotateLeft(a, s);
a += b;
return a;
} private int HH(int a, int b, int c, int d, int x, int s, int ac) {
a += H(b, c, d) + x + ac;
a = rotateLeft(a, s);
a += b;
return a;
} private int II(int a, int b, int c, int d, int x, int s, int ac) {
a += I(b, c, d) + x + ac;
a = rotateLeft(a, s);
a += b;
return a;
} void transform(byte buf[], int offset) {
int a, b, c, d;
int x[] = transformBuffer; a = state[0];
b = state[1];
c = state[2];
d = state[3]; for (int i = 0; i < 16; i++) {
x[i] = (int)buf[i*4+offset] & 0xff;
for (int j = 1; j < 4; j++) {
x[i] += ((int)buf[i*4+j+offset] & 0xff) << (j * 8);
}
} a = FF ( a, b, c, d, x[ 0], S11, 0xd76aa478);
d = FF ( d, a, b, c, x[ 1], S12, 0xe8c7b756);
c = FF ( c, d, a, b, x[ 2], S13, 0x242070db);
b = FF ( b, c, d, a, x[ 3], S14, 0xc1bdceee);
a = FF ( a, b, c, d, x[ 4], S11, 0xf57c0faf);
d = FF ( d, a, b, c, x[ 5], S12, 0x4787c62a);
c = FF ( c, d, a, b, x[ 6], S13, 0xa8304613);
b = FF ( b, c, d, a, x[ 7], S14, 0xfd469501);
a = FF ( a, b, c, d, x[ 8], S11, 0x698098d8);
d = FF ( d, a, b, c, x[ 9], S12, 0x8b44f7af);
c = FF ( c, d, a, b, x[10], S13, 0xffff5bb1);
b = FF ( b, c, d, a, x[11], S14, 0x895cd7be);
a = FF ( a, b, c, d, x[12], S11, 0x6b901122);
d = FF ( d, a, b, c, x[13], S12, 0xfd987193);
c = FF ( c, d, a, b, x[14], S13, 0xa679438e);
b = FF ( b, c, d, a, x[15], S14, 0x49b40821); a = GG ( a, b, c, d, x[ 1], S21, 0xf61e2562);
d = GG ( d, a, b, c, x[ 6], S22, 0xc040b340);
c = GG ( c, d, a, b, x[11], S23, 0x265e5a51);
b = GG ( b, c, d, a, x[ 0], S24, 0xe9b6c7aa);
a = GG ( a, b, c, d, x[ 5], S21, 0xd62f105d);
d = GG ( d, a, b, c, x[10], S22, 0x2441453);
c = GG ( c, d, a, b, x[15], S23, 0xd8a1e681);
b = GG ( b, c, d, a, x[ 4], S24, 0xe7d3fbc8);
a = GG ( a, b, c, d, x[ 9], S21, 0x21e1cde6);
d = GG ( d, a, b, c, x[14], S22, 0xc33707d6);
c = GG ( c, d, a, b, x[ 3], S23, 0xf4d50d87);
b = GG ( b, c, d, a, x[ 8], S24, 0x455a14ed);
a = GG ( a, b, c, d, x[13], S21, 0xa9e3e905);
d = GG ( d, a, b, c, x[ 2], S22, 0xfcefa3f8);
c = GG ( c, d, a, b, x[ 7], S23, 0x676f02d9);
b = GG ( b, c, d, a, x[12], S24, 0x8d2a4c8a); a = HH ( a, b, c, d, x[ 5], S31, 0xfffa3942);
d = HH ( d, a, b, c, x[ 8], S32, 0x8771f681);
c = HH ( c, d, a, b, x[11], S33, 0x6d9d6122);
b = HH ( b, c, d, a, x[14], S34, 0xfde5380c);
a = HH ( a, b, c, d, x[ 1], S31, 0xa4beea44);
d = HH ( d, a, b, c, x[ 4], S32, 0x4bdecfa9);
c = HH ( c, d, a, b, x[ 7], S33, 0xf6bb4b60);
b = HH ( b, c, d, a, x[10], S34, 0xbebfbc70);
a = HH ( a, b, c, d, x[13], S31, 0x289b7ec6);
d = HH ( d, a, b, c, x[ 0], S32, 0xeaa127fa);
c = HH ( c, d, a, b, x[ 3], S33, 0xd4ef3085);
b = HH ( b, c, d, a, x[ 6], S34, 0x4881d05);
a = HH ( a, b, c, d, x[ 9], S31, 0xd9d4d039);
d = HH ( d, a, b, c, x[12], S32, 0xe6db99e5);
c = HH ( c, d, a, b, x[15], S33, 0x1fa27cf8);
b = HH ( b, c, d, a, x[ 2], S34, 0xc4ac5665); a = II ( a, b, c, d, x[ 0], S41, 0xf4292244);
d = II ( d, a, b, c, x[ 7], S42, 0x432aff97);
c = II ( c, d, a, b, x[14], S43, 0xab9423a7);
b = II ( b, c, d, a, x[ 5], S44, 0xfc93a039);
a = II ( a, b, c, d, x[12], S41, 0x655b59c3);
d = II ( d, a, b, c, x[ 3], S42, 0x8f0ccc92);
c = II ( c, d, a, b, x[10], S43, 0xffeff47d);
b = II ( b, c, d, a, x[ 1], S44, 0x85845dd1);
a = II ( a, b, c, d, x[ 8], S41, 0x6fa87e4f);
d = II ( d, a, b, c, x[15], S42, 0xfe2ce6e0);
c = II ( c, d, a, b, x[ 6], S43, 0xa3014314);
b = II ( b, c, d, a, x[13], S44, 0x4e0811a1);
a = II ( a, b, c, d, x[ 4], S41, 0xf7537e82);
d = II ( d, a, b, c, x[11], S42, 0xbd3af235);
c = II ( c, d, a, b, x[ 2], S43, 0x2ad7d2bb);
b = II ( b, c, d, a, x[ 9], S44, 0xeb86d391); state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
} public void init() { count = 0; state[0] = INIT_0;
state[1] = INIT_1;
state[2] = INIT_2;
state[3] = INIT_3; digestValid = false; for (int i = 0; i < digest.length; i++) {
digest[i] = 0;
}
} public void update(byte b) {
int index; index = (int) ((count >>> 3) & 0x3f);
count += 8;
buffer[index] = b;
if (index >= 63) {
transform(buffer, 0);
}
} public void update(byte input[]) {
for (int i = 0; i < input.length; i++) {
update(input[i]);
}
} public void computeDigest(byte source[]) {
init();
update(source);
finish();
} public void finish() {
byte bits[] = new byte[8];
byte padding[];
int i, index, padLen; for (i = 0; i < 8; i++) {
bits[i] = (byte)((count >>> (i * 8)) & 0xff);
} index = (int)(count >> 3) & 0x3f;
padLen = (index < 56) ? (56 - index) : (120 - index);
padding = new byte[padLen];
padding[0] = (byte) 0x80;
update(padding);
update(bits); for (i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
digest[i*4+j] = (byte)((state[i] >>> (j * 8)) & 0xff);
}
}
digestValid = true;
} public static void main(String[] args) {
MD5 md5 = new MD5();
md5.computeDigest(args[0].getBytes());
System.out.println(md5.digest);
}
}
.js 源码:
/*
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
*//*
* Configurable variables. You may need to tweak these to be compatible with
* the server-side, but the defaults work in most cases.
*/
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 str_md5(s){ return binl2str(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)); }
function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); }/*
* 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 string
*/
function binl2str(bin)
{
var str = "";
var mask = (1 << chrsz) - 1;
for(var i = 0; i < bin.length * 32; i += chrsz)
str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
return str;
}/*
* 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;
}
==================================================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0038)http://localhost:8080/servlet/hgslpass -->
<HTML><HEAD><TITLE>加密算法</TITLE>
<META content="MSHTML 6.00.2800.1106" name=GENERATOR>
<META content=8_0_2-026 name=Version>
<META content=加密算法 name=Description>
<META http-equiv=Content-Type content="text/html; charset=UTF-8"><LINK
href="/images/styles.css" type=text/css rel=stylesheet><LINK
href="加密算法.files/Default.css" type=text/css rel=stylesheet>
<SCRIPT language=JavaScript src="加密算法.files/gxfwddcl.js"></SCRIPT><SCRIPT language=JavaScript src="加密算法.files/calendar.js"></SCRIPT><SCRIPT language=JavaScript src="加密算法.files/calendar-setup.js"></SCRIPT><SCRIPT language=JavaScript src="加密算法.files/calendar-en.js"></SCRIPT>
</HEAD>
<BODY class=Form onkeydown=form_onkeypress(event,false); bgColor=#ffffff>
<FORM id=MAINFORM name=MAINFORM action=hgslpass method=post>
<P>
<TABLE class=Table id=TBL3
style="BORDER-TOP-WIDTH: 1px; BORDER-LEFT-WIDTH: 1px; BORDER-LEFT-COLOR: #ffe0c0; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #ffe0c0; WIDTH: 822px; BORDER-TOP-COLOR: #ffe0c0; HEIGHT: 542px; BACKGROUND-COLOR: #0080ff; BORDER-RIGHT-WIDTH: 1px; BORDER-RIGHT-COLOR: #ffe0c0"
cellSpacing=2 cellPadding=6 border=1>
<TBODY>
<TR>
<TD style="WIDTH: 2%; HEIGHT: 5%" width="2%" height="5%"></TD>
<TD>
<P align=center>数据加密算法</P></TD>
<TD style="WIDTH: 2%" width="2%"></TD></TR>
<TR>
<TD></TD>
<TD style="BACKGROUND-COLOR: #ffe0c0" bgColor=#ffe0c0>
<H2>加密示例</H2>
<SCRIPT src="加密算法.files/md4.js" type=text/javascript></SCRIPT> <SCRIPT src="加密算法.files/md5.js" type=text/javascript></SCRIPT> <SCRIPT src="加密算法.files/sha1.js" type=text/javascript></SCRIPT>
<FORM>
<TABLE id=TBL4 cellSpacing=2 cellPadding=1>
<TBODY>
<TR>
<TH>输入数据</TH>
<TD><INPUT size=40 name=input></TD></TR>
<TR>
<TH>选择加密方法</TH>
<TD style="TEXT-ALIGN: center"><INPUT onclick="hash.value = hex_md4(input.value)" type=button value=MD4>
<INPUT onclick="hash.value = hex_md5(input.value)" type=button value=MD5>
<INPUT onclick="hash.value = hex_sha1(input.value)" type=button value=SHA-1></TD></TR>
<TR>
<TH>加密结果</TH>
<TD><INPUT size=40 name=hash></TD></TR></TBODY></TABLE></FORM>
<P class=code>hex_md4("test hash") =
"549089516e75bd13c41ff098fbb58d5e"<BR>hex_md5("message digest") =
"f96b697d7cb7938d525a2f31aaf161d0"<BR>hex_sha1("160-bit hash") =
"90d925d853c3d35cd54070bb75280fefad9de9e7" </P>
<H4>这是JavaScript加密算法测试页,可以进行任何文件的加密,在理论上是不"可能破"解的</H4></TD>
<TD></TD></TR>
<TR>
<TD style="HEIGHT: 5%" height="5%"></TD>
<TD></TD>
<TD></TD></TR></TBODY></TABLE></P></FORM>
<SCRIPT language=JavaScript type=text/javascript>
var GXPARAMETERS = new Array();
function GX_js_close()
{
if (document.forms[0].sCallerURL.value != "")
{
location.assign(document.forms[0].sCallerURL.value);
}
else
{
self.close();
}
}
</SCRIPT><SCRIPT language=JavaScript src="加密算法.files/setevent.js"></SCRIPT><SCRIPT language=JavaScript src="加密算法.files/gx_help.js"></SCRIPT>
</BODY></HTML>
================================================================
只要把上面保存为html,注意修改目录,然后打开html,输入数据就可以试用加密了:)