⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 realchallenge.java

📁 音乐网站下载程序
💻 JAVA
字号:
package org.tools.net.protocol.rstp;

public class RealChallenge {
	private RealChallenge() {
	}

	private static char[] xorTable = new char[] { 0x05, 0x18, 0x74, 0xd0, 0x0d,
			0x09, 0x02, 0x53, 0xc0, 0x01, 0x05, 0x05, 0x67, 0x03, 0x19, 0x70,
			0x08, 0x27, 0x66, 0x10, 0x10, 0x72, 0x08, 0x09, 0x63, 0x11, 0x03,
			0x71, 0x08, 0x08, 0x70, 0x02, 0x10, 0x57, 0x05, 0x18, 0x54, 0x00,
			0x00, 0x00 };

	public static String calcChallenge(String challenge1) {
		char[] buffer = new char[128];

		be32c(buffer, 0xa1e9149d, 0);
		be32c(buffer, 0x0e6b3b59, 4);

		for (int i = 0; i < challenge1.length(); i++) {
			char c = (char) (challenge1.charAt(i) ^ xorTable[i] & 0xffff);
			buffer[8 + i] = c;
		}
		for (int i = challenge1.length(); i < xorTable.length; i++) {
			buffer[8 + i] = xorTable[i];
		}

		String result = calcResponseString(buffer);
		result = result + "01d0a8e3";
		return result;
	}

	public static String calcCheckSum(String challenge2) {
		StringBuffer buffer = new StringBuffer();
		int len = challenge2.length() - 8;
		for (int i = 0; i < len / 4; i++) {
			buffer.append(challenge2.charAt(i * 4));
		}
		return buffer.toString();
	}

	private static void be32c(char[] c, int x, int pos) {
		c[pos + 3] = (char) (x & 0x000000ff);
		c[pos + 2] = (char) ((x & 0x0000ff00) >>> 8);
		c[pos + 1] = (char) ((x & 0x00ff0000) >>> 16);
		c[pos] = (char) ((x & 0xff000000) >>> 24);
	}

	private static int le2me(char[] c, int pos) {
		return c[pos + 3] << 24 | c[pos + 2] << 16 | c[pos + 1] << 8 | c[pos];
	}

	private static void le2me(char[] c, int pos, int value) {
		c[pos + 3] = (char) ((value & 0xff000000) >>> 24);
		c[pos + 2] = (char) ((value & 0x00ff0000) >>> 16);
		c[pos + 1] = (char) ((value & 0x0000ff00) >>> 8);
		c[pos] = (char) ((value & 0x000000ff));
	}

	private static String calcResponseString(char[] challenge) {
		char[] field = new char[128];
		char[] zres = new char[20];

		be32c(field, 0x01234567, 0);
		be32c(field, 0x89ABCDEF, 4);
		be32c(field, 0xFEDCBA98, 8);
		be32c(field, 0x76543210, 12);
		be32c(field, 0x00000000, 16);
		be32c(field, 0x00000000, 20);

		callHash(field, challenge, 64);
		calcResponse(zres, field);

		StringBuffer result = new StringBuffer();
		for (int i = 0; i < 16; i++) {
			char a = (char) ((zres[i] >>> 4) & 15);
			char b = (char) (zres[i] & 15);

			char c = (char) (((a < 10) ? (a + 48) : (a + 87)) & 255);
			char d = (char) (((b < 10) ? (b + 48) : (b + 87)) & 255);
			result.append(c).append(d);
		}
		return result.toString();
	}

