Szyfrowanie RSA, błąd "Złe dane"

0

Witam,

Próbuję napisać przesyłanie zaszyfrowanej przy pomocy RSA wiadomości między dwoma klientami wg następującego algorytmu:

  1. Klient 1 przesyła Klientowi 2 swój klucz jawny
  2. Klient 2 przesyła Klientowi 1 swój klucz jawny
  3. Klient 1 szyfruje swoją wiadomość używając klucza jawnego Klienta 2
  4. Klient 2 szyfruje swoją wiadomość używając klucza jawnego Klienta 1
  5. Klient 1 przesyła Klientowi 2 zaszyfrowaną przy pomocy klucza jawnego Klienta2 wiadomość
  6. Klient 2 przesyła Klientowi 1 zaszyfrowaną przy pomocy klucza jawnego Klienta1 wiadomość
  7. Klient 1 deszyfruje wiadomość używając swojego klucza prywatnego
  8. Klient 2 deszyfruje wiadomość używając swojego klucza prywatnego

Niestety, w punkcie 7 i 8, przy deszyfrowaniu wyskakuje mi błąd - "Złe dane". Zupełnie nie wiem dlaczego tak się dzieje. Czy ktoś mógłby mi pomóc?

Pomocny może okazać się kod( jest to kod dla klienta 1, kod klienta 2 jest analogiczny):

/* potrzebne zmienne */
			string wiadomosc_do_klienta2Text = this.txtDoKlienta2.Text;
			byte[] wiadomosc_do_klienta2Byte = System.Text.Encoding.Default.GetBytes(wiadomosc_do_klienta2Text);
			byte[] zakodowana_wiadomosc_do_klienta2Byte;
			string zakodowana_wiadomosc_do_klienta2Text;
			string zakodowana_wiadomosc_od_klienta2Text;
			byte[]zakodowana_wiadomosc_od_klienta2Byte;
			byte[] odkodowana_wiadomosc_od_klienta2Byte; 
			string odkodowana_wiadomosc_od_klienta2Text; 


			CspParameters providerParam1 = new CspParameters(1, "Microsoft Strong Cryptographic Provider");
 
            RSACryptoServiceProvider RSA_Klient1 = new RSACryptoServiceProvider(providerParam1);
			string klucz_publiczny_Klienta1 = RSA_Klient1.ToXmlString(false);
			string klucz_prywatny_Klienta1 = RSA_Klient1.ToXmlString(true);

			string klucz_publiczny_Klienta2;

			
			// Etap 1
			// Klient 1 przesyła swój klucz publiczny Klientowi 2

			streamWriter1do2.WriteLine(klucz_publiczny_Klienta1);
			streamWriter1do2.Flush();

			// Etap 2
			// Klient 1 otrzymuje klucz publiczny Klienta 2

			klucz_publiczny_Klienta2 = streamReader1od2.ReadLine();
			MessageBox.Show(klucz_publiczny_Klienta2);

			// Etap 3
			// Klient 1 szyfruje swoją wiadomość, używając klucza publicznego Klienta 2...

			RSA_Klient1.FromXmlString(klucz_publiczny_Klienta2);
			zakodowana_wiadomosc_do_klienta2Byte = RSA_Klient1.Encrypt(wiadomosc_do_klienta2Byte, false);

			// ... i przesyła ją Klientowi 2

			zakodowana_wiadomosc_do_klienta2Text = System.Text.Encoding.Default.GetString(zakodowana_wiadomosc_do_klienta2Byte);

			streamWriter1do2.WriteLine(zakodowana_wiadomosc_do_klienta2Text);
			streamWriter1do2.Flush();

			// Etap 4
			// Klient 1 otrzymuje zakodowaną swoim kluczem publicznym wiadomość od Klienta 2

			zakodowana_wiadomosc_od_klienta2Text = streamReader1od2.ReadLine();

			//Etap  5
			//Odszyfrowanie wiadomości od Klienta 2 i jej wyświetlenie

			zakodowana_wiadomosc_od_klienta2Byte = System.Text.Encoding.Default.GetBytes(zakodowana_wiadomosc_od_klienta2Text);
			
			RSA_Klient1.FromXmlString(klucz_publiczny_Klienta1);

			odkodowana_wiadomosc_od_klienta2Byte = RSA_Klient1.Decrypt(zakodowana_wiadomosc_od_klienta2Byte, false);

			odkodowana_wiadomosc_od_klienta2Text = System.Text.Encoding.Default.GetString(odkodowana_wiadomosc_od_klienta2Byte);

			this.txtOdKlienta2.Text = odkodowana_wiadomosc_od_klienta2Text;

