public static void CalculateEncryption(ClientVersion version) { if (version == ClientVersion.CV_200X) { KEY_1 = 0x2D13A5FC; KEY_2 = 0x2D13A5FD; KEY_3 = 0xA39D527F; Type = ENCRYPTION_TYPE.BLOWFISH__2_0_3; } else { int a = ((int)version >> 24) & 0xFF; int b = ((int)version >> 16) & 0xFF; int c = ((int)version >> 8) & 0xFF; int temp = ((((a << 9) | b) << 10) | c) ^ ((c * c) << 5); KEY_2 = (uint)((temp << 4) ^ (b * b) ^ (b * 0x0B000000) ^ (c * 0x380000) ^ 0x2C13A5FD); temp = (((((a << 9) | c) << 10) | b) * 8) ^ (c * c * 0x0c00); KEY_3 = (uint)(temp ^ (b * b) ^ (b * 0x6800000) ^ (c * 0x1c0000) ^ 0x0A31D527F); KEY_1 = KEY_2 - 1; if (version < (ClientVersion)(((1 & 0xFF) << 24) | ((25 & 0xFF) << 16) | ((35 & 0xFF) << 8) | (0 & 0xFF))) { Type = ENCRYPTION_TYPE.OLD_BFISH; } else if (version == (ClientVersion)(((1 & 0xFF) << 24) | ((25 & 0xFF) << 16) | ((36 & 0xFF) << 8) | (0 & 0xFF))) { Type = ENCRYPTION_TYPE.BLOWFISH__1_25_36; } else if (version <= ClientVersion.CV_200) { Type = ENCRYPTION_TYPE.BLOWFISH; } else if (version <= (ClientVersion)(((2 & 0xFF) << 24) | ((0 & 0xFF) << 16) | ((3 & 0xFF) << 8) | (0 & 0xFF))) { Type = ENCRYPTION_TYPE.BLOWFISH__2_0_3; } else { Type = ENCRYPTION_TYPE.TWOFISH_MD5; } } }
public static void Initialize(bool is_login, uint seed, ENCRYPTION_TYPE encryption) { if (encryption == ENCRYPTION_TYPE.NONE) return; if (is_login) { _loginCrypt.Initialize(seed, KEY_1, KEY_2, KEY_3); } else { if (encryption >= ENCRYPTION_TYPE.OLD_BFISH && encryption < ENCRYPTION_TYPE.TWOFISH_MD5) { _blowfishEncryption.Initialize(); } if (encryption == ENCRYPTION_TYPE.BLOWFISH__2_0_3 || encryption == ENCRYPTION_TYPE.TWOFISH_MD5) { _twoFishBehaviour.Initialize(seed, encryption == ENCRYPTION_TYPE.TWOFISH_MD5); } } }