Avatar billede microjet Nybegynder
28. december 2010 - 16:02 Der er 17 kommentarer og
1 løsning

problem med dekryptering af streng

Hejsa

Jeg har siddet og fumlet lidt med at få krypteret en streng og så sende den via en socket forbindelse og dernæst dekryptere den, men jeg får en exception om at strengen har en ugyldig længde... eks 23byte

Når strengen ankommer krypteret er den på et lige antal byte men efter konverteringen til et bytearray er der nu et ulige antal byte.

Message er på 32byte!
// Step 4. Convert the input string to a byte[]
byte[] DataToDecrypt = Convert.FromBase64String(Message);

Fejler så her på længden som nu er på 23byte
Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);

Håber nogen kan gennemskue problemet!

Jeg tror det har noget at gøre med ToBase64String/FromBase64String

M.v.h

Tue



Hele metoden:

        public string DecryptString(string Message, string Passphrase)
        {
            byte[] Results;
            System.Text.ASCIIEncoding ASCII = new System.Text.ASCIIEncoding();

            // Step 1. We hash the passphrase using MD5
            // We use the MD5 hash generator as the result is a 128 bit byte array
            // which is a valid length for the TripleDES encoder we use below

            MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
            byte[] TDESKey = HashProvider.ComputeHash(ASCII.GetBytes(Passphrase));

            // Step 2. Create a new TripleDESCryptoServiceProvider object
            TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

            // Step 3. Setup the decoder
            TDESAlgorithm.Key = TDESKey;
            TDESAlgorithm.Mode = CipherMode.ECB;
            TDESAlgorithm.Padding = PaddingMode.PKCS7;

            // Step 4. Convert the input string to a byte[]
            byte[] DataToDecrypt = Convert.FromBase64String(Message);

            // Step 5. Attempt to decrypt the string
            try
            {
                ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
                Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
            }
            finally
            {
                // Clear the TripleDes and Hashprovider services of any sensitive information
                TDESAlgorithm.Clear();
                HashProvider.Clear();
            }

            // Step 6. Return the decrypted string in UTF8 format
            return ASCII.GetString(Results);
        }
Avatar billede microjet Nybegynder
28. december 2010 - 16:26 #1
Jeg skal måske lige tilføje at "Message" er en Base64String... som så bliver lavet til et bytearray og dernæst dekrypteret!
Avatar billede microjet Nybegynder
28. december 2010 - 17:33 #2
Jeg er kommet lidt videre... det er måske noget helt andet der er problemet!

Når jeg sender krypteret strenge langsomt, så virker det fint og strengen er så på 44byte, men hvis jeg sender dem "HURTIGT" 600/sec
får jeg strenge af meget forskellig længde og data er selvfølgelig korrupt!

Jeg sidder på et lokalt netværk med 2 pc'er, så jeg kan ikke tro det skulle give problemer at sende 26400 bytes/sec.

Herunder koden:


send data:

        public void SendData(String Value, Boolean ErrorFlag, String Message)
        {
            try
            {
                ns = new NetworkStream(server);
                sw = new StreamWriter(ns);
                string Data = "<START>"+Value+";"+ErrorFlag.ToString()+";"+Message+"<END>";
                if ((Data.Contains("+"))||(Data.Contains(" ")))
                {}

                String EncryptedData = EncryptString(Data, Passphrase);
                Int32 len = EncryptedData.Length;
                sw.WriteLine(EncryptedData);
                sw.Flush();
            }
            catch (IOException)
            {

            }
        }



recieve data



        /// <summary>
        /// Method watch the stream for available server-data
        /// </summary>
        public void ServerDataAvailable()
        {
            sr = new StreamReader(ns);
            ns = new NetworkStream(client);

            String ReturnAnswer = "";
            Boolean Error = false;
            String Message = "";

            while (true)
            {

                if (ns.DataAvailable)
                {
                  String EncryptStr = "";
                  EncryptStr = sr.ReadLine();

                  String TempStr = DecryptString(EncryptStr, Passphrase);

                    while (TempStr.Contains("<START>"))
                    {
                        TempStr = TempStr.Replace("<START>", "");
                        TempStr = TempStr.Replace("<END>", "");
                        string[] Data = TempStr.Split(';');
                        ReturnAnswer = Data[0];
                        if (Data.Length > 1) { Error = Boolean.Parse(Data[1]); }
                        if (Data.Length > 2) { Message = Data[2]; }

                        OnServerData(ReturnAnswer, Error, Message);
                    }

                }
                else
                {
                    Thread.Sleep(10);
                }

            }

        }
Avatar billede arne_v Ekspert
28. december 2010 - 17:53 #3
Det er svært at gennemskue bare ved at læse koden. Du må igang med at troubleshoote.

Start med at udskrive:
* det base64 der sendes
* det base64 der modtages
* længden af byte[] inden konvertering til base64
* længden af byte[] efter konvertering fra base64
Avatar billede arne_v Ekspert
28. december 2010 - 17:54 #4
System.Text.ASCIIEncoding ASCII = new System.Text.ASCIIEncoding();

bruger ASCII - jeg vil klart anbefale enten UTF-8 eller ISO-8859-1.

