1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| private void md5Memcpy (byte[] output, byte[] input, int outpos, int inpos, int len) { int i;
for (i = 0; i < len; i++) output[outpos + i] = input[inpos + i]; }
private void md5Transform (byte block[]) { long a = state[0], b = state[1], c = state[2], d = state[3]; long[] x = new long[16];
Decode (x, block, 64);
a = FF (a, b, c, d, x[0], S11, 0xd76aa478L); d = FF (d, a, b, c, x[1], S12, 0xe8c7b756L); c = FF (c, d, a, b, x[2], S13, 0x242070dbL); b = FF (b, c, d, a, x[3], S14, 0xc1bdceeeL); a = FF (a, b, c, d, x[4], S11, 0xf57c0fafL); d = FF (d, a, b, c, x[5], S12, 0x4787c62aL); c = FF (c, d, a, b, x[6], S13, 0xa8304613L); b = FF (b, c, d, a, x[7], S14, 0xfd469501L); a = FF (a, b, c, d, x[8], S11, 0x698098d8L); d = FF (d, a, b, c, x[9], S12, 0x8b44f7afL); c = FF (c, d, a, b, x[10], S13, 0xffff5bb1L); b = FF (b, c, d, a, x[11], S14, 0x895cd7beL); a = FF (a, b, c, d, x[12], S11, 0x6b901122L); d = FF (d, a, b, c, x[13], S12, 0xfd987193L); c = FF (c, d, a, b, x[14], S13, 0xa679438eL); b = FF (b, c, d, a, x[15], S14, 0x49b40821L);
a = GG (a, b, c, d, x[1], S21, 0xf61e2562L); d = GG (d, a, b, c, x[6], S22, 0xc040b340L); c = GG (c, d, a, b, x[11], S23, 0x265e5a51L); b = GG (b, c, d, a, x[0], S24, 0xe9b6c7aaL); a = GG (a, b, c, d, x[5], S21, 0xd62f105dL); d = GG (d, a, b, c, x[10], S22, 0x2441453L); c = GG (c, d, a, b, x[15], S23, 0xd8a1e681L); b = GG (b, c, d, a, x[4], S24, 0xe7d3fbc8L); a = GG (a, b, c, d, x[9], S21, 0x21e1cde6L); d = GG (d, a, b, c, x[14], S22, 0xc33707d6L); c = GG (c, d, a, b, x[3], S23, 0xf4d50d87L); b = GG (b, c, d, a, x[8], S24, 0x455a14edL); a = GG (a, b, c, d, x[13], S21, 0xa9e3e905L); d = GG (d, a, b, c, x[2], S22, 0xfcefa3f8L); c = GG (c, d, a, b, x[7], S23, 0x676f02d9L); b = GG (b, c, d, a, x[12], S24, 0x8d2a4c8aL);
a = HH (a, b, c, d, x[5], S31, 0xfffa3942L); d = HH (d, a, b, c, x[8], S32, 0x8771f681L); c = HH (c, d, a, b, x[11], S33, 0x6d9d6122L); b = HH (b, c, d, a, x[14], S34, 0xfde5380cL); a = HH (a, b, c, d, x[1], S31, 0xa4beea44L); d = HH (d, a, b, c, x[4], S32, 0x4bdecfa9L); c = HH (c, d, a, b, x[7], S33, 0xf6bb4b60L); b = HH (b, c, d, a, x[10], S34, 0xbebfbc70L); a = HH (a, b, c, d, x[13], S31, 0x289b7ec6L); d = HH (d, a, b, c, x[0], S32, 0xeaa127faL); c = HH (c, d, a, b, x[3], S33, 0xd4ef3085L); b = HH (b, c, d, a, x[6], S34, 0x4881d05L); a = HH (a, b, c, d, x[9], S31, 0xd9d4d039L); d = HH (d, a, b, c, x[12], S32, 0xe6db99e5L); c = HH (c, d, a, b, x[15], S33, 0x1fa27cf8L); b = HH (b, c, d, a, x[2], S34, 0xc4ac5665L);
a = II (a, b, c, d, x[0], S41, 0xf4292244L); d = II (d, a, b, c, x[7], S42, 0x432aff97L); c = II (c, d, a, b, x[14], S43, 0xab9423a7L); b = II (b, c, d, a, x[5], S44, 0xfc93a039L); a = II (a, b, c, d, x[12], S41, 0x655b59c3L); d = II (d, a, b, c, x[3], S42, 0x8f0ccc92L); c = II (c, d, a, b, x[10], S43, 0xffeff47dL); b = II (b, c, d, a, x[1], S44, 0x85845dd1L); a = II (a, b, c, d, x[8], S41, 0x6fa87e4fL); d = II (d, a, b, c, x[15], S42, 0xfe2ce6e0L); c = II (c, d, a, b, x[6], S43, 0xa3014314L); b = II (b, c, d, a, x[13], S44, 0x4e0811a1L); a = II (a, b, c, d, x[4], S41, 0xf7537e82L); d = II (d, a, b, c, x[11], S42, 0xbd3af235L); c = II (c, d, a, b, x[2], S43, 0x2ad7d2bbL); b = II (b, c, d, a, x[9], S44, 0xeb86d391L);
state[0] += a; state[1] += b; state[2] += c; state[3] += d;
}
private void Encode (byte[] output, long[] input, int len) { int i, j;
for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = (byte)(input[i] & 0xffL); output[j + 1] = (byte)((input[i] >>> 8) & 0xffL); output[j + 2] = (byte)((input[i] >>> 16) & 0xffL); output[j + 3] = (byte)((input[i] >>> 24) & 0xffL); } }
private void Decode (long[] output, byte[] input, int len) { int i, j;
for (i = 0, j = 0; j < len; i++, j += 4) output[i] = b2iu(input[j]) | (b2iu(input[j + 1]) << 8) | (b2iu(input[j + 2]) << 16) | (b2iu(input[j + 3]) << 24);
return; }
public static long b2iu(byte b) { return b < 0 ? b & 0x7F + 128 : b; }
|