	private static void hash(char[] field, int fieldPos, char[] param,
			int paramPos) {
		int a, b, c, d;

		a = le2me(field, fieldPos);
		b = le2me(field, fieldPos + 4);
		c = le2me(field, fieldPos + 8);
		d = le2me(field, fieldPos + 12);

		a = ((b & c) | (~b & d)) + le2me(param, paramPos + 0x00) + a
				- 0x28955B88;
		a = ((a << 0x07) | (a >>> 0x19)) + b;
		d = ((a & b) | (~a & c)) + le2me(param, paramPos + 0x04) + d
				- 0x173848AA;
		d = ((d << 0x0c) | (d >>> 0x14)) + a;
		c = ((d & a) | (~d & b)) + le2me(param, paramPos + 0x08) + c
				+ 0x242070DB;
		c = ((c << 0x11) | (c >>> 0x0f)) + d;
		b = ((c & d) | (~c & a)) + le2me(param, paramPos + 0x0c) + b
				- 0x3E423112;
		b = ((b << 0x16) | (b >>> 0x0a)) + c;
		a = ((b & c) | (~b & d)) + le2me(param, paramPos + 0x10) + a
				- 0x0A83F051;
		a = ((a << 0x07) | (a >>> 0x19)) + b;
		d = ((a & b) | (~a & c)) + le2me(param, paramPos + 0x14) + d
				+ 0x4787C62A;
		d = ((d << 0x0c) | (d >>> 0x14)) + a;
		c = ((d & a) | (~d & b)) + le2me(param, paramPos + 0x18) + c
				- 0x57CFB9ED;
		c = ((c << 0x11) | (c >>> 0x0f)) + d;
		b = ((c & d) | (~c & a)) + le2me(param, paramPos + 0x1c) + b
				- 0x02B96AFF;
		b = ((b << 0x16) | (b >>> 0x0a)) + c;
		a = ((b & c) | (~b & d)) + le2me(param, paramPos + 0x20) + a
				+ 0x698098D8;
		a = ((a << 0x07) | (a >>> 0x19)) + b;
		d = ((a & b) | (~a & c)) + le2me(param, paramPos + 0x24) + d
				- 0x74BB0851;
		d = ((d << 0x0c) | (d >>> 0x14)) + a;
		c = ((d & a) | (~d & b)) + le2me(param, paramPos + 0x28) + c
				- 0x0000A44F;
		c = ((c << 0x11) | (c >>> 0x0f)) + d;
		b = ((c & d) | (~c & a)) + le2me(param, paramPos + 0x2c) + b
				- 0x76A32842;
		b = ((b << 0x16) | (b >>> 0x0a)) + c;
		a = ((b & c) | (~b & d)) + le2me(param, paramPos + 0x30) + a
				+ 0x6B901122;
		a = ((a << 0x07) | (a >>> 0x19)) + b;
		d = ((a & b) | (~a & c)) + le2me(param, paramPos + 0x34) + d
				- 0x02678E6D;
		d = ((d << 0x0c) | (d >>> 0x14)) + a;
		c = ((d & a) | (~d & b)) + le2me(param, paramPos + 0x38) + c
				- 0x5986BC72;
		c = ((c << 0x11) | (c >>> 0x0f)) + d;
		b = ((c & d) | (~c & a)) + le2me(param, paramPos + 0x3c) + b
				+ 0x49B40821;
		b = ((b << 0x16) | (b >>> 0x0a)) + c;

		a = ((b & d) | (~d & c)) + le2me(param, paramPos + 0x04) + a
				- 0x09E1DA9E;
		a = ((a << 0x05) | (a >>> 0x1b)) + b;
		d = ((a & c) | (~c & b)) + le2me(param, paramPos + 0x18) + d
				- 0x3FBF4CC0;
		d = ((d << 0x09) | (d >>> 0x17)) + a;
		c = ((d & b) | (~b & a)) + le2me(param, paramPos + 0x2c) + c
				+ 0x265E5A51;
		c = ((c << 0x0e) | (c >>> 0x12)) + d;
		b = ((c & a) | (~a & d)) + le2me(param, paramPos + 0x00) + b
				- 0x16493856;
		b = ((b << 0x14) | (b >>> 0x0c)) + c;
		a = ((b & d) | (~d & c)) + le2me(param, paramPos + 0x14) + a
				- 0x29D0EFA3;
		a = ((a << 0x05) | (a >>> 0x1b)) + b;
		d = ((a & c) | (~c & b)) + le2me(param, paramPos + 0x28) + d
				+ 0x02441453;
		d = ((d << 0x09) | (d >>> 0x17)) + a;
		c = ((d & b) | (~b & a)) + le2me(param, paramPos + 0x3c) + c
				- 0x275E197F;
		c = ((c << 0x0e) | (c >>> 0x12)) + d;
		b = ((c & a) | (~a & d)) + le2me(param, paramPos + 0x10) + b
				- 0x182C0438;
		b = ((b << 0x14) | (b >>> 0x0c)) + c;
		a = ((b & d) | (~d & c)) + le2me(param, paramPos + 0x24) + a
				+ 0x21E1CDE6;
		a = ((a << 0x05) | (a >>> 0x1b)) + b;
		d = ((a & c) | (~c & b)) + le2me(param, paramPos + 0x38) + d
				- 0x3CC8F82A;
		d = ((d << 0x09) | (d >>> 0x17)) + a;
		c = ((d & b) | (~b & a)) + le2me(param, paramPos + 0x0c) + c
				- 0x0B2AF279;
		c = ((c << 0x0e) | (c >>> 0x12)) + d;
		b = ((c & a) | (~a & d)) + le2me(param, paramPos + 0x20) + b
				+ 0x455A14ED;
		b = ((b << 0x14) | (b >>> 0x0c)) + c;
		a = ((b & d) | (~d & c)) + le2me(param, paramPos + 0x34) + a
				- 0x561C16FB;
		a = ((a << 0x05) | (a >>> 0x1b)) + b;
		d = ((a & c) | (~c & b)) + le2me(param, paramPos + 0x08) + d
				- 0x03105C08;
		d = ((d << 0x09) | (d >>> 0x17)) + a;
		c = ((d & b) | (~b & a)) + le2me(param, paramPos + 0x1c) + c
				+ 0x676F02D9;
		c = ((c << 0x0e) | (c >>> 0x12)) + d;
		b = ((c & a) | (~a & d)) + le2me(param, paramPos + 0x30) + b
				- 0x72D5B376;
		b = ((b << 0x14) | (b >>> 0x0c)) + c;

		a = (b ^ c ^ d) + le2me(param, paramPos + 0x14) + a - 0x0005C6BE;
		a = ((a << 0x04) | (a >>> 0x1c)) + b;
		d = (a ^ b ^ c) + le2me(param, paramPos + 0x20) + d - 0x788E097F;
		d = ((d << 0x0b) | (d >>> 0x15)) + a;
		c = (d ^ a ^ b) + le2me(param, paramPos + 0x2C) + c + 0x6D9D6122;
		c = ((c << 0x10) | (c >>> 0x10)) + d;
		b = (c ^ d ^ a) + le2me(param, paramPos + 0x38) + b - 0x021AC7F4;
		b = ((b << 0x17) | (b >>> 0x09)) + c;
		a = (b ^ c ^ d) + le2me(param, paramPos + 0x04) + a - 0x5B4115BC;
		a = ((a << 0x04) | (a >>> 0x1c)) + b;
		d = (a ^ b ^ c) + le2me(param, paramPos + 0x10) + d + 0x4BDECFA9;
		d = ((d << 0x0b) | (d >>> 0x15)) + a;
		c = (d ^ a ^ b) + le2me(param, paramPos + 0x1c) + c - 0x0944B4A0;
		c = ((c << 0x10) | (c >>> 0x10)) + d;
		b = (c ^ d ^ a) + le2me(param, paramPos + 0x28) + b - 0x41404390;
		b = ((b << 0x17) | (b >>> 0x09)) + c;
		a = (b ^ c ^ d) + le2me(param, paramPos + 0x34) + a + 0x289B7EC6;
		a = ((a << 0x04) | (a >>> 0x1c)) + b;
		d = (a ^ b ^ c) + le2me(param, paramPos + 0x00) + d - 0x155ED806;
		d = ((d << 0x0b) | (d >>> 0x15)) + a;
		c = (d ^ a ^ b) + le2me(param, paramPos + 0x0c) + c - 0x2B10CF7B;
		c = ((c << 0x10) | (c >>> 0x10)) + d;
		b = (c ^ d ^ a) + le2me(param, paramPos + 0x18) + b + 0x04881D05;
		b = ((b << 0x17) | (b >>> 0x09)) + c;
		a = (b ^ c ^ d) + le2me(param, paramPos + 0x24) + a - 0x262B2FC7;
		a = ((a << 0x04) | (a >>> 0x1c)) + b;
		d = (a ^ b ^ c) + le2me(param, paramPos + 0x30) + d - 0x1924661B;
		d = ((d << 0x0b) | (d >>> 0x15)) + a;
		c = (d ^ a ^ b) + le2me(param, paramPos + 0x3c) + c + 0x1fa27cf8;
		c = ((c << 0x10) | (c >>> 0x10)) + d;
		b = (c ^ d ^ a) + le2me(param, paramPos + 0x08) + b - 0x3B53A99B;
		b = ((b << 0x17) | (b >>> 0x09)) + c;

		a = ((~d | b) ^ c) + le2me(param, paramPos + 0x00) + a - 0x0BD6DDBC;
		a = ((a << 0x06) | (a >>> 0x1a)) + b;
		d = ((~c | a) ^ b) + le2me(param, paramPos + 0x1c) + d + 0x432AFF97;
		d = ((d << 0x0a) | (d >>> 0x16)) + a;
		c = ((~b | d) ^ a) + le2me(param, paramPos + 0x38) + c - 0x546BDC59;
		c = ((c << 0x0f) | (c >>> 0x11)) + d;
		b = ((~a | c) ^ d) + le2me(param, paramPos + 0x14) + b - 0x036C5FC7;
		b = ((b << 0x15) | (b >>> 0x0b)) + c;
		a = ((~d | b) ^ c) + le2me(param, paramPos + 0x30) + a + 0x655B59C3;
		a = ((a << 0x06) | (a >>> 0x1a)) + b;
		d = ((~c | a) ^ b) + le2me(param, paramPos + 0x0c) + d - 0x70F3336E;
		d = ((d << 0x0a) | (d >>> 0x16)) + a;
		c = ((~b | d) ^ a) + le2me(param, paramPos + 0x28) + c - 0x00100B83;
		c = ((c << 0x0f) | (c >>> 0x11)) + d;
		b = ((~a | c) ^ d) + le2me(param, paramPos + 0x04) + b - 0x7A7BA22F;
		b = ((b << 0x15) | (b >>> 0x0b)) + c;
		a = ((~d | b) ^ c) + le2me(param, paramPos + 0x20) + a + 0x6FA87E4F;
		a = ((a << 0x06) | (a >>> 0x1a)) + b;
		d = ((~c | a) ^ b) + le2me(param, paramPos + 0x3c) + d - 0x01D31920;
		d = ((d << 0x0a) | (d >>> 0x16)) + a;
		c = ((~b | d) ^ a) + le2me(param, paramPos + 0x18) + c - 0x5CFEBCEC;
		c = ((c << 0x0f) | (c >>> 0x11)) + d;
		b = ((~a | c) ^ d) + le2me(param, paramPos + 0x34) + b + 0x4E0811A1;
		b = ((b << 0x15) | (b >>> 0x0b)) + c;
		a = ((~d | b) ^ c) + le2me(param, paramPos + 0x10) + a - 0x08AC817E;
		a = ((a << 0x06) | (a >>> 0x1a)) + b;
		d = ((~c | a) ^ b) + le2me(param, paramPos + 0x2c) + d - 0x42C50DCB;
		d = ((d << 0x0a) | (d >>> 0x16)) + a;
		c = ((~b | d) ^ a) + le2me(param, paramPos + 0x08) + c + 0x2AD7D2BB;
		c = ((c << 0x0f) | (c >>> 0x11)) + d;
		b = ((~a | c) ^ d) + le2me(param, paramPos + 0x24) + b - 0x14792C6F;
		b = ((b << 0x15) | (b >>> 0x0b)) + c;

		a += le2me(field, fieldPos + 0);
		le2me(field, fieldPos + 0, a);
		b += le2me(field, fieldPos + 4);
		le2me(field, fieldPos + 4, b);
		c += le2me(field, fieldPos + 8);
		le2me(field, fieldPos + 8, c);
		d += le2me(field, fieldPos + 12);
		le2me(field, fieldPos + 12, d);
	}

