Szyfrowana komunikacja TCP w C#.
by yaras 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
.
4 Comments for this entry
1 Trackback or Pingback for this entry
-
dotnetomaniak.pl
December 30th, 2009 on 11:12 amSzyfrowana komunikacja TCP w C#. – yaras.pl…
Dziękujemy za publikację – Trackback z dotnetomaniak.pl…
December 31st, 2009 on 12:45 am
Mniejszego pagera nie bylo?
January 1st, 2010 on 12:31 pm
mam nadzieję, że teraz jest czytelniejszy
July 3rd, 2010 on 10:37 am
Witam, mógłbym prosić o jakiś przykład implementacji jak spakować/rozpakować dowolny obiekt klassy dziedziczącej po Packet? Jakoś nie moge do tego dojść :/ Z góry dziękuję.
July 4th, 2010 on 9:45 am
Oto przykładowa implementacja kompresji:
http://wklej.org/hash/54335393b2c/