Beispiel #1
0
    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);
    }
Beispiel #2
0
 public byte[] Encrypt(byte[] toEncrypt)
 {
     return(RC4Utility.Encrypt(toEncrypt, this.mkey));
 }
Beispiel #3
0
 public byte[] Decrypt(byte[] toDecrypt)
 {
     return(RC4Utility.Decrypt(toDecrypt, this.mkey));
 }
Beispiel #4
0
    public RC4Crypto(int seed)
    {
        mkey = RC4Utility.GenRC4SecretKey(seed);

        Console.WriteLine("RC4Crypto: {0}", System.Text.Encoding.Default.GetString(mkey));
    }