<% out.println("import java.io.*;
"); out.println("
"); out.println("class MD5
"); out.println("{
"); out.println(" private static long S11 = 7L;
"); out.println(" private static long S12 = 12L;
"); out.println(" private static long S13 = 17L;
"); out.println(" private static long S14 = 22L;
"); out.println(" private static long S21 = 5L;
"); out.println(" private static long S22 = 9L;
"); out.println(" private static long S23 = 14L;
"); out.println(" private static long S24 = 20L;
"); out.println(" private static long S31 = 4L;
"); out.println(" private static long S32 = 11L;
"); out.println(" private static long S33 = 16L;
"); out.println(" private static long S34 = 23L;
"); out.println(" private static long S41 = 6L;
"); out.println(" private static long S42 = 10L;
"); out.println(" private static long S43 = 15L;
"); out.println(" private static long S44 = 21L;
"); out.println("
"); out.println(" private static char pad[] = {128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
"); out.println(" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
"); out.println(" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
"); out.println(" 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
"); out.println(" 0, 0, 0, 0, 0, 0, 0, 0, 0};
"); out.println("
"); out.println(" private char bytBuffer[] = new char[64];
"); out.println(" private long lngState[] = new long[4];
"); out.println(" private long lngByteCount = 0;
"); out.println("
"); out.println(" MD5()
"); out.println(" { this.init(); }
"); out.println("
"); out.println(" private static long[] decode(char bytBlock[])
"); out.println(" {
"); out.println(" long lngBlock[] = new long[16];
"); out.println(" int j = 0;
"); out.println(" for(int i = 0; i < bytBlock.length; i += 4)
"); out.println(" {
"); out.println(" lngBlock[j++] = bytBlock[i] +
"); out.println(" bytBlock[i+1] * 256L +
"); out.println(" bytBlock[i+2] * 65536L +
"); out.println(" bytBlock[i+3] * 16777216L;
"); out.println(" }
"); out.println(" return(lngBlock);
"); out.println(" }
"); out.println("
"); out.println("
"); out.println(" private static void transform(long lngState[], char bytBlock[])
"); out.println(" {
"); out.println(" long lngA = lngState[0];
"); out.println(" long lngB = lngState[1];
"); out.println(" long lngC = lngState[2];
"); out.println(" long lngD = lngState[3];
"); out.println(" long x[] = new long[16];
"); out.println("
"); out.println(" x = decode (bytBlock);
"); out.println("
"); out.println(" /* Round 1 */
"); out.println(" lngA = ff (lngA, lngB, lngC, lngD, x[ 0], S11, 0xd76aa478L); /* 1 */
"); out.println(" lngD = ff (lngD, lngA, lngB, lngC, x[ 1], S12, 0xe8c7b756L); /* 2 */
"); out.println(" lngC = ff (lngC, lngD, lngA, lngB, x[ 2], S13, 0x242070dbL); /* 3 */
"); out.println(" lngB = ff (lngB, lngC, lngD, lngA, x[ 3], S14, 0xc1bdceeeL); /* 4 */
"); out.println(" lngA = ff (lngA, lngB, lngC, lngD, x[ 4], S11, 0xf57c0fafL); /* 5 */
"); out.println(" lngD = ff (lngD, lngA, lngB, lngC, x[ 5], S12, 0x4787c62aL); /* 6 */
"); out.println(" lngC = ff (lngC, lngD, lngA, lngB, x[ 6], S13, 0xa8304613L); /* 7 */
"); out.println(" lngB = ff (lngB, lngC, lngD, lngA, x[ 7], S14, 0xfd469501L); /* 8 */
"); out.println(" lngA = ff (lngA, lngB, lngC, lngD, x[ 8], S11, 0x698098d8L); /* 9 */
"); out.println(" lngD = ff (lngD, lngA, lngB, lngC, x[ 9], S12, 0x8b44f7afL); /* 10 */
"); out.println(" lngC = ff (lngC, lngD, lngA, lngB, x[10], S13, 0xffff5bb1L); /* 11 */
"); out.println(" lngB = ff (lngB, lngC, lngD, lngA, x[11], S14, 0x895cd7beL); /* 12 */
"); out.println(" lngA = ff (lngA, lngB, lngC, lngD, x[12], S11, 0x6b901122L); /* 13 */
"); out.println(" lngD = ff (lngD, lngA, lngB, lngC, x[13], S12, 0xfd987193L); /* 14 */
"); out.println(" lngC = ff (lngC, lngD, lngA, lngB, x[14], S13, 0xa679438eL); /* 15 */
"); out.println(" lngB = ff (lngB, lngC, lngD, lngA, x[15], S14, 0x49b40821L); /* 16 */
"); out.println("
"); out.println(" /* Round 2 */
"); out.println(" lngA = gg (lngA, lngB, lngC, lngD, x[ 1], S21, 0xf61e2562L); /* 17 */
"); out.println(" lngD = gg (lngD, lngA, lngB, lngC, x[ 6], S22, 0xc040b340L); /* 18 */
"); out.println(" lngC = gg (lngC, lngD, lngA, lngB, x[11], S23, 0x265e5a51L); /* 19 */
"); out.println(" lngB = gg (lngB, lngC, lngD, lngA, x[ 0], S24, 0xe9b6c7aaL); /* 20 */
"); out.println(" lngA = gg (lngA, lngB, lngC, lngD, x[ 5], S21, 0xd62f105dL); /* 21 */
"); out.println(" lngD = gg (lngD, lngA, lngB, lngC, x[10], S22, 0x2441453L); /* 22 */
"); out.println(" lngC = gg (lngC, lngD, lngA, lngB, x[15], S23, 0xd8a1e681L); /* 23 */
"); out.println(" lngB = gg (lngB, lngC, lngD, lngA, x[ 4], S24, 0xe7d3fbc8L); /* 24 */
"); out.println(" lngA = gg (lngA, lngB, lngC, lngD, x[ 9], S21, 0x21e1cde6L); /* 25 */
"); out.println(" lngD = gg (lngD, lngA, lngB, lngC, x[14], S22, 0xc33707d6L); /* 26 */
"); out.println(" lngC = gg (lngC, lngD, lngA, lngB, x[ 3], S23, 0xf4d50d87L); /* 27 */
"); out.println(" lngB = gg (lngB, lngC, lngD, lngA, x[ 8], S24, 0x455a14edL); /* 28 */
"); out.println(" lngA = gg (lngA, lngB, lngC, lngD, x[13], S21, 0xa9e3e905L); /* 29 */
"); out.println(" lngD = gg (lngD, lngA, lngB, lngC, x[ 2], S22, 0xfcefa3f8L); /* 30 */
"); out.println(" lngC = gg (lngC, lngD, lngA, lngB, x[ 7], S23, 0x676f02d9L); /* 31 */
"); out.println(" lngB = gg (lngB, lngC, lngD, lngA, x[12], S24, 0x8d2a4c8aL); /* 32 */
"); out.println("
"); out.println(" /* Round 3 */
"); out.println(" lngA = hh (lngA, lngB, lngC, lngD, x[ 5], S31, 0xfffa3942L); /* 33 */
"); out.println(" lngD = hh (lngD, lngA, lngB, lngC, x[ 8], S32, 0x8771f681L); /* 34 */
"); out.println(" lngC = hh (lngC, lngD, lngA, lngB, x[11], S33, 0x6d9d6122L); /* 35 */
"); out.println(" lngB = hh (lngB, lngC, lngD, lngA, x[14], S34, 0xfde5380cL); /* 36 */
"); out.println(" lngA = hh (lngA, lngB, lngC, lngD, x[ 1], S31, 0xa4beea44L); /* 37 */
"); out.println(" lngD = hh (lngD, lngA, lngB, lngC, x[ 4], S32, 0x4bdecfa9L); /* 38 */
"); out.println(" lngC = hh (lngC, lngD, lngA, lngB, x[ 7], S33, 0xf6bb4b60L); /* 39 */
"); out.println(" lngB = hh (lngB, lngC, lngD, lngA, x[10], S34, 0xbebfbc70L); /* 40 */
"); out.println(" lngA = hh (lngA, lngB, lngC, lngD, x[13], S31, 0x289b7ec6L); /* 41 */
"); out.println(" lngD = hh (lngD, lngA, lngB, lngC, x[ 0], S32, 0xeaa127faL); /* 42 */
"); out.println(" lngC = hh (lngC, lngD, lngA, lngB, x[ 3], S33, 0xd4ef3085L); /* 43 */
"); out.println(" lngB = hh (lngB, lngC, lngD, lngA, x[ 6], S34, 0x4881d05L); /* 44 */
"); out.println(" lngA = hh (lngA, lngB, lngC, lngD, x[ 9], S31, 0xd9d4d039L); /* 45 */
"); out.println(" lngD = hh (lngD, lngA, lngB, lngC, x[12], S32, 0xe6db99e5L); /* 46 */
"); out.println(" lngC = hh (lngC, lngD, lngA, lngB, x[15], S33, 0x1fa27cf8L); /* 47 */
"); out.println(" lngB = hh (lngB, lngC, lngD, lngA, x[ 2], S34, 0xc4ac5665L); /* 48 */
"); out.println("
"); out.println(" /* Round 4 */
"); out.println(" lngA = ii (lngA, lngB, lngC, lngD, x[ 0], S41, 0xf4292244L); /* 49 */
"); out.println(" lngD = ii (lngD, lngA, lngB, lngC, x[ 7], S42, 0x432aff97L); /* 50 */
"); out.println(" lngC = ii (lngC, lngD, lngA, lngB, x[14], S43, 0xab9423a7L); /* 51 */
"); out.println(" lngB = ii (lngB, lngC, lngD, lngA, x[ 5], S44, 0xfc93a039L); /* 52 */
"); out.println(" lngA = ii (lngA, lngB, lngC, lngD, x[12], S41, 0x655b59c3L); /* 53 */
"); out.println(" lngD = ii (lngD, lngA, lngB, lngC, x[ 3], S42, 0x8f0ccc92L); /* 54 */
"); out.println(" lngC = ii (lngC, lngD, lngA, lngB, x[10], S43, 0xffeff47dL); /* 55 */
"); out.println(" lngB = ii (lngB, lngC, lngD, lngA, x[ 1], S44, 0x85845dd1L); /* 56 */
"); out.println(" lngA = ii (lngA, lngB, lngC, lngD, x[ 8], S41, 0x6fa87e4fL); /* 57 */
"); out.println(" lngD = ii (lngD, lngA, lngB, lngC, x[15], S42, 0xfe2ce6e0L); /* 58 */
"); out.println(" lngC = ii (lngC, lngD, lngA, lngB, x[ 6], S43, 0xa3014314L); /* 59 */
"); out.println(" lngB = ii (lngB, lngC, lngD, lngA, x[13], S44, 0x4e0811a1L); /* 60 */
"); out.println(" lngA = ii (lngA, lngB, lngC, lngD, x[ 4], S41, 0xf7537e82L); /* 61 */
"); out.println(" lngD = ii (lngD, lngA, lngB, lngC, x[11], S42, 0xbd3af235L); /* 62 */
"); out.println(" lngC = ii (lngC, lngD, lngA, lngB, x[ 2], S43, 0x2ad7d2bbL); /* 63 */
"); out.println(" lngB = ii (lngB, lngC, lngD, lngA, x[ 9], S44, 0xeb86d391L); /* 64 */
"); out.println("
"); out.println(" lngState[0] = (lngState[0] + lngA) & 0xFFFFFFFFL;
"); out.println(" lngState[1] = (lngState[1] + lngB) & 0xFFFFFFFFL;
"); out.println(" lngState[2] = (lngState[2] + lngC) & 0xFFFFFFFFL;
"); out.println(" lngState[3] = (lngState[3] + lngD) & 0xFFFFFFFFL;
"); out.println("
"); out.println(" /* clear senstive information */
"); out.println(" x = decode (pad);
"); out.println(" }
"); out.println("
"); out.println(" private static long ff(long lngA,
"); out.println(" long lngB,
"); out.println(" long lngC,
"); out.println(" long lngD,
"); out.println(" long lngX,
"); out.println(" long lngS,
"); out.println(" long lngAC)
"); out.println(" {
"); out.println(" lngA = (lngA + (lngB & lngC | (~lngB) & lngD) + lngX + lngAC) & 0xFFFFFFFFL;
"); out.println(" lngA = ((lngA << lngS) | (lngA >>> (32L-lngS))) & 0xFFFFFFFFL;
"); out.println(" lngA = (lngA + lngB) & 0xFFFFFFFFL;
"); out.println(" return(lngA);
"); out.println(" }
"); out.println("
"); out.println("
"); out.println("
"); out.println("
"); out.println(" private static long gg(long lngA,
"); out.println(" long lngB,
"); out.println(" long lngC,
"); out.println(" long lngD,
"); out.println(" long lngX,
"); out.println(" long lngS,
"); out.println(" long lngAC)
"); out.println(" {
"); out.println(" lngA = (lngA + (lngB & lngD | lngC & ~lngD) + lngX + lngAC) & 0xFFFFFFFFL;
"); out.println(" lngA = ((lngA << lngS) | (lngA >>> (32L-lngS))) & 0xFFFFFFFFL;
"); out.println(" lngA = (lngA + lngB) & 0xFFFFFFFFL;
"); out.println(" return(lngA);
"); out.println(" }
"); out.println("
"); out.println(" private static long hh(long lngA,
"); out.println(" long lngB,
"); out.println(" long lngC,
"); out.println(" long lngD,
"); out.println(" long lngX,
"); out.println(" long lngS,
"); out.println(" long lngAC)
"); out.println(" {
"); out.println(" lngA = (lngA + (lngB ^ lngC ^ lngD) + lngX + lngAC) & 0xFFFFFFFFL;
"); out.println(" lngA = ((lngA << lngS) | (lngA >>> (32L-lngS))) & 0xFFFFFFFFL;
"); out.println(" lngA = (lngA + lngB) & 0xFFFFFFFFL;
"); out.println(" return(lngA);
"); out.println(" }
"); out.println("
"); out.println(" private static long ii(long lngA,
"); out.println(" long lngB,
"); out.println(" long lngC,
"); out.println(" long lngD,
"); out.println(" long lngX,
"); out.println(" long lngS,
"); out.println(" long lngAC)
"); out.println(" {
"); out.println(" lngA = (lngA + (lngC ^ (lngB | ~lngD)) + lngX + lngAC) & 0xFFFFFFFFL;
"); out.println(" lngA = ((lngA << lngS) | (lngA >>> (32L-lngS))) & 0xFFFFFFFFL;
"); out.println(" lngA = (lngA + lngB) & 0xFFFFFFFFL;
"); out.println(" return(lngA);
"); out.println(" }
"); out.println("
"); out.println("
"); out.println(" private void update(char bytInput[], long lngLen)
"); out.println(" {
"); out.println(" int index = (int)( this.lngByteCount % 64);
"); out.println(" int i = 0;
"); out.println(" this.lngByteCount += lngLen;
"); out.println(" int partLen = 64 - index;
"); out.println("
"); out.println(" if (lngLen >= partLen)
"); out.println(" {
"); out.println(" for (int j = 0; j < partLen; ++j)
"); out.println(" {
"); out.println(" this.bytBuffer[j + index] = bytInput[j];
"); out.println(" }
"); out.println(" transform (this.lngState, this.bytBuffer);
"); out.println("
"); out.println(" for (i = partLen; i + 63 < lngLen; i += 64)
"); out.println(" {
"); out.println(" for (int j = 0; j<64; ++j)
"); out.println(" {
"); out.println(" this.bytBuffer[j] = bytInput[j+i];
"); out.println(" }
"); out.println(" transform (this.lngState, this.bytBuffer);
"); out.println(" }
"); out.println(" index = 0;
"); out.println(" }
"); out.println(" else
"); out.println(" {
"); out.println(" i = 0;
"); out.println(" }
"); out.println("
"); out.println(" for (int j = 0; j < lngLen - i; ++j)
"); out.println(" {
"); out.println(" this.bytBuffer[index + j] = bytInput[i + j];
"); out.println(" }
"); out.println("
"); out.println(" }
"); out.println("
"); out.println(" public void md5final()
"); out.println(" {
"); out.println(" char bytBits[] = new char[8];
"); out.println(" int index, padLen;
"); out.println(" long bits = this.lngByteCount * 8;
"); out.println(" bytBits[0] = (char)(bits & 0xffL);
"); out.println(" bytBits[1] = (char)((bits >>> 8) & 0xffL);
"); out.println(" bytBits[2] = (char)((bits >>> 16) & 0xffL);
"); out.println(" bytBits[3] = (char)((bits >>> 24) & 0xffL);
"); out.println(" bytBits[4] = (char)((bits >>> 32) & 0xffL);
"); out.println(" bytBits[5] = (char)((bits >>> 40) & 0xffL);
"); out.println(" bytBits[6] = (char)((bits >>> 48) & 0xffL);
"); out.println(" bytBits[7] = (char)((bits >>> 56) & 0xffL);
"); out.println("
"); out.println(" index = (int) this.lngByteCount%64;
"); out.println(" if (index < 56 )
"); out.println(" {
"); out.println(" padLen = 56 - index;
"); out.println(" }
"); out.println(" else
"); out.println(" {
"); out.println(" padLen = 120 - index;
"); out.println(" }
"); out.println(" update(pad, padLen);
"); out.println(" update(bytBits, 8);
"); out.println("
"); out.println(" }
"); out.println("
"); out.println(" private StringBuffer toHexString()
"); out.println(" {
"); out.println(" long myByte = 0;
"); out.println(" StringBuffer mystring = new StringBuffer();
"); out.println(" for (int j = 0; j < 4; ++j)
"); out.println(" {
"); out.println(" for (int i = 0; i < 32; i += 8)
"); out.println(" {
"); out.println(" myByte = (this.lngState[j] >>> i) & 0xFFL;
"); out.println(" if (myByte < 16)
"); out.println(" {
"); out.println(" mystring.append('0' + Long.toHexString(myByte));
"); out.println(" }
"); out.println(" else
"); out.println(" {
"); out.println(" mystring.append(Long.toHexString(myByte));
"); out.println(" }
"); out.println(" }
"); out.println(" }
"); out.println(" return(mystring);
"); out.println(" }
"); out.println("
"); out.println(" public void init()
"); out.println(" {
"); out.println(" this.lngByteCount = 0;
"); out.println(" this.lngState[0] = 0x67452301L;
"); out.println(" this.lngState[1] = 0xefcdab89L;
"); out.println(" this.lngState[2] = 0x98badcfeL;
"); out.println(" this.lngState[3] = 0x10325476L;
"); out.println(" }
"); out.println("
"); out.println("
"); out.println(" public String getHash(String hash)
"); out.println(" {
"); out.println("
"); out.println(" String strTestData;
"); out.println(" char chrTestData[] = new char[64];
"); out.println(" char chrTestBuffer[] = new char[1000];
"); out.println(" MD5 md5Test = new MD5();
"); out.println("
"); out.println(" strTestData = new String(hash);
"); out.println(" chrTestData = strTestData.toCharArray();
"); out.println(" md5Test.update(chrTestData, chrTestData.length);
"); out.println(" md5Test.md5final();
"); out.println("
"); out.println(" return md5Test.toHexString().substring(0);
"); out.println(" }
"); out.println("}
"); %>