Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Knihovna pro šifrování pomocí AES v C# .NET

V minulé lekci, Ukázka jednoduché šifrace textu Vigenerova šifra, jsme si ukázali Vigenerovou šifru.

Pokoušel jsem se udělat si aplikaci, co bude umět šifrovat data, co ukládá. Zjistil jsem, že v .NETu sice jsou prostředky pro šifrovaní, ale je poměrně pracné s nimi dělat běžné věci a jsou celkově těžkopádné. Proto jsem si vytvořil knihovnu pro šifrování, kterou jsem časem výrazným způsobem vylepšil a zveřejnil.

Nyní je ve stavu, kdy jsem přesvědčen, že vše funguje, jak má a nikdo nemá se žádnou částí problém. Také je důležité, že se knihovna sama stará o bezpečností opatření, která by člověk asi rád opominul s tím, že nejsou příliš důležitá nebo ani neví, že tam mají být (já jsem to třeba také nevěděl).

Funkce

  • (de)šifrování jakýchkoliv serializovatelných objektů na bázi XML (obyčejné stringy jsou výjimka, nepoužívají XML)
  • šifrování textovým heslem a klíčem byte[], odvození klíče z hesla
  • důkladné solení
  • automatické generování nových inicializačních vektorů
  • HMACSHA256 autentizace a porovnání v konstantním čase (je bezpečné to použít na serveru)
  • autentizace plaintextu (ano, relativně zbytečná, ale ono to sha1 moc dlouho netrvá...)
  • 100% pracuje se streamy, takže není problém zašifrovat velké soubory pomocí FileStream
  • bez závislostí
  • k dispozici na NuGetu

Příklady použití

Zašifrování textu textovým heslem

const string password = "42";
string plaintext = "Gravity is a myth, Earth sucks!";
string cipher;
using (var aes = new PasswordAes(password))
    cipher = aes.Encrypt(plaintext);
//dešifrování
using (var aes = new PasswordAes(password))
    Console.WriteLine(aes.Decrypt(cipher));

Zašifrování textu bytovým klíčem, který si necháme vygenerovat

byte[] key;
var plaintext = "Why so serious?";
string cipher;
using (var aes = new AdvancedAes())
{
    //klíč je generovaný automaticky, pokud ho nespecifikujete v konstruktoru
    key = aes.EncryptionKey;
    cipher = aes.Encrypt(plaintext);
}
//dešifrování
using (var aes = new AdvancedAes(key))
    Console.WriteLine(aes.Decrypt(cipher));

Celou dokumentaci najdete na GitLabu

Poznámky

  • Formát není kompatibilní s ostatními knihovnami/programy
  • Je třeba třídy používat v using bloku (nebo podobných konstrukcích). Pokud provádíte šifrování jednou za běh programu, asi to nebude tak špatné, ale pokud budete rekurzivně šifrovat složku, mohou se dít nepěkné věci (potom samozřejmě použijte tu samou instanci, proto se to neprovádí automaticky)
  • Knihovnu můžete používat i když úplně nevíte, co děláte, ale potom se nepokoušejte dělat něco jako změnu délky klíče (výchozí je 256b)
  • Textové heslo není zdaleka tak bezpečné jako klíč tvořen bitovým polem, pokud nemáte něco jako 64 znaků dlouhé heslo. Heslo používejte pouze pokud musíte šifrovat heslem, které vám dá uživatel. Aby se ztížilo uhádnutí takového hesla, iteruje se poměrně dlouho (klidně desítky ms), než z něj vypadne bitové pole - potom tkví bezpečnost v tom, že je složité získat klíč z hesla. Počet iterací se nastavuje jako statická vlastnost CryptoUtils.Rfc2898DeriveBytesIterations
  • Výstup bude přibližně 4/3 velikosti vstupu + hlavičky, protože se vše kóduje do base64
  • Ano, všude jinde je jiná ikona. To je tak, když si ukládáte jen rozlišení, co potřebujete...

Galerie

Program byl vytvořen v roce 2017.

 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 45x (93.72 kB)
Aplikace je včetně zdrojových kódů

 

Předchozí článek
Ukázka jednoduché šifrace textu Vigenerova šifra
Všechny články v sekci
Kryptografie
Program pro vás napsal Petr Čech
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Autor se věnuje především desktopovým aplikacím v C#, okrajově Javě na Legu NXT.
Aktivity