Cryptography v .NET – Symmetric a Asymmetric encryption

22. července 2004

Na internetu existuje mnoho webů, které by měly určitá svá data chránit před nežádoucími zraky. Praxe je bohužel taková, že velké množství webů uchovává například informace o uživatelích v XML souboru v čistém textu. To není příliš optimální řešení a myslím si, že by stálo za to, dát si tu práci a alespoň se podívat, co nám .NET v tomto směru nabízí.

Kryptografie se používá všude tam, kde je potřeba chránit data, od ukládání uživatelských hesel po šifrování tajných emailů. Záleží jen a jen na vás, co potřebujete chránit. Význam kryptografie je mimořádný především v nezabezpečených sítích, jako je internet. Kdokoli, kdo bude třeba znát adresářovou strukturu vašeho webu, může si například otevřít XML soubor, kde máte uložena hesla uživatelů. Pokud pak budou tato hesla v čistém textu, máte problém. Pokud použijete některý z šifrovacích algoritmů, bude mít útočník přinejmenším více práce hesla získat. Kolik, to záleží především na šifrovacího volbě algoritmu. Pokud použijete dostatečně silné šifrování, většinou se útočník vzdá a raději si najde jinou oběť.

Asymmetric encryption

Asymmetric encryption (nebo také šifrování s veřejným klíčem) využívá k šifrování a dešifrování dvou klíčů – veřejného a privátního (public a private). Veřejný klíč je dostupný všem, jak už z názvu vyplývá, a je používán k zašifrování dat, která mají být poslána majiteli privátního klíče. Privátní klíč se pak používá k dešifrování dat a jeho použití je účinné pouze tehdy, byl-li použit správný veřejný klíč k zašifrování. Tyto algoritmy jsou většinou používány k šifrování menších objemů dat. Framework .NET nám z asymetrických šifer nabízí DSA (Digital Signature Algorithm) a RSA.

Symmetric encryption

Symmetric encryption (nebo také šifrování privátním klíčem) využívá k šifrování a dešifrování pouze jednoho klíče a navíc takzvaný inicializační vektor (IV). Symetrické algoritmy jsou vcelku rychlé a mohou být použity i pro větší objemy dat. Použijeme-li v symetrickém šifrování jeden klíč, bude vstup vždy reprezentován stejným šifrovaným výstupem. Symetrické algoritmy šifrují data po blocích (proto jsou někdy nazývány blokovým šifrováním). V .NET je navíc blok vždy šifrován v závislosti na bloku předchozím – aby bylo tedy možno zašifrovat první blok, je právě zapotřebí inicializačního vektoru. Framework .NET nám nabízí tyto symetrické algoritmy:

  • DES šifruje 64-bitové bloky použitím 64-bitového klíče. Tento algoritmus je poněkud zastaralý a nevyhovující. V současné době jsou již počítače natolik výkonné, že dokáží vyhledat všechny možné klíče během relativně krátké doby.
  • 3DES (Triple-DES) byl navržen, aby vyřešil bezpečnostní nedostatky klasického DES algoritmu. Tento algoritmus používá taktéž 64-bitový klíč, ale slučuje v sobě tři průběhy klasického DES algoritmu. Text je tedy bezpečněji zašifrován, ale šifrování zabere třikrát více času než klasický DES algoritmus.
  • RC2 může mít libovolně veliký klíč v rozmezí od 8 do 64 bitů. RC2 byl navržen jako bezpečnější náhrada algoritmu DES, jenže limit .NET Frameworku je stejně jako u DES 64 bitů, takže jeho jedinou výhodou oproti DES je poněkud vyšší rychlost.
  • Rijndael je z uvedeného výčtu nejspolehlivější. Byl navržen a schválen teprve nedávno jako náhrada za již nevyhovující DES algoritmy. Klíč tohoto algoritmu může být veliký 128, 192 nebo 256 bitů.

Myslím, že nyní znáte z kryptografie v .NET Frameworku to nejdůležitější, nyní bych asi měl uvést nějaký příklad. Zkusíme napsat jednoduchou metodu, která nám zašifruje v parametru předaný text pomocí algoritmu Rijndael. Upozorňuji, že všechny šifrovací třídy (RijndaelManaged, RC2 a další) patří do jmenného prostoru System.Security.Cryptography. Teď tedy příklad použití algoritmu Rijndael:

string RijndaelEncryptor(string text)
{
    RijndaelManaged rijndael = new RijndaelManaged();
    byte[] key;
    byte[] IV;
    rijndael.GenerateKey();
    rijndael.GenerateIV();
    key = rijndael.Key;
    IV = rijndael.IV;
    ICryptoTransform encryptor = rijndael.CreateEncryptor();
    MemoryStream msEncrypt = new MemoryStream();
    CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
    byte[] input = Encoding.UTF8.GetBytes(text);
    // zapiseme do CryptoStreamu
    csEncrypt.Write(input, 0, input.Length);
    csEncrypt.FlushFinalBlock();
    // prevedeme MemoryStream na string
    return (Convert.ToBase64String(msEncrypt.ToArray()));
}

Použitá metoda je poněkud odlehčená, ale jako demonstrace zcela postačuje. Pro náš účel prozatím stačí generovat klíč a inicializační vektor pomocí metod Rijndael.GenerateKey() a GenerateIV(), v praxi se však jako klíč a IV někdy používá vybraná fráze, zašifrovaná algoritmem nevyžadující klíč (hash algoritmus, například SHA).

Úvodní část metody nepotřebuje vysvětlení, podívejte se až na řádek ICryptoTransform encryptor = rijndael.CreateEncryptor();. Tady vytváříme Encryptor. (Pokud bychom chtěli dešifrovat již šifrovaný text, volali bychom metodu CreateDecryptor() a postup by byl analogický, jen s několika málo rozdíly). Na dalších řádcích už jen vytváříme MemoryStream(), do kterého naši šifru „vypustíme“, a CryptoStream(), kterému předáme jako první parametr výstup náš MemoryStream.

Pro důkladnější pochopení funkčnosti jednotlivých metod stačí prostudovat MSDN dokumentaci, ale nemyslím, že by to bylo nutné, použití je intuitivní.

Odkazy, zdroje

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *