reklama

Staňte se programátorem: Základy šifrování

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%.

Klepněte pro větší obrázek
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.

 Klepněte pro větší obrázek
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.

AlgoritmusDélka klíče (bit)Třída představující algoritmus
DES64DESCryptoServiceProvider
TripleDES128,192TripleDESCryptoServiceProvider
RC240-128RC2CryptoServiceProvider
RijnDael128, 192, 256RijnDaelManaged

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#

Klepněte pro větší obrázekNestačí 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.

Témata článku: Programování, Bezpečnost, Unicode, Šifrování, Pass, Byte, 1001

25 komentářů

Nejnovější komentáře

  • ricmat 5. 9. 2009 0:32:22
    Autor zde naprosto hrubym zpusobem zamenuje slova kodovani (kodovani textu...
  • xixo 22. 8. 2009 10:11:09
    Tohle je kurs lepení komponent k sobě, s programováním to nemá nic...
  • my_account 21. 8. 2009 14:43:36
    Lenže tento kód je napísaný vyložene blbo. Ak je zlý jeden vstup vyhodím...
reklama
Určitě si přečtěte

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

UPC překopli páteřní kabel. V Brně i druhý den nejede internet ani kabelovka

** V Brně byl velký výpadek služeb UPC ** Důvodem je překopnutý páteřní kabel ** V některých lokalitách služby stále nefungují

5.  12.  2016 | Jakub Čížek | 103

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

17 expertek Microsoftu předpovědělo rok 2027. Splní se alespoň něco?

** Zmizí klasické vyhledávače ** Budeme programovat buňky ** Kvantové počítače překonají šifry

6.  12.  2016 | Jakub Čížek | 36

11 tipů na dobrý stolní počítač: od základu po herní mašiny

11 tipů na dobrý stolní počítač: od základu po herní mašiny

** Postavte si stolní počítač! Máme pro vás 11 vzorových sestav s rozpisem komponent ** Většina tipů cílí na hráče, věnujeme se ale i základnímu PC a počítačům na střih videa ** Nadělte si nový počítač třeba pod stromeček

5.  12.  2016 | Adam Kahánek | 74

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

Nejlepší notebooky nad 20 tisíc: poradíme, které teď chcete

** V notebooku s cenou nad 20 tisíc nesmí chybět kvalitní displej a rychlé úložiště ** Za dalších deset tisíc můžete dostat navíc styl nebo výkonnější komponenty ** Vybírat můžete z různých velikostí i konstrukcí

8.  12.  2016 | Stanislav Janů | 84


reklama