.NET-keretrendszer titkosítási szolgáltatások

Bevezetés

A .NET-keretrendszer olyan kriptográfiai szolgáltatásokat tartalmaz, amelyek a CryptoAPI -n keresztül kiterjesztik a hasonló Windows -szolgáltatásokat . A System.Security.Cryptography névtér programozott hozzáférést biztosít számos kriptográfiai szolgáltatáshoz, amelyeket az alkalmazások használhatnak adatok titkosítására és visszafejtésére , az adatok integritásának biztosítására, valamint a digitális aláírások és tanúsítványok feldolgozására.

Névtér kriptográfia

A legmagasabb szinten a Cryptography névtér négy fő részre bontható (1. táblázat). Ennek a térnek az a fő célja, hogy az osztályok számára algoritmusokat biztosítson olyan műveletekhez, mint a titkosítás és a hash generálás. Ezek az algoritmusok egy kiterjeszthető minta (minta) alapján valósulnak meg, amely két öröklődési szintet foglal magában.

A hierarchia tetején egy absztrakt alaposztály található (például AsymmetricAlgoritm vagy HashAlgorithm), amelynek neve megfelel az algoritmus típusának. Egy ilyen osztályból egy absztrakt második szintű osztály öröklődik, amely nyilvános felületet biztosít az algoritmus használatához. Például az SHA1 (Secure Hash Algorithm) a HashAlgoritmusból származó osztály , amely az SHA1 algoritmusra jellemző módszereket és tulajdonságokat tartalmazza. Végül maga az algoritmus implementációja a második szintű osztályból származik; a példányát hozza létre és használja az ügyfélalkalmazás. Ezen a szinten a megvalósítás lehet menedzselt, nem menedzselt vagy mindkettő.

Elem Leírás
Titkosítási algoritmusok A szimmetrikus és aszimmetrikus titkosítási és kivonatolási algoritmusok megvalósítására használt osztályok halmaza
Segítő osztályok Osztályok, amelyek véletlenszám-generálást, átalakításokat, interakciót biztosítanak a CryptoAPI tárolóval és magát a titkosítást a streaming modell alapján
X.509 Tanúsítványok A System.Security.Сryptograph névtérben meghatározott osztályok. X509Tanúsítványok és digitális tanúsítványok
XML digitális aláírások A System.Cryptography.Xml névtérben definiált osztályok , amelyek digitális aláírásokat képviselnek XML dokumentumokban

Tab. 1. A Cryptography névtér alapelemei

A nem felügyelt megvalósításokat általában a „CryptoServiceProvider” (mondjuk az SHA1CryptoServiceProvider) utótaggal látják el annak jelzésére, hogy a megvalósítást valójában egy kriptográfiai szolgáltató ( CSP ) biztosítja, amely az operációs rendszer szintjén van telepítve, és CryptoAPI burkolóként működik .

A felügyelt megvalósítási nevek közé tartozik a „Managed” utótag (például SHA1Managed). Az ilyen megvalósítások nem támaszkodnak a CryptoAPI -ra , és csak felügyelt kódot tartalmaznak.

Az egyik konkrét osztály példányosítása során az eredeti konstruktorok mindig ésszerű és biztonságos értékekre állítják az objektum paramétereit (ha lehetséges). Tehát a nyilvános kulcsú titkosításon alapuló aszimmetrikus titkosítási algoritmusok véletlenszerű kulcspárt, a szimmetrikus titkosítási algoritmusok pedig véletlen kulcsot és inicializálási vektort (IV) generálnak; azonban automatikusan beállítják a tulajdonságokat, például a módot és a kitöltést. Ezenkívül a második típusú algoritmusok alapértelmezés szerint "perzisztens" értékeket próbálnak használni.

A System.Security.Cryptography névtér második fő osztálykészlete az adatok titkosítása és visszafejtése során ténylegesen használt osztályokat , valamint különféle segédosztályokat egyaránt tartalmaz . Ez a névtér tartalmazza például a RandomNumberGenerator absztrakt osztályt , amelyből az RNGCryptoServiceProvider, ToBase64Transform és FromBase64Transform osztályok öröklődnek (a megfelelő adatátalakításoknál használatos).

A Cryptography névtér nemcsak titkosítási algoritmusokat biztosít, hanem tartalmaz egy gyermek névteret is, az X509Certificates-t. Ez utóbbi csak három osztályt egyesít, amelyeket az Authenticode X.509 v.3 tanúsítványokkal végzett műveletekhez terveztek. Az X509Certificate osztály biztosítja a CreateFromCertFile és CreateFromSignedFile statikus metódusokat a tanúsítványok példányosításához:

