示例#1
0
        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);
        }
示例#2
0
        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));
        }