	private static void callHash(char[] key, char[] challenge, int len) {
		int ptr1 = 16;
		int ptr2 = 20;

		int a = le2me(key, ptr1);
		int b = (a >>> 3) & 0x3f;
		a += len * 8;
		le2me(key, ptr1, a);

		if (a < (len << 3)) {
			ptr2 += 4;
		}

		int tmp = le2me(key, ptr2);
		tmp += (len >>> 0x1d);
		le2me(key, ptr2, tmp);

		a = 64 - b;
		int c = 0;
		int d = 0;

		if (a <= len) {
			System.arraycopy(challenge, 0, key, b + 24, a);
			hash(key, 0, key, 24);

			c = a;
			d = c + 0x3f;

			while (d < len) {
				hash(key, 0, challenge, d - 0x3f);
				d += 64;
				c += 64;
			}
			b = 0;
		}
		System.arraycopy(challenge, c, key, b + 24, len - c);
	}

	private static void calcResponse(char[] result, char[] field) {
		char[] buf1 = new char[128];
		char[] buf2 = new char[128];

		buf1[0] = 128;
		System.arraycopy(field, 16, buf2, 0, 8);
		int i = (le2me(buf2, 0) >>> 3) & 0x3f;
		if (i < 56) {
			i = 56 - i;
		} else {
			i = 120 - i;
		}

		callHash(field, buf1, i);
		callHash(field, buf2, 8);

		System.arraycopy(field, 0, result, 0, 16);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -