Avatar billede -psycho- Nybegynder
30. december 2003 - 00:45 Der er 5 kommentarer og
1 løsning

Stream Kryptering

Hej

Jeg er ved at prøve at lave en Client/Server hvor stream bliver krypteret. Jeg kan godt sende / modtage ukrypteret men lige så snart jeg prøver at kryptere kan jeg ikke sende, modtage eller begge dele.

Kode til at Sende/Modtage:
private Stream Net()
{
  if(Encrypted)
  {
    CryptoStream SecStream = new CryptoStream(NetStream,TDes.CreateDecryptor(),CryptoStreamMode.Read);
    return SecStream;
  }
  else
    return NetStream;
}

public void GetStreamData(IAsyncResult ar)
{
  int intCount;
  try
  {
    lock(Net())
    {
      intCount = Net().EndRead(ar);
    }
    if(intCount<1)
    {
      Client.Close();
   
      if(Disconnected!=null)
      {   
        EventArgs e = new EventArgs();
        Disconnected(this, e);
      }
    }
               
    BuildData(recByte,0,intCount);
       
    AsyncCallback GetStreamDataCallback = new AsyncCallback(GetStreamData);
    Net().BeginRead(recByte,0,1024,GetStreamDataCallback,null);       
  }
  catch
  {
    Client.Close();

    if(Disconnected!=null)
    {
      EventArgs e = new EventArgs();
      Disconnected(this, e);
    }
  }
}

private void BuildData(byte[] Databyte, int offset, int count)
{
  string Data = Encoding.UTF8.GetString(Databyte, offset, count);
  string[] DataCmd = Data.Split(':');

  if(!Encrypted)
  {
    switch(DataCmd[0])
    {
      case "HELO":
      {
        Send("Welcome");

        break;
      }
      case "DesKey":
      {
        TDes.GenerateKey();
        DesKey = TDes.Key;
                                       
        Send("DesKey:" + Convert.ToBase64String(DesKey));

        break;
      }
      case "DesIV":
      {
        TDes.GenerateIV();
        DesIV = TDes.IV;

        Send("DesIV:" + Convert.ToBase64String(DesIV));

        Encrypted = true;

        break;
      }
    }
  }
  else
  {
    Send(Data);
  }
}

public void Send(string Data)
{
  StreamWriter Writer;

  if(Encrypted)
  {
    CryptoStream SecStream = new CryptoStream(NetStream,TDes.CreateEncryptor(),CryptoStreamMode.Write);
    Writer = new StreamWriter(SecStream);
  }
  else
    Writer = new StreamWriter(NetStream);

  Writer.Write(Data);
  Writer.Flush();       
}
Avatar billede nielsbrinch Nybegynder
30. december 2003 - 13:43 #1
Hvad er fejlen?
Avatar billede -psycho- Nybegynder
30. december 2003 - 14:15 #2
Jeg modtager ingenting efter den er sat til kryptering.
Avatar billede -psycho- Nybegynder
30. december 2003 - 14:18 #3
Her er lidt kode fra min test klient, Selve Send/Modtage er det samme.

private void BuildData(byte[] Databyte, int offset, int count)
{
  string Data = Encoding.UTF8.GetString(Databyte, offset, count);
  string[] DataCmd = Data.Split(':');

  if(!Encrypted)
  {
    switch(DataCmd[0])
    {
      case "Welcome":
      {
        txtDataRx.Text = "Connected";

        break;
      }
      case "DesKey":
      {
        txtDataRx.Text = " * " + DataCmd[1] + " * ";

        DesKey = Convert.FromBase64String(DataCmd[1]);
        TDes.Key = DesKey;
                       
        break;
      }
      case "DesIV":
      {
        txtDataRx.Text = " * " + DataCmd[1] + " * ";

        DesIV = Convert.FromBase64String(DataCmd[1]);
        TDes.IV = DesIV;

        Encrypted = true;

        break;
      } 
    }
  }
  else
  {
    txtDataRx.Text = Data;   
  }
}
Avatar billede roger Nybegynder
30. december 2003 - 18:04 #4
try
  {
    lock(Net())
    {
      intCount = Net().EndRead(ar);
    }

Ovenstående giver ikke mening, da din Net() metode returnerer et nyt objekt hver gang...dvs du locker et objekt og kalder EndRead på et andet objekt.

Når du kalder din metode BuildData, smider du recByte med som value og ikke som reference -> BuildData(recByte,0,intCount);

der skal du -> BuildData(ref recByte,0,intCount);

samt ændre metode-hovedet til -> BuildData(ref byte[] Databyte, int offset, int count)

Når du new'er din cryptostrem i Send metode så angiv længde:
CryptoStream SecStream = new CryptoStream(NetStream,TDes.CreateEncryptor(),CryptoStreamMode.Write);
SecStream.SetLength(0);

Har ikke testet noget af, men det er et umiddelbart gæt.
Avatar billede -psycho- Nybegynder
30. december 2003 - 23:30 #5
Hehe ja den lock giver ikke meget mening men du kender det nok godt man sidder i flere timer og prøver at få noget til at virke og til sidst sidder men næsten og sover :). Der var oprindeligt Streamet altså hvor Net() ikke var lavet :).

Men dit forslag hjalp desvære ikke.
Nu for jeg en fejl ved når jeg prøver at sende ->

Writer = new StreamWriter(SecStream);

Stream does not support seeking.
Avatar billede -psycho- Nybegynder
01. januar 2004 - 01:48 #6
Nå jeg har fået at vide hvad problemmet er.

Hvis der skulle være nogen som vil vide det så her er det svar jeg har fået ->

Martin -

    The problem with feeding a TCP stream directly to a CryptoStream
object is that the CryptoStream has no idea when all of the data is
present for decryption. The CryptoStream will not wait for all of the
data to arrive, it just assumes all the data will be there when it
starts, and throws an Exception when it needs more data that is not
there. Unfortunately, most TCP connections can not deliver the data
quick enough to keep up with the CryptoStream processing, no matter
how fast your network is.

    To solve this problem you need a middleman. I use a MemoryStream
to accept the incoming encrypted data from the network. When you know
you have the entire encrpyted data stream in the MemoryStream (send
the data size before sending the data), you can then feed the
MemoryStream into the CryptoStream for decryption.

    I demonstrate this in Chapter 17 of my "C# Network Programming"
book. You can download the code for free from the Sybex web site and
check out the examples. Hope this helps solve your problem.

Rich Blum - Author
"C# Network Programming" (Sybex)
http://www.sybex.com/sybexbooks.nsf/Booklist/4176
"Network Performance Open Source Toolkit" (Wiley)
http://www.wiley.com/WileyCDA/WileyTitle/productCd-0471433012.html
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester