Kako kriptovati / dekriptovati string u C#


Ako ste programer i razvijete aplikacije, bili ste u prilici da trebate zaštiti određene podatke, te sakriti ih kako od samog korisnika tako i od onih koji vaše aplikacije žele podijeliti sa širim krugom ljudi. Razvijati “sigurnu” aplikaciju danas je više izražena nego ikad. Što su sofisticiraniji alati s kojim radite to je vaša aplikacija više ranjiva.

Prije nekoliko javia mi se potreba kako da šifriram lozinku za pristup aplikaciji razvijenoj u C#. Ista treba biti pohranjena u bazu podataka. Naravno iole pronicljiv windows korisnik će lozinku potražiti u bazi podataka te pronaći u tabeli ‘plain’ text sa nazivom lozinke. Ista je situacija kada lozinku pohranjujemo u config datoteku ili u registry. Naravno nabrojane lokacje su standardne za zapisivanje informacija koje su inicijalne za podizanje aplikacije.
Nije mi namjera da ovdje pišem o kriptografiji jer mi je to područje vrlo nepoznato. O tome imate gomilu članaka na internetu. Kod kriptovanja i same zaštite .NET Framework posjeduje nekoliko klasa i jedan kompletan namespace.

U prilogu nalazi se jednostavna aplikacija koja unešeni string kriptuje, te isto tako dekriptuje u, za čovijeka, razumljivi tekst. Poslije podizanja aplikacije nužno je unijeti text koji se treba kriptovati. Pritiskom na dugme “Kriptuj”, string se kriptuje. Pritiskom na dugme “Dekriptuj” kriptovani string se dekriptuje.

Implementacija primjera

Za svako kriptovanje ili dekriptovanje potrebno je specifirati ključ enkripcije/dekripcije. To znači ključem kojim smo kriptovali string, jedino možemo s njim ga i dekriptovati.

Primjer sadrži dvije funkcije: 1. Za kriptovanje i 2. Za dekriptovanje

Primjer koda :

// Metode za kriptovanje
public staticstring KriptujSting(string izvorniString,string kljucZaKriptovanje)
{
if (String.IsNullOrEmpty(izvorniString))
{
MessageBox.Show("Tekst ne možebiti prazan!");
return "";
}
//Formiranje kljuca za kriptovanje
byte[] kljuc1 = FormirajKljucZaKriptovanje(kljucZaKriptovanje);
byte[] kljuc2 = FormirajKljucZaKriptovanjeIV(kljucZaKriptovanje);
//Proces kriptovanja
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream memoryStream = new
MemoryStream();
CryptoStream cryptoStream = new
CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(kljuc1, kljuc2), CryptoStreamMode.Write);
StreamWriter writer = new
StreamWriter(cryptoStream);
writer.Write(izvorniString);
writer.Flush();
cryptoStream.FlushFinalBlock();
writer.Flush();
return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
}
//Metoda za dekriptovanje
public static string DekriptujString(string kriptovaniString,string kljucZaKriptovanje)
{
if (String.IsNullOrEmpty(kriptovaniString))
{
MessageBox.Show("Tekst ne možebiti prazan!");
return "";
}
//Formiranje kljuca za kriptovanje
byte[] kljuc1 = FormirajKljucZaKriptovanje(kljucZaKriptovanje);
byte[] kljuc2 = FormirajKljucZaKriptovanjeIV(kljucZaKriptovanje);
//Proces dekriptovanja
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(kriptovaniString));
CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(kljuc1, kljuc2), CryptoStreamMode.Read);
StreamReader reader = new
StreamReader(cryptoStream);
return reader.ReadToEnd();
}

U primjeru se nalazi još dvije pomoćne funkcije koje služe da generiranje ključa za kriptovanje:

//generiranje niza bajtova iz kljuca za kriptovanje
private static byte[] FormirajKljucZaKriptovanje(string kljucZaKriptovanje)
{
return ASCIIEncoding.ASCII.GetBytes((kljucZaKriptovanje + System.Math.E.ToString()).Substring(0, 8));
}
//generiranje niza bajtova iz kljuca za kriptovanje
private static byte[] FormirajKljucZaKriptovanjeIV(string kljucZaKriptovanje)
{
return ASCIIEncoding.ASCII.GetBytes((kljucZaKriptovanje + System.Math.Tan(4.0).ToString()).Substring(0, 8));
}
//generiranje niza bajtova iz kljuca za kriptovanje
private static byte[] FormirajKljucZaKriptovanje(string kljucZaKriptovanje)
{
return ASCIIEncoding.ASCII.GetBytes((kljucZaKriptovanje + System.Math.E.ToString()).Substring(0, 8));
}
//generiranje niza bajtova iz kljuca za kriptovanje
private static byte[] FormirajKljucZaKriptovanjeIV(string kljucZaKriptovanje)
{
return ASCIIEncoding.ASCII.GetBytes((kljucZaKriptovanje + System.Math.Tan(4.0).ToString()).Substring(0, 8));
}

Kompletan primjer u VS2005 mozete skinuti ovdje.

About Bahrudin Hrnjica

PhD in Mechanical Engineering, Microsoft MVP for .NET. Likes .NET, Math, Mechanical Engineering, Evolutionary Algorithms, Blogging.

Posted on 15/08/2007, in .NET, C# and tagged , . Bookmark the permalink. Leave a comment.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s