yaras.pl

Szyfrowana komunikacja TCP w C#.

by on Dec.30, 2009, under .NET, Bezpieczeństwo

Szyfrowanie symetryczne.

Na sam koniec chciałbym wspomnieć o szyfrowaniu symetrycznym. Jak sama nazwa wskazuje do szyfrowania i deszyfrowania danych jest taki sam klucz (w przeciwieństwie do szyfrowania asymetrycznego, gdzie mamy dwa różne klucze – jeden do szyfrowania, drugi do deszyfrowania). Znów wyczerpujący przykład zastosowania klasy CryptoStream można znaleźć na obviex.com. Przykład zastosowania powyższego kodu:

const string Pass = "qwerty123";
 
SymmetricEncryption encryption = new SymmetricEncryption(Pass);
 
string encrypted = encryption.Encrypt("HelloWorld");
 
Console.WriteLine("Encrypt(HelloWorld) = " + encrypted);
Console.WriteLine(
      "Decrypt(Encrypt(HelloWorld)) = " 
      + encryption.Decrypt(encrypted));

Jak widać używanie klasy SymmetricEncryption jest nadzwyczaj proste, a niesie za sobą wiele istotnych cech. M.in. mamy możliwość zdefiniowania tzw. salt. Salt jest pewnym losowym ciągiem bajtów “doklejanym” do naszych danych. Co to daje? Spójrzmy na przykład użycia powyższej klasy:

for (int i = 0; i <= 3; i++)
{
   SymmetricEncryption encryption 
      = new SymmetricEncryption(Pass, "zxcvbnmlkjhgpoyt", 5);
   string encrypted = encryption.Encrypt("HelloWorld");
   Console.WriteLine("Encrypt(HelloWorld) = " + encrypted);
}

Na pierwszy rzut oka można stwierdzić, iż powyższy kod powinien wypisać na konsoli cztery identyczne wiersze. W praktyce jednak się tak nie dzieje, a wszystko to za sprawą salt:

Encrypt(HelloWorld) => gBAVQD2PnNM0rChYJDZPW3FNlKnceTlPYGxfg5dQoL0=
Encrypt(HelloWorld) => a34Jsey/R8pITdrrdVTOVw==
Encrypt(HelloWorld) => spEDM/v7uPs6xuhYRcExodOKgaY3W/bdKY9AgtkwFHk=
Encrypt(HelloWorld) => WD6nVvwy2prtdbmp/2vmrenBwzASMOmhyHtAqx2FTc8=

Dzięki zastosowaniu 12-bitowego salt dany ciąg bajtów możemy zaszyfrować na 4096 sposobów! Znacznie zwiększa to bezpieczeństwo naszych danych. Więcej o roli salt można przeczytać na ipsec.pl.

Podsumowanie.

Mając przygotowane wszystkie wymagane elementy składowe naszej aplikacji możemy stworzyć bezpieczny i wygodny system wymiany danych. By ukończyć nasz system wystarczy poprawić metody Serialize() i Deserialize() klasy Packet, by przed przesłaniem komunikatu szyfrowały dane, a przed odczytaniem – deszyfrowały. Musimy również zadbać o przesłanie zaszyfrowanego klucza na samym początku, by zarówno klient jak i serwer znały hasło. Voila! Mamy oto przygotowany nasz system.

Mam nadzieję, że wszystko zostało wyczerpująco wyjaśnione i pełna implementacja systemu nie sprawi nikomu większych problemów :-) .

Pages: 1 2 3 4 5 6

:, , , ,

4 Comments for this entry

1 Trackback or Pingback for this entry

Leave a Reply

You must be logged in to post a comment.

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Visit our friends!

A few highly recommended friends...

Archives

All entries, chronologically...