Błąd występuje w linijce:

odkodowana_wiadomosc_od_klienta2Byte = RSA_Klient1.Decrypt(zakodowana_wiadomosc_od_klienta2Byte, false);

Czy ktoś wie dlaczego?

Bardzo proszę o pomoc,
Pozdrawiam

0

bląd powstał przy przesyłaniu strumieniami.... trzeba zastąpić StreamWriter'y i StreamRider'y - którymi przesyłana jest tablica bitów z zaszyfrowaną wiadomością - przy pomocy NetworkStream.Write i NetworkStream.Read

Poprawiony kod

/* potrzebne zmienne */

string wiadomosc_do_klienta2Text = this.txtDoKlienta2.Text;

byte[] wiadomosc_do_klienta2Byte = System.Text.Encoding.Default.GetBytes(wiadomosc_do_klienta2Text);

byte[] zakodowana_wiadomosc_do_klienta2Byte;

string zakodowana_wiadomosc_do_klienta2Text;

byte[]zakodowana_wiadomosc_od_klienta2Byte;

byte[] odkodowana_wiadomosc_od_klienta2Byte; 

string odkodowana_wiadomosc_od_klienta2Text; 

 

RSACryptoServiceProvider RSA_out = new RSACryptoServiceProvider();

RSACryptoServiceProvider RSA_Klient1 = new RSACryptoServiceProvider();

string klucz_publiczny_Klienta1 = RSA_Klient1.ToXmlString(false);

string klucz_prywatny_Klienta1 = RSA_Klient1.ToXmlString(true);

string klucz_publiczny_Klienta2;


// Etap 1

// Klient 1 przesyła swój klucz publiczny Klientowi 2

streamWriter1do2.WriteLine(klucz_publiczny_Klienta1);

streamWriter1do2.Flush();

// Etap 2

// Klient 1 otrzymuje klucz publiczny Klienta 2

klucz_publiczny_Klienta2 = streamReader1od2.ReadLine();

// Etap 3

// Klient 1 szyfruje swoją wiadomość, używając klucza publicznego Klienta 2...

RSA_out.FromXmlString(klucz_publiczny_Klienta2);

zakodowana_wiadomosc_do_klienta2Byte = RSA_out.Encrypt(wiadomosc_do_klienta2Byte, false);

// ... i przesyła ją Klientowi 2

zakodowana_wiadomosc_do_klienta2Text = System.Text.Encoding.Default.GetString(zakodowana_wiadomosc_do_klienta2Byte);

networkStream1do2.Write(zakodowana_wiadomosc_do_klienta2Byte, 0, zakodowana_wiadomosc_do_klienta2Byte.Length);

networkStream1do2.Flush();

// Etap 4

// Klient 1 otrzymuje zakodowaną swoim kluczem publicznym wiadomość od Klienta 2

zakodowana_wiadomosc_od_klienta2Byte = new byte[128];

networkStream1od2.Read(zakodowana_wiadomosc_od_klienta2Byte, 0, 128);

//Etap 5

//Odszyfrowanie wiadomości od Klienta 2 i jej wyświetlenie

odkodowana_wiadomosc_od_klienta2Byte = RSA_Klient1.Decrypt(zakodowana_wiadomosc_od_klienta2Byte, false);

odkodowana_wiadomosc_od_klienta2Text = System.Text.Encoding.Default.GetString(odkodowana_wiadomosc_od_klienta2Byte);

this.txtOdKlienta2.Text = odkodowana_wiadomosc_od_klienta2Text;

1 użytkowników online, w tym zalogowanych: 0, gości: 1