Blowfish & Diffie-Hellman

08/07/2010 02:43 CptSky#1
I don't know why, I make the same thing that I make on my PacketLogger, but with a new system (Blowfish/DH) and it's not working. When I check, the IVs are good, the P/G/A/B keys are the good, but I can't decrypt the first client packet... I know how work the blowfish system and the DH exchange. Any idea?

PHP Code:
        private void ServerReceiveHandler(Client ClientByte[] Data)
        {
            
Client.CBlowfish.Decrypt(Data);
            try
            {
                if (!
Client.ExchangeCompleted)
                {
                    
DiffieHellman.ServerPacket(Dataref Client.Exchange);
                    
Client.CBlowfish.DiffieHellman = new DH(BigNumber.FromHexString(Client.Exchange.P), BigNumber.FromHexString(Client.Exchange.G));
                    
Client.SBlowfish.DiffieHellman = new DH(BigNumber.FromHexString(Client.Exchange.P), BigNumber.FromHexString(Client.Exchange.G));

                    
Client.CBlowfish.DiffieHellman.GenerateKeys();
                    
Client.SBlowfish.DiffieHellman.GenerateKeys();

                    
DiffieHellman.EditKeyA(ref DataClient.SBlowfish.DiffieHellman.PublicKey.ToHexString());
                    
DiffieHellman.ServerPacket(Dataref Client.Exchange);
                    
Client.SendToClient(Data);
                }
            }
            catch (
Exception Exc) { Program.WriteLine(Exc); }
        }

        private 
void ClientReceiveHandler(Client ClientByte[] Data)
        {
            
Client.SBlowfish.Decrypt(Data);
            try
            {
                if (!
Client.ExchangeCompleted)
                {
                    
DiffieHellman.EditKeyB(ref DataClient.CBlowfish.DiffieHellman.PublicKey.ToHexString());
                    
DiffieHellman.ClientPacket(Dataref Client.Exchange);
                    
Client.SendToServer(Data);

                    
Client.CBlowfish.SetKey(Client.CBlowfish.DiffieHellman.ComputeKey(BigNumber.FromHexString(Client.Exchange.A)));
                    
Client.SBlowfish.SetKey(Client.SBlowfish.DiffieHellman.ComputeKey(BigNumber.FromHexString(Client.Exchange.B)));

                    
Client.CBlowfish.EncryptIVs Client.Exchange.ClientIVs;
                    
Client.CBlowfish.DecryptIVs Client.Exchange.ServerIVs;

                    
Client.SBlowfish.EncryptIVs Client.Exchange.ServerIVs;
                    
Client.SBlowfish.DecryptIVs Client.Exchange.ClientIVs;

                    
Client.ExchangeCompleted true;
                }
            }
            catch (
Exception Exc) { Program.WriteLine(Exc); }
        } 
08/07/2010 10:31 Korvacs#2
You set the initial key?
08/07/2010 12:37 ImmuneOne#3
Code:
        public void Deserialize(ConquerPacket _Packet)
        {
            this.Packet = _Packet;
            if (this.KeyExchange == null)
                this.KeyExchange = new KeyExchange();
            if (this.Cryptography == null)
                this.Cryptography = new ProxyCrypto();
            if (this.Cryptography.ServerCryptographer == null)
                this.Cryptography.ServerCryptographer = new GameCryptographer(Encoding.ASCII.GetBytes(Constants.CryptKey));
            if (this.Cryptography.ClientCryptographer == null)
                this.Cryptography.ClientCryptographer = new GameCryptographer(Encoding.ASCII.GetBytes(Constants.CryptKey));
        }

        public void ProcessServer(ConquerClient Client)
        {
            if (!ServerKey_Exchanged)
            {
                this.Cryptography.DecryptServerData(Packet);
                this.KeyExchange.Deserialize(KeyExchange.Server, Packet);
                SendToClient(Packet, Client);
                this.ServerKey_Exchanged = true;
            }
            else
            {
                iProxy.ProcessServer(Packet, Client);
            }
        }

        public void ProcessClient(ConquerClient Client)
        {
            if (!ClientKey_Exchanged)
            {
                this.Cryptography.DecryptClientData(Packet);
                this.KeyExchange.Deserialize(KeyExchange.Client, Packet);
                SendToServer(Packet, Client);
                this.KeyExchange.Override(this.Cryptography);
                ClientKey_Exchanged = true;
            }
            else
            {
                iProxy.ProcessClient(Packet, Client);
            }
        }

        public void SendToServer(IPacket Packet, ConquerClient Client)
        {
            lock (this.Cryptography.ClientCryptographer)
            {
                byte[] buffer = new byte[Packet.ToArray().Length];
                Native.MemCopy(buffer, Packet.ToArray(), Packet.ToArray().Length);
                ConquerWriter.WriteString(Constants.ServerKey, Packet.ToArray().Length - 8, buffer);
                this.Cryptography.ClientCryptographer.Encode(buffer);
                if (Client.ServerConnection.Connected)
                    Client.ServerConnection.Send(buffer);
            }
        }

        public void SendToClient(IPacket Packet, ConquerClient Client)
        {
            lock (this.Cryptography.ServerCryptographer)
            {
                byte[] buffer = new byte[Packet.ToArray().Length];
                Native.MemCopy(buffer, Packet.ToArray(), Packet.ToArray().Length);
                ConquerWriter.WriteString(Constants.ClientKey, Packet.ToArray().Length - 8, buffer);
                this.Cryptography.ServerCryptographer.Encode(buffer);
                if (Client.ClientConnection.Connected)
                    Client.ClientConnection.Send(buffer);
            }
        }
And when I call override:
Code:
                BigNumber RealClientPublicKey = BigNumber.FromHexString(ClientPacket.GetPublicKey());
                BigNumber RealServerPublicKey = BigNumber.FromHexString(ServerPacket.PublicKey);

                Crypto.ClientCryptographer = new GameCryptographer(ClientSide.ComputeKey(RealServerPublicKey));
                Crypto.ServerCryptographer = new GameCryptographer(ServerSide.ComputeKey(RealClientPublicKey));

                ((GameCryptographer)Crypto.ClientCryptographer).Blowfish.EncryptIV = ServerPacket.ClientIV;
                ((GameCryptographer)Crypto.ClientCryptographer).Blowfish.DecryptIV = ServerPacket.ServerIV;
                ((GameCryptographer)Crypto.ServerCryptographer).Blowfish.EncryptIV = ServerPacket.ServerIV;
                ((GameCryptographer)Crypto.ServerCryptographer).Blowfish.DecryptIV = ServerPacket.ClientIV;
This might help you.