Blog Dla Programistów C#/.NET

niedziela, 2 listopada 2025

Informatyka i programowanie coraz bardziej skupiają się na bezpieczeństwie danych. Jeśli tworzysz aplikacje w C#, prędzej czy później zetkniesz się z potrzebą ochrony wrażliwych informacji – czy to danych użytkowników, tokenów dostępowych czy poufnych plików konfiguracyjnych. Szyfrowanie jest podstawową techniką pozwalającą zapewnić poufność takich danych. Polega ono na przekształceniu czytelnej informacji w pozornie losowy, nieczytelny ciąg znaków (szyfrogram) za pomocą tajnego klucza. Mając odpowiedni klucz, uprawniona osoba może następnie odszyfrować (deszyfrować) dane do ich oryginalnej postaci.

Podczas implementacji nie musimy wymyślać własnych metod szyfrowania – zdecydowanie lepiej polegać na publicznie znanych i sprawdzonych algorytmach kryptograficznych. Platforma .NET udostępnia gotowe implementacje takich algorytmów w przestrzeni nazw System.Security.Cryptography, dzięki czemu możemy z nich skorzystać od razu w naszym kodzie. W praktyce wyróżnia się dwa główne rodzaje szyfrowania: symetryczne i asymetryczne. W tym artykule wyjaśnię, czym się różnią te podejścia oraz jak zastosować je w C#, przedstawiając również prosty przykład kodu.

Szyfrowanie i Deszyfrowanie w C# – Klucz Do Bezpiecznych Danych

Rodzaje szyfrowania: symetryczne vs asymetryczne


Symetryczne szyfrowanie – wykorzystuje jeden tajny klucz zarówno do zaszyfrowania danych, jak i do ich rozszyfrowania. Cechuje się bardzo wysoką szybkością – umożliwia efektywne szyfrowanie nawet dużych ilości danych, jednak wadą jest konieczność bezpiecznego przekazania tego wspólnego klucza drugiej stronie (tzw. problem dystrybucji klucza).

Asymetryczne szyfrowanie – wykorzystuje parę kluczy: publiczny do zaszyfrowania danych i odpowiadający mu prywatny do odszyfrowania. Klucz publiczny można udostępniać otwarcie, a prywatny musi pozostać w sekrecie – dzięki temu rozwiązany zostaje problem dystrybucji klucza. Niestety algorytmy asymetryczne są dużo wolniejsze i nadają się tylko do niewielkich porcji danych (rzędu kilkuset bajtów).

W praktyce często łączy się oba powyższe podejścia: algorytm asymetryczny (np. RSA) służy do bezpiecznego przekazania drugiej stronie klucza symetrycznego, a sama właściwa komunikacja (większe pliki czy wiadomości) odbywa się już z użyciem szybkiego algorytmu symetrycznego. Dzięki temu uzyskujemy zalety obu technik – wydajność i bezpieczeństwo.


Symetryczne szyfrowanie w C#


W bibliotece .NET znajdziemy kilka wbudowanych algorytmów symetrycznych (dziedziczących po abstrakcyjnej klasie SymmetricAlgorithm). Należą do nich m.in. AES, DES, RC2, Rijndael oraz TripleDES. Współcześnie standardem jest algorytm AES (Advanced Encryption Standard), który zastąpił starszy i obecnie uznawany za słabo bezpieczny DES. W przykładzie poniżej posłużymy się właśnie AES do zaszyfrowania danych.

Do szyfrowania symetrycznego potrzebny jest nam tajny klucz o ustalonej długości (np. 16 bajtów dla AES-128 lub 32 bajty dla AES-256) oraz tzw. wektor inicjujący (IV). Klucz musi pozostać tajny – jest znany tylko nadawcy i odbiorcy danych. Z kolei IV nie musi być trzymany w sekrecie, ale powinien być losowy dla każdego nowego szyfrowania (dzięki temu nawet szyfrując dwukrotnie te same dane otrzymamy inny wynik). Mając klucz i IV, możemy skorzystać z klasy Aes udostępnianej przez .NET, aby zaszyfrować dane w postaci bajtów. Poniżej znajduje się przykładowy kod w C# demonstrujący szyfrowanie i deszyfrowanie tekstu za pomocą AES:

using System;
using System.Security.Cryptography;
using System.Text;

string original = "Przykładowa tajna wiadomość";
using Aes aes = Aes.Create();
aes.GenerateKey();
aes.GenerateIV();

/* Szyfrowanie */
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
byte[] plainBytes = Encoding.UTF8.GetBytes(original);
byte[] encryptedBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
Console.WriteLine($"Zaszyfrowane: {Convert.ToBase64String(encryptedBytes)}");