X509Certificate c = X509Certificate.CreateFromCertFile("sajatCert.cer"); Console.WriteLine(c.GetName); Console.WriteLine(c.GetPublicKeyString); Console.WriteLine(c.GetSerialNumberString); Console.WriteLine(c.GetExpirationDateString);

A Cryptography névtérnek van egy gyermeknévtér , az XML is, amelyet a .NET-keretrendszer biztonsági rendszer az XML-objektumok digitális aláírására használ az XML aláírási szintaxis és feldolgozás WSC-specifikációjának tervezetének megfelelően ( http://www.w3.org/ ). TR/ 2000/WD-xmldsig-core-20000228/ ).

Titkosítási algoritmusok

Szimmetrikus algoritmusok

A blokk titkosítások létrehozásának számos módja van. A legegyszerűbb és legintuitívabb módja a forrásszöveg megfelelő méretű blokkokra bontása, majd az egyes blokkok külön-külön titkosítási átalakítása. A blokk-rejtjelek használatának ezt a módját elektronikus kódkönyvnek (ECB) nevezik. Legfőbb hátránya, hogy ugyanazok a nyílt szövegblokkok titkosítva ugyanazokat a titkosított szövegblokkokat adják, és ez nagyban megkönnyítheti az ellenfél feltörési feladatát. Ezért az EKB mód nem ajánlott egy blokknál hosszabb szövegek titkosítására. Ilyen esetekben érdemesebb a különböző blokkokat egymással összekötő módok valamelyikét használni.

Alapértelmezés szerint a CryptoAPI blokkrejtjeleket használ titkosítási blokkláncolás (CBC) módban. Ebben a módban a titkosítás során a nyílt szöveg következő blokkja először a titkosított szöveg előző blokkjával kombinálódik (bitenkénti XOR használatával), majd az eredményül kapott bitsorozat bekerül a blokk titkosításba. A kapott titkosított szövegblokk a következő blokk titkosítására szolgál. A legelső egyszerű szöveges blokkot is kombinálni kell valamilyen bitsorozattal, de még nincs "előző titkosított szöveg blokk"; ezért a zárt hurkú titkosítási módokhoz még egy paraméter használatára van szükség - ezt inicializálási vektornak nevezik (IV - inicializálási vektor). A IV egy nem titkos bináris érték, amelynek mérete megegyezik a rejtjelblokk hosszával. Új kulcs generálásához meg kell hívni a GenerateKey metódust, az inicializálási vektorhoz pedig a GenerateIV metódust. Például a Microsoft mögöttes kriptográfiai szolgáltató által támogatott RC2 algoritmus esetében a blokk mérete 64 bit (8 bájt).

DESCryptoServiceProvider mDES; mDES = new DESCryptoServiceProvider(); // Új kulcs és IV véletlenszerű generálása mDES.GenerateKey(); mDES.GenerateIV();

SymmetricAlgoritm
|— AES
| |— AESCryptoServiceProvider
| |— AES által kezelt
|— DES
| |— DESCryptoServiceProvider
|— RC2
| |— RC2CryptoServiceProvider
|— Rijndael
| |— RijndaelManaged
|— TripleDES
| |— TripieDESCryptoServiceProvider
Szimmetrikus algoritmusok hierarchiája

A SymmetricAlgoritm egy absztrakt alaposztály, amelyből más algoritmus-specifikus osztályok örökölnek. A támogatott szimmetrikus algoritmusok közé tartozik a Data Encryption Standard (DES), az RC2, a Rijndael, az Advanced Encryption Standard (AES) és a Triple Data Encryption Standard (TripleDES). Mindegyik algoritmus tartalmaz egy SymmetricAlgorithm-eredetű absztrakt osztályt, például a DES-t, és egy alapból származó felügyelt vagy szolgáltatói osztályt, például DESCryptoServiceProvider-t. A KeySize és BlockSize tulajdonságok lehetővé teszik, hogy meghatározza a kulcs hosszát és az adatblokk méretét (bitekben), amely egyetlen művelettel titkosítható vagy visszafejthető.

A RijndaelManaged osztály használata:

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());

A .NET-keretrendszer támogatja az adatfolyamokon alapuló programozási modellt. A System.lO.Stream-ből származó adatfolyam- osztályok különféle tárolókból (szövegfájlok, XML -dokumentumok, MSMQ -üzenetek, memória és hálózat) származó adatokat képviselnek, és lehetővé teszik az adatok olvasását vagy írását a megfelelő tárolókból. Ez a funkció a CryptoStream osztályon alapul, amely a System.IO.Stream fájlból származik, és adatfolyam-modellként szolgál a kriptográfiai átalakításokhoz.

