.NET Framework obsahuje sadu kryptografických služeb, které rozšiřují podobné služby Windows prostřednictvím CryptoAPI . Jmenný prostor System.Security.Cryptography poskytuje programový přístup k široké škále kryptografických služeb, které mohou aplikace používat k šifrování a dešifrování dat , zajištění integrity dat a zpracování digitálních podpisů a certifikátů.
Na nejvyšší úrovni lze jmenný prostor Cryptography rozdělit na čtyři hlavní části (Tabulka 1). Hlavním účelem tohoto prostoru je poskytnout třídám algoritmy pro operace, jako je šifrování a generování hashů. Tyto algoritmy jsou implementovány na základě rozšiřitelného vzoru (vzoru), který zahrnuje dvě úrovně dědičnosti.
Na vrcholu hierarchie je abstraktní základní třída (jako AsymmetricAlgorithm nebo HashAlgorithm), jejíž název odpovídá typu algoritmu. Z takové třídy se zdědí abstraktní třída druhé úrovně, která poskytuje veřejné rozhraní pro použití tohoto algoritmu. Například SHA1 (Secure Hash Algorithm) je třída odvozená od HashAlgorithm a obsahuje metody a vlastnosti specifické pro algoritmus SHA1. A konečně, implementace samotného algoritmu je odvozena od třídy druhé úrovně; je to jeho instance , která je vytvořena a používána klientskou aplikací. Na této úrovni může být implementace řízená, nespravovaná nebo obojí.
Živel | Popis |
---|---|
Šifrovací algoritmy | Sada tříd používaných k implementaci symetrických a asymetrických šifrovacích a hashovacích algoritmů |
Pomocné třídy | Třídy, které poskytují generování náhodných čísel, transformace, interakci s úložištěm CryptoAPI a samotné šifrování na základě modelu streamování |
Certifikáty X.509 | Třídy definované ve jmenném prostoru System.Security.Сryptograph. X509Certificates a reprezentující digitální certifikáty |
Digitální podpisy XML | Třídy definované v oboru názvů System.Cryptography.Xml, které představují digitální podpisy v dokumentech XML |
Tab. 1. Základní prvky jmenného prostoru Cryptography
Nespravované implementace mají obvykle příponu „CryptoServiceProvider“ (řekněme SHA1CryptoServiceProvider), která označuje, že implementaci ve skutečnosti poskytuje poskytovatel kryptografických služeb ( CSP ), který je nainstalován na úrovni operačního systému a funguje jako obal CryptoAPI .
Názvy spravovaných implementací zahrnují příponu "Managed" (například SHA1Managed). Takové implementace se nespoléhají na CryptoAPI a obsahují pouze spravovaný kód.
Při vytváření instance jedné z konkrétních tříd původní konstruktéři vždy nastaví parametry objektu na rozumné a bezpečné hodnoty (pokud je to možné). Asymetrické šifrovací algoritmy založené na kryptografii veřejného klíče tedy generují náhodný pár klíčů a symetrické šifrovací algoritmy generují náhodný klíč a inicializační vektor (IV); automaticky však upravují vlastnosti, jako je režim a výplň. Algoritmy druhého typu se navíc snaží standardně používat „trvalé“ hodnoty.
Druhá hlavní sada tříd ve jmenném prostoru System.Security.Cryptography zahrnuje jak třídy , které se skutečně používají v procesu šifrování a dešifrování dat, tak různé pomocné třídy . Tento jmenný prostor obsahuje například abstraktní třídu RandomNumberGenerator, ze které se dědí třídy RNGCryptoServiceProvider, ToBase64Transform a FromBase64Transform (používá se v odpovídajících transformacích dat).
Jmenný prostor Cryptography poskytuje nejen šifrovací algoritmy, ale obsahuje také podřízený jmenný prostor, X509Certificates. Ten kombinuje pouze tři třídy určené pro operace s certifikáty Authenticode X.509 v.3. Třída X509Certificate poskytuje statické metody CreateFromCertFile a CreateFromSignedFile pro vytvoření instance certifikátu:
X509Certificate c = X509Certificate.CreateFromCertFile("myCert.cer"); Console.WriteLine(c.GetName); Console.WriteLine(c.GetPublicKeyString); Console.WriteLine(c.GetSerialNumberString); Console.WriteLine(c.GetExpirationDateString);Jmenný prostor Cryptography má také podřízený jmenný prostor XML , který používá bezpečnostní systém .NET Framework k digitálnímu podepisování objektů XML v souladu s návrhem specifikace WSC pro syntaxi a zpracování podpisů XML ( http://www.w3.org/ TR/ 2000/WD-xmldsig-core-20000228/ ).
Existuje několik způsobů, jak vytvořit blokové šifry. Nejjednodušším a nejintuitivnějším způsobem je rozdělit zdrojový text na bloky vhodné velikosti a poté každý blok samostatně podrobit šifrovací transformaci. Tento způsob použití blokových šifer se nazývá elektronická kódová kniha (ECB). Jeho hlavní nevýhodou je, že stejné bloky otevřeného textu při zašifrování poskytnou stejné bloky šifrovaného textu, což může protivníkovi značně usnadnit jeho prolomení. Proto se režim ECB nedoporučuje pro šifrování textů, které jsou delší než jeden blok. V takových případech je lepší použít některý z režimů, které navzájem spojují různé bloky.
Ve výchozím nastavení používá CryptoAPI blokové šifry v režimu cipher block chaining (CBC). V tomto režimu je během šifrování následující blok otevřeného textu nejprve zkombinován s předchozím blokem šifrovaného textu (pomocí bitového XOR) a poté je výsledná bitová sekvence vložena do blokové šifry. Výsledný blok šifrovaného textu se použije k zašifrování dalšího bloku. Úplně první blok otevřeného textu musí být také zkombinován s nějakou sekvencí bitů, ale zatím neexistuje žádný „předchozí blok šifrovaného textu“; proto režimy šifrování s uzavřenou smyčkou vyžadují použití ještě jednoho parametru – nazývá se inicializační vektor (IV – inicializační vektor). IV je neutajená binární hodnota, jejíž velikost se rovná délce šifrového bloku. Chcete-li vygenerovat nový klíč, musíte zavolat metodu GenerateKey a pro inicializační vektor metodu GenerateIV. Například pro algoritmus RC2 podporovaný poskytovatelem kryptografických služeb společnosti Microsoft je velikost bloku 64 bitů (8 bajtů).
DESCryptoServiceProvider mDES; mDES = new DESCryptoServiceProvider(); // Náhodně vygeneruje nový klíč a IV mDES.GenerateKey(); mDES.GenerateIV();
SymmetricAlgorithm
|— AES
| |— AESCryptoServiceProvider
| |— Spravováno AES
|— DES
| |— DESCryptoServiceProvider
|— RC2
| |— RC2CryptoServiceProvider
|— Rijndael
| |— RijndaelManaged
|— TripleDES
| |— TripieDESCryptoServiceProvider
Hierarchie symetrických algoritmů
SymmetricAlgorithm je abstraktní základní třída, ze které dědí jiné třídy specifické pro algoritmus . Mezi podporované symetrické algoritmy patří Data Encryption Standard (DES), RC2, Rijndael, Advanced Encryption Standard (AES) a Triple Data Encryption Standard (TripleDES). Každý algoritmus zahrnuje abstraktní třídu odvozenou od SymmetricAlgorithm, jako je DES, a třídu spravovanou nebo poskytovatele služeb odvozenou od báze, jako je DESCryptoServiceProvider. Vlastnosti KeySize a BlockSize umožňují definovat délku klíče a velikost datového bloku (v bitech), který lze zašifrovat nebo dešifrovat v jedné operaci.
Použití třídy RijndaelManaged:
RijndaelManaged oEnc = new RijndaelManaged(); int i; StringstrKey = String.Empty; StringstrlV = String.Empty; for(i = 0; i < (oEnc.KeySize / 8); i++) strKey += oEnc.Key(i).ToString() + " "; for(i = 0; i < (oEnc.BlockSize / 8); i++) strlV += oEnc.lV(i).ToString() + " "; Console.WriteLine(strKey); Console.WriteLine(strIV); Console.WriteLine(oEnc.KeySize.Tostring()); Console.WriteLine(oEnc.BlockSize.Tostring());.NET Framework podporuje programovací model založený na proudech. Třídy proudů odvozené od System.lO.Stream představují data z různých úložišť (textové soubory, dokumenty XML , zprávy MSMQ , paměť a síť) a umožňují číst data z odpovídajících úložišť nebo do nich zapisovat. Tato funkcionalita je založena na třídě CryptoStream, která je odvozena od System.IO.Stream a slouží jako streamový model pro kryptografické transformace.
DESCryptoServiceProvider mDES = new DESCryptoServiceProvider(); FileStream fsOutput = new FileStream("temp.dat", FileMode.Create, FileAccess.Write); Byte[] arInput = nový Byte[320]; //… // Vytvořte DES Encryptor z této instance ICryptoTransform desEncript = mDES.CreateEncryptor(); // Vytvoří CryptoStream, který převede datový proud souborů // pomocí šifrování DES CryptoStream sCrypto = new CryptoStream(fsOutput, desEncrypt, CryptoStreamMode.Write); // Zapište zašifrovaný soubor sCrypto.Write(arInput, 0, arInput.length); sCrypto.Close(); fsOutput.Close();Asymetrické šifrování se používá k šifrování malého množství dat, takže CryptoStream se nepoužívá s asymetrickým šifrováním.
Mezi známé asymetrické algoritmy patří Digital Signature Algorithm (DSA) a RSA. Tyto algoritmy jsou nakonec odvozeny z abstraktních tříd DSA a RSA, které jsou zase odvozeny od asymetrického algoritmu. Protože jsou tyto algoritmy velmi složité, potřebují pomocné třídy odvozené například od AsymmetricKeyExchangeFormatter a AsymmetricSignatureFormatter.
Asymetrický algoritmus
|— DSA
| |— DSACryptoServiceProvider
|— RSA
| |—RSACryptoServiceProvider
AsymmetricKeyExchangeFormatter
|— RSAOAEPKeyExchangeFormatter
|— RSAPKCS1KeyExchangeFormatter
AsymmetricKeyExchangeDeformatter
|— RSAOAEPKeyExchangeDeformatter
|— RSAPKCS1KeyExchangeDeformatter
AsymmetricKeySignatureFormatter
|—RSAOAEPSsignatureFormatter
|
—RSAPKCS1SignatureFormatter
AsymmetricSignatureDeformatter
|— RSAOAEPSsignatureDeformatter
|— RSAPKCS1SignatureDeformatter
Hierarchie asymetrických algoritmů
Nejen, že můžete nechat původní konstruktor asymetrického algoritmu vygenerovat pár klíčů, ale také můžete načíst již existující pár klíčů z úložiště podporovaného CSP .
CspParameters cp = new CspParameters(); cp.KeyContainerName = Název kontejneru; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);Třídy RSAOAEPKeyExchangeFormatter/Deformatter a RSAPKCS1KeyExchangeFormatter/Deformatter jsou zodpovědné za výměnu klíčů relace v .NET . Jsou odvozeny od základních tříd AsymmetricKeyExchangeFormatter/Deformatter, které poskytují metody CreateKeyExchange a DecryptKeyExchange pro šifrování a dešifrování klíčů relace.
RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider(1024); // příjemce klíče RSAparameters rp = rsa1.ExportParameters(false); Console.WriteLine("Předávání veřejného klíče odesílateli..."); // předá veřejný klíč odesílateli //… RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider(1024); // odesilatel klíče Console.WriteLine("Importuji veřejný klíč příjemce..."); // import veřejného klíče příjemce rsa2.ImportParameters(rp); AsymmetricKeyExchangeFormatter kf = (AsymmetricKeyExchangeFormatter) new RSAOAEPKeyExchangeFormatter(rsa2); klíč byte[] = nový Byte[16]; // 128bitový klíč byte[] enckey = kf.CreateKeyExchange(key); Console.WriteLine("Odesílání šifrovaného klíče relace příjemci..."); // předá zašifrovaný klíč relace příjemci //… AsymmetricKeyExchangeDeformatter kd = (AsymmetricKeyExchangeDeformatter) new RSAOAEPKeyExchangeDeformatter(rsa1); // Dešifrování klíče byte[] deckey = kd.DecryptKeyExchange(enckey); for(int i = 0; i < 16 ; i++) if (deckey[i] != klíč[i]) { Console.WriteLine(" Výměna klíčů se nezdařila"); } Console.WriteLine(" Výměna klíčů proběhla úspěšně");Obor názvů Cryptography obsahuje základní třídu HashAlgorithm a odvozené třídy, které podporují algoritmy MD5 , SHA1 , SHA256 , SHA384 a SHA512 . Algoritmus MD5 poskytuje 128bitový hash , zatímco SHA1 poskytuje 160bitový hash. Čísla v názvech jiných verzí algoritmů SHA odpovídají délce hashů, které vytvářejí. Čím větší je hash , tím spolehlivější je algoritmus a tím těžší je jej prolomit. Všechny tyto algoritmy jsou implementovány ve dvou verzích: založené na spravovaném a nespravovaném kódu.
HashAlqorithm
| —KeyedHashAlgorithm
| |— HMACSHA1
| |— MACTripleDES
|— MD5
| |— MD5CryptoServiceProvider
|— SHA1
| |— SHA1CryptoServiceProvider
| |— SHA1Spravováno
|— SHA256
| |— SHA256Spravováno
|— SHA384
| |— SHA384Spravováno
|— SHA512
| |— SHA512Spravovaná
hierarchie hašovacích algoritmů
Chcete-li vypočítat digest , stačí vytvořit instanci třídy algoritmu hash a zavolat její přetíženou metodu ComputeHash, která dědí z HashAlgorithm:
FileStream fsData = new FileStream("mydata.txt",FileHode.Open, FileAccess.Read); Byte[] digest; SHA512Managed oSHA = new SHA512Managed(digest - oSHA.ComputeHash(fsData)); fsKey.Close()Zde je metoda ComputeHash předána objektu Stream, ale také přijímá bajtové pole. Jmenný prostor Cryptography má také abstraktní třídu KeyedHashAlgorithm. Algoritmy implementované ve třídách HMACSHA1 a MACTripleDES, odvozené od KeyedHashAlgorithm, umožňují generování kódu pro ověřování zpráv ( MAC ). Pomocí MAC můžete určit, zda data přenášená přes nezabezpečený komunikační kanál byla změněna – za předpokladu, že odesílatel i příjemce používají sdílený tajný klíč.
Metoda SignHash tříd RSACryptoServiceProvider a DSACryptoServiceProvider vypočítá signaturu pro hash dat vytvořený pomocí speciálního algoritmu. Hašovací algoritmus je předán jako druhý parametr jako identifikátor, který lze vypočítat pomocí funkce MapNameToOID. Pro RSACryptoServiceProvider je to SHA1 a MD5 a pro DSACryptoServiceProvider je to pouze SHA1.
rsaCSP.SignHash(hashedData, CryptoConfig.MapNameToOID("SHA1"));Třídy RSAPKCS1SignatureFormatter/Deformatter a DSASignatureFormatter/Deformatter vytvářejí digitální podpis . Obě dvojice tříd jsou zděděny od tříd AsymmetricSignatureFormatter/Deformatter, které poskytují standardní rozhraní pro vytváření a ověřování digitálního podpisu – metody CreateSignature a VerifySignature. Před výpočtem nebo ověřením digitálního podpisu se ujistěte, že jste zavolali SetHashAlgorithm a nastavili hashovací algoritmus, který bude v procesu použit. RSAPKCS1SignatureFormatter rozumí dvěma hašovacím algoritmům – MD5 a SHA1, zatímco DSASignatureFormatter – pouze SHA1.
// vytvoření digitálního podpisu RSA AsymmetricSignatureFormatter sf; sf = (AsymmetricSignatureFormatter) new RSAPKCS1SignatureFormatter(rsa); // vytvořit formátovač sf.SetHashAlgorithm("MD5"); // výběr hashovacího algoritmu sig = sf.CreateSignature(Hash); // vytvořte podpis (hash musí být již vypočten dříve) //ověření digitálního podpisu RSA AsymmetricSignatureDeformatter df; df = (AsymmetricSignatureDeformatter) new RSAPKCS1SignatureDeformatter(rsa); // vytvořit deformátor df.SetHashAlgorithm("MD5"); if (df.VerifySignature(Hash, sig)) // ověření podpisu { // podpis je správný } jiný { // podpis je neplatný }.SÍŤ | |
---|---|
Implementace | |
Architektura | |
Infrastruktura | |
jazyky Microsoft | |
Jiné jazyky | |
Základy Windows | |
Komponenty | |
Srovnání |
|
Budoucí technologie | |
Informační zdroje |