Základem softwarové bezpečnosti je šifrování citlivých dat. Microsoft .NET Framework umí pracovat hned s několika algoritmy včetně DES, TripleDES a 256bitovým RijnDael.
Zabezpečení dat se v poslední době stává čím dál větším problémem. Programátoři vyvíjí stále složitější šifrovací algoritmy za účelem ukrytí citlivých dat. Algoritmy, jež před 30 lety byly symbolem bezpečnosti, lze v dnešní době rozluštit během několika hodin na běžném počítači.
V dnešním díle se podíváme na to, jakým způsobem kódovat text do jiné podoby a to buď jednoduchým šifrováním pomocí algoritmu, či pro vyšší bezpečnost za pomocí klíče.
Šifrování textu
Chcete-li zakódovat jednoduchý text do nečitelné podoby, poslouží vám k tomu algoritmus base64. Tento algoritmus převede řetězec do šifry složené z ASCII znaků, takže je čitelný. Nevýhodou tohoto algoritmu je navýšení velikosti zprávy, jejíž objem se zvýší přibližně o 37%.
Ukázka hotového programu
Nejčastějším využitím tohoto algoritmu je ukládání souborů do textového formátu XML. Implementace zašifrování textu pomocí base64 vypadá v C# takto.
if (textBox1.Text != null)
{
// Rozloží text na bajty
byte[] bajty = Encoding.Unicode.GetBytes(textBox1.Text);
// Převede je na zašifrovaný řetězec pomocí base64
textBox2.Text = Convert.ToBase64String(bajty);
}
else
{
MessageBox.Show("Zadejte text k zašifrování!");
}
Dešifrování pak může vypadat třeba následovně.
if (textBox2.Text != null)
{
// Převede zašifrovaný text na pole bajtů
byte[] bajty = Convert.FromBase64String(textBox2.Text);
// Dešifruje šifru a převede ji na text
textBox1.Text = Encoding.Unicode.GetString(bajty);
}
else
{
MessageBox.Show("Zadejte kód k dešifrování!");
}
Symetrické šifrování
Algoritmy symetrického šifrování fungují na principu zašifrování zprávy odesílatelem pomocí určitého klíče a její dekódování pomocí stejného klíče na původní zprávu na straně příjemce. Proto je toto šifrování nazýváno symetrickým – obě strany provádějí podobnou úlohu.
Ukázka hotového programu
V prostředí .NET jsou třídy určené pro symetrické šifrování realizované třídou System.Security.Cryptography.SymetricAlgorithm. Instanci třídy vytvoříme pomocí statické tovární metody Create, která jako argument očekává název šifrovacího algoritmu.
SymmetricAlgorithm cryptoProvider = SymmetricAlgorithm.Create("TripleDes");
Přehled možných symetrických šifrovacích argumentů uvádím v této tabulce.
Algoritmus | Délka klíče (bit) | Třída představující algoritmus |
DES | 64 | DESCryptoServiceProvider |
TripleDES | 128,192 | TripleDESCryptoServiceProvider |
RC2 | 40-128 | RC2CryptoServiceProvider |
RijnDael | 128, 192, 256 | RijnDaelManaged |
Následující metoda zašifruje určitý text algoritmem TripleDES pomocí daného klíče. Jelikož TripleDes vyžaduje 128bitový klíč, musí mít8 znaků, protože řetězce jsou v C# ve znakové sadě Unicode, v rámci kterého má každý znak 2 bajty; pak platí rovnice 2*8*8 = 128 bitů.
public static string Encrypt(string originalString, string pass)
{
if (String.IsNullOrEmpty(originalString))
{
throw new ArgumentNullException("Zadejte vhodný řetězec k zašifrování!");
}
if (pass.Length != 8) // Algoritmus TripleDES používá 128 bitový šifrovací klíč
{
MessageBox.Show("Heslo musí být dlouhé 8 znaků");
return "";
}
// Rozloží heslo na pole bajtů, kterým budou jednotlivé bloky textu šifrovány
byte[] bytes = ASCIIEncoding.Unicode.GetBytes(pass);
// Vytvoří instanci třídy SymetricAlgorithm
// představující daný symetrický šifrovací algoritmus.
SymmetricAlgorithm cryptoProvider = SymmetricAlgorithm.Create("TripleDes");
// Vytvoří datový proud do paměti do kterého budou ukládána výsledná data
MemoryStream memoryStream = new MemoryStream();
// Vytvoří šifrující datový proud k datům uchovaným v paměti
CryptoStream cryptoStream = new CryptoStream(memoryStream,
cryptoProvider.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write);
StreamWriter writer = new StreamWriter(cryptoStream);
// Zašifruje bajty
writer.Write(originalString);
writer.Flush();
cryptoStream.FlushFinalBlock();
writer.Flush();
// Zapíše do řetězce zašifrovaný text. Aby byl text
// čitelný, je převeden pomocí algoritmu base64 na čitelný
// ASCII text
return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
}
Metoda určená pro dešifrování vypadá takto:
public static string Decrypt(string cryptedString, string pass)
{
if (String.IsNullOrEmpty(cryptedString))
{
throw new ArgumentNullException("Zadejte řetězec, jež má být dekriptován!");
}
byte[] bytes = ASCIIEncoding.Unicode.GetBytes(pass);
if (pass.Length != 8) // Algoritmus TripleDES používá 128 bitový šifrovací klíč
{
MessageBox.Show("Heslo musí být dlouhé 8 znaků");
return "";
}
TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider();
MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(cryptedString));
CryptoStream cryptoStream = new CryptoStream(memoryStream,
cryptoProvider.CreateDecryptor(bytes, bytes), CryptoStreamMode.Read);
StreamReader reader = new StreamReader(cryptoStream);
return reader.ReadToEnd();
}
A to je vše. Pokud vám předprogramované algoritmy nevyhovují, na internetu najdete zdrojové kódy i hotové třídy pro zcela nové kryptografické modely, RijnDael ale nabízí až 256bitové a tedy poměrně složité klíče. Nakonec si šifrování můžete sami vyzkoušet, ke stažení totiž opět nabízíme zdrojové kódy včetně projektu pro Visual Studio 2008 (Express Edition) a spustitelný program.
Mareš, Amadeo: 1001 tipů a triků pro C#
Nestačí vám náš seriál? Pořiďte si knihu jeho autora, ve které vás seznámí s tisícovkou programovacích tipů a technik.Díky velkému počtu tipů, návodů, triků a rad kniha poslouží při každé příležitosti. Kdykoli si nevíte rady, stačí nalistovat příslušnou stranu a problém okamžitě vyřešit. Tipy a triky míří především na začínající programátory; užitečné rady tu ovšem najdou i pokročilejší vývojáři a ostřílení znalci. SOučástí publikace je i přiložené DVD, na kterém najdete bezplatné vývojové prostředí Visual C#, databázový server a především všechny zdrojové kódy z knihy, takže je budete moci okamžitě použít.Webové stránky knihy.