DESCryptoServiceProvider mDES = new DESCryptoServiceProvider(); FileStream fsOutput = new FileStream("temp.dat", FileMode.Create, FileAccess.Write); Byte[] arInput = új bájt[320]; //… // Hozzon létre egy DES Encryptort ebből a példányból ICryptoTransform desEncript = mDES.CreateEncryptor(); // Hozzon létre egy CryptoStream-et, amely átalakítja a fájlfolyamot // DES titkosítással CryptoStream sCrypto = new CryptoStream(fsOutput, desEncrypt, CryptoStreamMode.Write); // Írja be a titkosított fájlt sCrypto.Write(arInput, 0, arInput.length); sCrypto.Close(); fsOutput.Close();

Az aszimmetrikus titkosítást kis mennyiségű adat titkosításához használják, ezért a CryptoStream nem használható aszimmetrikus titkosítással.

Aszimmetrikus titkosítás (nyilvános kulcsú titkosítás)

A jól ismert aszimmetrikus algoritmusok közé tartozik a Digital Signature Algorithm (DSA) és az RSA. Ezek az algoritmusok végső soron a DSA és RSA absztrakt osztályokból származnak, amelyek viszont az AsymmetricAlgoritmból származnak. Mivel ezek az algoritmusok nagyon összetettek, szükségük van segédosztályokra, amelyek például az AsymmetricKeyExchangeFormatter és AsymmetricSignatureFormatter forrásokból származnak.

AsymmetricAlgoritm
|— DSA
| |— DSACryptoServiceProvider
|— RSA
| |—RSACryptoServiceProvider

AsymmetricKeyExchangeFormatter
|— RSAOAEPKeyExchangeFormatter
|— RSAPKCS1KeyExchangeFormatter

AsymmetricKeyExchangeDeformatter
|— RSAOAEPKeyExchangeDeformatter
|— RSAPKCS1KeyExchangeDeformatter

AsymmetricKeySignatureFormatter
|—RSAOAEPSignatureFormatter
| —RSAPKCS1SignatureFormatter

AsymmetricSignatureDeformatter
|— RSAOAEPSignatureDeformatter
|— RSAPKCS1SignatureDeformatter
Aszimmetrikus algoritmusok hierarchiája

Nemcsak hagyhatja, hogy az eredeti aszimmetrikus algoritmus konstruktor generáljon egy kulcspárt, hanem egy már meglévő kulcspárt is lekérhet a CSP által támogatott tárolóból .

CspParameters cp = new CspParameters(); cp.KeyContainerName = Tárolónév; RSACryptoServiceProvider rsa = új RSACryptoServiceProvider(cp);

Szimmetrikus kulcscsere

Az RSAOAEPKeyExchangeFormatter/Deformatter és az RSAPKCS1KeyExchangeFormatter/Deformatter osztályok felelősek a .NET munkamenetkulcs- cseréjéért. Ezek az AsymmetricKeyExchangeFormatter/Deformatter alaposztályokból származnak, amelyek a CreateKeyExchange és DecryptKeyExchange metódusokat biztosítják a munkamenetkulcsok titkosításához, illetve visszafejtéséhez.

RSACryptoServiceProvider rsa1 = új RSACryptoServiceProvider(1024); // kulcs címzettje RSAParameters rp = rsa1.ExportParameters(false); Console.WriteLine("Nyilvános kulcs átadása a feladónak..."); // adja át a nyilvános kulcsot a feladónak //… RSACryptoServiceProvider rsa2 = új RSACryptoServiceProvider(1024); // kulcsküldő Console.WriteLine("A fogadó nyilvános kulcsának importálása..."); // importálja a címzett nyilvános kulcsát rsa2.ImportParameters(rp); AsymmetricKeyExchangeFormatter kf = (AsymmetricKeyExchangeFormatter) new RSAOAEPKeyExchangeFormatter(rsa2); bájt[] kulcs = új bájt[16]; // 128 bites kulcs bájt[] enckey = kf.CreateKeyExchange(kulcs); Console.WriteLine("Titkosított munkamenetkulcs küldése a fogadónak..."); // átadja a titkosított munkamenet kulcsát a címzettnek //… AsymmetricKeyExchangeDeformatter kd = (AsymmetricKeyExchangeDeformatter) new RSAOAEPKeyExchangeDeformatter(rsa1); // A kulcs visszafejtése bájt[] deckey = kd.DecryptKeyExchange(enckey); for(int i = 0; i < 16 ; i++) if (deckey[i] != kulcs[i]) { Console.WriteLine("A kulcscsere sikertelen "); } Console.WriteLine("A kulcscsere sikerült ");

Hash algoritmusok

