public override int CryptoUnpackPacket(MemoryStream stream) { byte[] buffer = stream.GetBuffer(); int offset = 0; int pos = 0; while (stream.Length > sizeof(UInt16)) { UInt16 size = BitConverter.ToUInt16(buffer, offset); offset += sizeof(UInt16); if (size > stream.Length - offset) { break; } UInt16 trueLen = BitConverter.ToUInt16(buffer, offset); offset += sizeof(UInt16); UInt32 msg_id = BitConverter.ToUInt32(buffer, offset); offset += sizeof(UInt32); //byte[] content = new byte[size]; //Array.Copy(buffer, offset , content, 0, size); MemoryStream msg = new MemoryStream(buffer, offset, size, true, true); MemoryStream trueStream = null; if (msg_id != Id <MSG_C2G_GetEncryptKey> .Value) { if (size > 0) { if (BlowFishHandler == null) { return(-1); } trueStream = BlowFishHandler.Decrypt_CBC(msg, 0, size); trueStream.SetLength(trueLen); } else { trueStream = msg; } } else { trueStream = msg; } lock (m_msgQueue) { m_msgQueue.Enqueue(new KeyValuePair <uint, MemoryStream>(msg_id, msg)); } offset += size; pos = offset; } return(pos); }
public override void CryptoPackPacket <T>(T msg, out MemoryStream head, out MemoryStream body) { body = new MemoryStream(); ProtoBuf.Serializer.Serialize(body, msg); ushort sourceStreamLen = (ushort)body.Length; if (BlowFishHandler != null && sourceStreamLen > 0) { body = BlowFishHandler.Encrypt_CBC(body); } head = new MemoryStream(sizeof(ushort) + sizeof(uint)); ushort len = (ushort)body.Length; head.Write(BitConverter.GetBytes(len), 0, sizeof(ushort)); head.Write(BitConverter.GetBytes(sourceStreamLen), 0, sizeof(ushort)); head.Write(BitConverter.GetBytes(Id <T> .Value), 0, sizeof(uint)); }