/* Deszyfrowanie */
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
byte[] decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
string decrypted = Encoding.UTF8.GetString(decryptedBytes);
Console.WriteLine($"Odszyfrowane: {decrypted}");

W powyższym kodzie generujemy losowy klucz i IV za pomocą metod GenerateKey() oraz GenerateIV(). Następnie, wywołując aes.CreateEncryptor() i aes.CreateDecryptor(), uzyskujemy obiekty transformujące dane (odpowiednio szyfrujące i deszyfrujące) z użyciem ustawionego klucza oraz IV. Metoda TransformFinalBlock służy tu do przekształcenia tablicy bajtów z jawnym tekstem na zaszyfrowane bajty i odwrotnie. Zwróć uwagę, że zaszyfrowane dane (encryptedBytes) to ciąg bajtów – w powyższym przykładzie zamieniamy je na czytelny ciąg Base64, aby można je było np. wyświetlić lub przesłać w formie tekstowej. Do odszyfrowania używamy tego samego klucza i IV, które wcześniej posłużyły do szyfrowania. Gdybyśmy ich nie posiadali, odzyskanie oryginalnej wiadomości byłoby niemożliwe. IV nie musi być tajny, więc często dołącza się go do zaszyfrowanych danych (np. zapisując IV na początku pliku z szyfrogramem), natomiast klucz symetryczny należy przechowywać w bezpieczny sposób – bo to od jego tajności zależy bezpieczeństwo całego szyfrowania.


Asymetryczne szyfrowanie w C#


W .NET do szyfrowania asymetrycznego najczęściej wykorzystuje się algorytm RSA, dostępny poprzez klasę RSA w bibliotece kryptograficznej. Wykorzystanie RSA różni się od AES – potrzebujemy wygenerować parę kluczy (publiczny i prywatny). Przykładowo, jeśli chcemy wysłać poufną wiadomość do innej osoby, musimy najpierw uzyskać jej klucz publiczny (np. przekazany w postaci certyfikatu X.509). Dysponując kluczem publicznym drugiej strony, tworzymy obiekt RSA i importujemy do niego ten klucz. Następnie możemy zaszyfrować dane (np. niewielki tekst lub klucz symetryczny) metodą RSA.Encrypt(byte[], RSAEncryptionPadding) z odpowiednim paddingiem (np. OAEP). Powstały zaszyfrowany blok bajtów przekazujemy odbiorcy, który przy użyciu klucza prywatnego i metody RSA.Decrypt(...) odtworzy oryginalną informację. W ten sposób możemy bezpiecznie przekazać sekret drugiej stronie, nie zdradzając nikomu tajnego klucza symetrycznego.

Tip: Warto pamiętać, że RSA nie służy do szyfrowania dużych plików ani długich wiadomości – zamiast tego używamy RSA do przekazania klucza symetrycznego, a duże dane szyfrujemy algorytmem symetrycznym. Przykładowo, dla klucza RSA 2048-bit maksymalna długość zaszyfrowanej wiadomości to tylko około 245 bajtów. Zawsze dobieraj więc metodę szyfrowania odpowiednią do rozmiaru i charakteru danych.


Podsumowanie


Szyfrowanie jest potężnym narzędziem, które pozwala zabezpieczyć wrażliwe informacje przed niepowołanym dostępem. W języku C# (platformie .NET) mamy do dyspozycji bogaty zestaw wbudowanych mechanizmów kryptograficznych, dzięki czemu implementacja szyfrowania i deszyfrowania danych jest stosunkowo prostym zadaniem. Pamiętaj jednak, że na bezpieczeństwo wpływa nie tylko dobór algorytmu, ale przede wszystkim ochrona kluczy – tajne klucze należy przechowywać i przekazywać w sposób zabezpieczony przed ujawnieniem.

Jeśli zainteresował Cię ten temat i chcesz dogłębniej opanować programowanie .NET (od zupełnych podstaw aż po zdobycie pracy jako młodszy programista), zachęcam do sprawdzenia mojego szkolenia online Zostań Programistą .NET. To kompleksowe szkolenie, które krok po kroku przeprowadzi Cię przez wszystkie niezbędne zagadnienia – i pomoże w 3 miesiące przygotować się do rozpoczęcia kariery jako developer C#/.NET.

Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
CTO & Founder - FindSolution.pl
Programista C#/.NET. Specjalizuje się w Blazor, ASP.NET Core, ASP.NET MVC, ASP.NET Web API, WPF oraz Windows Forms.
Autor bloga ModestProgrammer.pl
Dodaj komentarz

Wyszukiwarka

© Copyright 2025 modestprogrammer.pl | Sztuczna Inteligencja | Regulamin | Polityka prywatności. Design by Kazimierz Szpin. Wszelkie prawa zastrzeżone.