Da ASCII var moderne var ABBA et nyt band!  :-)
Avatar billede microjet Nybegynder
28. december 2010 - 18:05 #5
Jeg bruger ASCII fordi det kun er ASCII karakter der skal sendes, men mit problem er dog det samme hvis jeg bruger UTF8.

Jeg er kommet lidt nærmere problemet.

Hvis jeg stepper gennem koden virker det fint, men når jeg slipper koden løs og der sendes 600 strenge i sekundet går det helt galt.

MEN hvis jeg f.eks sender strengen "123456789.10.11.12.13.14.15.16.17.18.19.20.21.2"
som har samme længde som den krypteret streng køre det bare der ud af uden tab

Jeg tænkte på om der i den krypteret streng kunne ligge nogle \r\n i data, som min StreamReader jo bruger til at hente data fra NetworkStreamen

Men det harmonere jo ikke med at data er ok når det går langsomt!!!

Data der sendes er altid ok... ved modtagelse også hvis der ikke sendes for "hurtigt" data.
Avatar billede arne_v Ekspert
28. december 2010 - 18:16 #6
Jeg tror ikke at du kommer videre førend du begynder at troubleshoote lidt systematisk.
Avatar billede microjet Nybegynder
28. december 2010 - 19:56 #7
Jeg synes nu jeg er gået rimelig systematisk til værks :-)... jeg sender en krypteret streng (base64string)

Se send og modtag metode postet længere oppe i tråden!

1) Hvis jeg sender de krypterede strenge med lidt delay imellem køre det perfekt!

2)hvis jeg "streamer" de krypterede strenge 600/sec, modtager jeg kun noget af strengene... alt fra 2-46byte pr streng er set.

3) Sender jeg almindelige strenge (også stream) er der ingen problemer!

Jeg laver en NetworkStream og bruger herefter StreamWriter og StreamReader.

Så vidt jeg ved læser StreamReader (ReadLine) indtil "\r\n" og det køre som sagt fint hvis jeg blot sender de krypterede strenge langsomt.

Hvad mener du jeg skal gøre for at gå mere systematisk til værks?
Avatar billede Syska Mester
28. december 2010 - 20:21 #8
Han mente nok bare at måden du greb det an, ikke var super systematisk.

Men nu siger du jo også at du har fundet problemet ... så skal du bare finde ud af hvad den læser ... altså hvorfor du ikke får hele din streng. Det er vel næste step.

I stedet for at step gennem kode, da der så automatisk kommer delay, må du jo lave en logger ... så du kan se det når det kører med full speed og finde ud af hvorfor, din ReadLine ikke virker som du regner med den skal.

ReadLine tror jeg nu også kun læser til enden af filen. Hvis der kun er en linje i den, så er der jo ingen "\r\n" til slut, så måske der dit problem er ... :-)

mvh
Avatar billede arne_v Ekspert
28. december 2010 - 20:31 #9
I #3 forklarer jeg lidt om hvad man kan gøre.

Det bør afslører hvor det er det går galt - om det er send eller modtag, socket eller base64 etc..
Avatar billede microjet Nybegynder
28. december 2010 - 20:37 #10
Ok det prøver jeg!

Hva... gir du en omgang når du runder 1.000.000 point :-D
Avatar billede microjet Nybegynder
28. december 2010 - 20:39 #11
Det var nu blot ment som en kommentar, men kom vist til at trykke på svar!
Avatar billede arne_v Ekspert
28. december 2010 - 22:42 #12
No problem.

Så længe svaret ikke er accepteret er der ikke sket noget som ikke kan fixes.
Avatar billede arne_v Ekspert
28. december 2010 - 22:43 #13
Det kan da godt være at jeg giver en dåse sodavand til dem der kommer fordi, når jeg paserer 1 million point, men jeg tror ikke at der er nogen som lige kigger forbi.

Jeg gætter iøvrigt på at det først sker engang i oktober-november.
Avatar billede microjet Nybegynder
28. december 2010 - 22:54 #14
tja med 325 point om dagen i snit over 8 år burde der jo ikke gå mere end 154 dage :-)
Avatar billede arne_v Ekspert
28. december 2010 - 22:56 #15
Jo, men nu om dage ligger jeg kun på ca. det halve.
Avatar billede bvli Praktikant
29. december 2010 - 13:06 #16
Kunne man i øvrigt ikke sagtens forestille sig, at der i din Send-metode gemmer sig et par IOExceptions, som du så nydeligt ignorerer? Hvis ikke du kan håndtere den alligevel, bør du ikke pakke din metode ind i en try/catch. Under alle omstændigheder bør du ihvertfald /som minimum/ skrive exception'en ud til Debug eller Trace.
Avatar billede microjet Nybegynder
04. januar 2011 - 12:27 #17
Hejsa

Jeg har fået løst problemet...men jeg kan ikke lige sætte en finger på hvad der gik galt, selv om jeg lavede en log, hvor der manglede data eller muligvis henter StreamReader'en data i mindre bidder, så alt kommer ud af sync.

Jeg skrev koden om så der ikke var kryptering og så virkede det igen , så indførte jeg krypteringen igen og siden har der ikke været problemer. Har dog også tilføjet en linie der rydder inputbufferen på streamreaderen når der sendes en ny kommando... det kunne også gøre en forskel.

Nåå men smid et svar... så er der point!
Avatar billede arne_v Ekspert
04. januar 2011 - 21:08 #18
svar
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