Gå til innhold

C#: [Løst]Hvorfor er CryptoStream.Close() = Exception:"Ugyldig data"?


Anbefalte innlegg

Dataene dekrypteres i denne funksjonen og det skjer med suksess;dataene er akkurat slik de skal være.

CryptoStream.Close() blir kalt helt på slutten i funksjonen og kaster konsekvent exception "Ugyldig data" uten noe mer info.

 

Skjønner ikke helt hvilke data det er som er ugyldige og jeg tror kanskje jeg har sett meg litt blind på dette nå.....

Endret av Techster
Lenke til kommentar
Videoannonse
Annonse

Hei,

 

Fint om du limer inn koden, litt vanskelig å gi en korrekt analyse uten å se alt.

Hvilke type stream krypterer du? File? I så fall er det en mulighet at du har har lukket filestream før du lukker kryptostream.

 

Mao;

1) Åpne filestream:

FileStream stream = new FileStream("C:\\test.dat",FileMode.OpenOrCreate,FileAccess.Write);

 

2) Åpne Kryptostream:

CryptoStream crStream = new CryptoStream(stream,cryptic.CreateEncryptor(),CryptoStreamMode.Write);

 

3) Do your stuff stuff...

 

4) Lukk CryptoStream FØR stream:

crStream.Close();

 

5) Lukk FileStream

stream.Close()

 

Kan lage krøll dersom du bytter 4 og 5

Lenke til kommentar

Ja, klar over det men den underliggende MemoryStreamen lukkes ikke.

Det fungerer helt fint å kryptere data via CryptoStreamen hvor den til sist i funksjonen lukkes uten feil.

 

Jeg lukker kun CryptoStreamen; er ikke det nok?

Lenke til kommentar

Her er funksjonen

 

			byte[] key = new byte[256];
		byte[] iv = new byte[256];
		byte[] data = new byte[klient.SisteMottateDataLen - 512];

		Buffer.BlockCopy(klient.SisteMottateData, 0, data, 0, data.Length);
		Buffer.BlockCopy(klient.SisteMottateData, data.Length, iv, 0, 256);
		Buffer.BlockCopy(klient.SisteMottateData, (data.Length + 256), key, 0, 256);

		SymmetricAlgorithm alg = SymmetricAlgorithm.Create("RC2");
		alg.Key = rsa.Decrypt(key, true);
		alg.IV = rsa.Decrypt(iv, true);

		ICryptoTransform x_decryptor = alg.CreateDecryptor();
		MemoryStream memStream = new MemoryStream();

		CryptoStream x_cryptoStream = new CryptoStream(memStream, x_decryptor, CryptoStreamMode.Write);
		x_cryptoStream.Write(data, 0, data.Length);

		klient.SlettSisteMottateData();
		klient.SkrivTilBuffer(memStream.ToArray(), (int)memStream.Length);  /* Her skrives de korrekte ukrypterte dataene*/

		x_cryptoStream.Close(); /* Her kommer feilmeldingen = "ugyldig data". */

Endret av Techster
Lenke til kommentar
You should always explicitly close your CryptoStream object after you are done using it by calling the Close method. Doing so flushes the stream and causes all remain blocks of data to be processed by the CryptoStream object. However, if an exception occurs before you call the Close method, the CryptoStream object might not be closed. To ensure that the Close method always gets called, place your call to the Close method within the finally block of a try/catch statement.

ville tatt en titt på eksemplet på msdn

http://msdn.microsoft.com/en-us/library/sy...yptostream.aspx

Lenke til kommentar

Har lest denne artikkelen på msdn flere ganger.

Å legge det i en try/catch/finally hjelper ikke = samme problem.

Jeg skal gå igjennom krypteringsfunksjonen en gang til for å være 110% sikker på at dataene blir dekryptert riktig og at det ikke er disse dataene den klager over.

Lenke til kommentar

Dataene blir dekryptert korrekt.

Det som ikke her helt korrekt er at de siste 8 bytene mangler!

Dette skjer etter : x_cryptoStream.Write(data, 0, data.Length);

Når dataene blir kryptert er de (f.eks) 440 lange mens når de dekrypteres blir de bare 328 lang.

Dataen går via en socket og et nettverk men kommer fram like hele.

 

Dataene er altså helt som de skal til etter Write funksjonen på cryptostream har tuklet med de.

Normalt med stream kan man jo legge inn en while(x_cryptoStream.Position < data.Length) men denne streamen støtter ikke seek og write metoden returnerer ingenting.

 

Forslag mottas med takk. :)

 

EDIT:

.Close() gir fortsatt feilmeldingen "Ugyldig data", kan det ha noe med at ikke alle dataene går igjennom streamen?

Endret av Techster
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...