A Cryptography névtér tartalmazza a HashAlgorithm alaposztályt és a származtatott osztályokat, amelyek támogatják az MD5 , SHA1 , SHA256 , SHA384 és SHA512 algoritmusokat . Az MD5 algoritmus 128 bites , míg az SHA1  160 bites hash - t ad . Az SHA algoritmusok más verzióinak nevében szereplő számok az általuk létrehozott hashek hosszának felelnek meg. Minél nagyobb a hash , annál megbízhatóbb az algoritmus, és annál nehezebb feltörni. Mindezek az algoritmusok két változatban valósulnak meg: felügyelt és nem felügyelt kódon alapulnak.

HashAlqorithm
| —KeyedHashAlgorithm
| |— HMACSHA1
| |— MACtripleDES
|— MD5
| |— MD5CryptoServiceProvider
|— SHA1
| |— SHA1CryptoServiceProvider
| |— SHA1Managed
|— SHA256
| |— SHA256 Kezelt
|— SHA384
| |— SHA384 Kezelt
|— SHA512
| |— SHA512 Kivonatolási
algoritmusok menedzselt hierarchiája

A kivonat kiszámításához csak létre kell hoznia a hash algoritmus osztály egy példányát, és meg kell hívnia a túlterhelt ComputeHash metódust, amely a HashAlgorithmtól örökli:

FileStream fsData = new FileStream("sajatadat.txt",FájlHode.Megnyitás, FileAccess.Read); Byte[] kivonat; SHA512Kezelt oSHA = new SHA512Managed(kivonat - oSHA.ComputeHash(fsData)); fsKey.Close()

Itt a ComputeHash metódus egy Stream objektumot ad át, de elfogad egy bájttömböt is. A Cryptography névtérnek van egy absztrakt KeyedHashAlgorithm osztálya is. A HMACSHA1 és MACtripleDES osztályokban megvalósított, a KeyedHashAlgorithm-ből származó algoritmusok lehetővé teszik az üzenet hitelesítési kód ( MAC ) generálását. A MAC segítségével megállapítható, hogy a nem biztonságos kommunikációs csatornán továbbított adatok módosultak-e – feltéve, hogy a küldő és a címzett is megosztott titkos kulcsot használ.

Digitális aláírás

Az RSACryptoServiceProvider és DSACryptoServiceProvider osztály SignHash metódusa egy speciális algoritmussal létrehozott adatkivonat aláírását számítja ki . A kivonatolási algoritmus második paraméterként kerül átadásra azonosítóként, amely a MapNameToOID függvény segítségével számítható ki. Az RSACryptoServiceProvider esetében ez az SHA1 és MD5, a DSACryptoServiceProvider esetében pedig csak az SHA1.

rsaCSP.SignHash(hashedData, CryptoConfig.MapNameToOID("SHA1"));

Az RSAPKCS1SignatureFormatter/Deformatter és a DSASignatureFormatter/Deformatter osztályok digitális aláírást hoznak létre . Mindkét osztálypár az AsymmetricSignatureFormatter/Deformatter osztályokból származik, amelyek szabványos felületet biztosítanak a digitális aláírás létrehozásához és ellenőrzéséhez – a CreateSignature és VerifySignature metódusokból. A digitális aláírás kiszámítása vagy ellenőrzése előtt a SetHashAlgorithm meghívásával feltétlenül állítsa be a folyamatban használt kivonatolási algoritmust. Az RSAPKCS1SignatureFormatter két kivonatolási algoritmust ismer – az MD5-öt és az SHA1-et, míg a DSASignatureFormatter – csak az SHA1-et.

// RSA digitális aláírás létrehozása AszimmetrikusSignatureFormatter sf; sf = (AsymmetricSignatureFormatter) new RSAPKCS1SignatureFormatter(rsa); // formázó létrehozása sf.SetHashAlgorithm("MD5"); // kivonatolási algoritmus kiválasztása sig = sf.CreateSignature(Hash); // aláírás létrehozása (a hash-t már korábban ki kell számítani) //ellenőrizze az RSA digitális aláírást AszimmetrikusSignatureDeformatter df; df = (AsymmetricSignatureDeformatter) new RSAPKCS1SignatureDeformatter(rsa); // deformáló létrehozása df.SetHashAlgorithm("MD5"); if (df.VerifySignature(Hash, sig)) // az aláírás ellenőrzése { // az aláírás helyes } más { // az aláírás érvénytelen }

Lásd még

Jegyzetek

Irodalom

  • Yu. E. Kuptsevich. Programozói almanach, 4. kötet. Biztonság a Microsoft .NET-ben. - M . : Kiadó és kereskedőház "Russian Edition", 2004. - 304 p. - ISBN 5-7502-0184-8.

Linkek