public static Packet ParsePacket(Byte[] data, byte[] crypto_key) { Packet packet = new Packet(); BinaryReader reader = new BinaryReader(new MemoryStream(data)); packet.head = reader.ReadUInt32(); var packet_size = packet.AllSize(); var checksum_offset = HEAD_SIZE; if (packet.CheckMask(NetHelper.HEAD_CRY_MASK) && packet.AllSize() > HEAD_SIZE) { //byte[] decryptData = AESEncryptionUtility.Decrypt(reader.ReadBytes(packet_size - (int)HEAD_SIZE), AESEncryptionUtility.defaultKey, AESEncryptionUtility.commonIV); var decryptData = reader.ReadBytes(packet_size - (int)HEAD_SIZE); RC4Utility.XORKeyStream(ref decryptData, crypto_key); reader = new BinaryReader(new MemoryStream(decryptData)); data = decryptData; // 前面已经过滤了headmask 所以要回退4个字节 checksum_offset -= HEAD_SIZE; } if (packet.CheckMask(NetHelper.HEAD_CHK_MASK)) { packet.checksum = reader.ReadUInt32(); // 自己不算内 checksum_offset += 4; UInt32 checksum = NetHelper.ComputeAdler32(data, (int)checksum_offset, packet_size - (int)checksum_offset); if (packet.checksum != checksum) { throw new Exception("CheckSum Fail. " + packet.checksum + " != " + checksum); } } if (packet.CheckMask(NetHelper.HEAD_SEQ_MASK)) { packet.sequence = reader.ReadUInt32(); } if (packet.CheckMask(NetHelper.HEAD_REQ_MASK)) { packet.requestId = reader.ReadUInt32(); } if (packet.CheckMask(NetHelper.HEAD_RPC_MASK)) { packet.rpcId = reader.ReadUInt32(); } if (packet.CheckMask(NetHelper.HEAD_MSG_MASK)) { packet.opcode = reader.ReadUInt32(); packet.message = reader.ReadBytes((int)packet.MsgSize()); } return(packet); }
public byte[] Encrypt(byte[] toEncrypt) { return(RC4Utility.Encrypt(toEncrypt, this.mkey)); }
public byte[] Decrypt(byte[] toDecrypt) { return(RC4Utility.Decrypt(toDecrypt, this.mkey)); }
public RC4Crypto(int seed) { mkey = RC4Utility.GenRC4SecretKey(seed); Console.WriteLine("RC4Crypto: {0}", System.Text.Encoding.Default.GetString(mkey)); }