.NET Framework Crypto Services

Introducere

.NET Framework include un set de servicii criptografice care extind servicii Windows similare prin CryptoAPI . Spațiul de nume System.Security.Cryptography oferă acces programatic la o mare varietate de servicii criptografice pe care aplicațiile le pot folosi pentru a cripta și decripta datele , pentru a asigura integritatea datelor și pentru a procesa semnăturile și certificatele digitale.

Criptografia spațiului de nume

La cel mai înalt nivel, spațiul de nume Criptography poate fi împărțit în patru părți principale (Tabelul 1). Scopul principal al acestui spațiu este de a oferi claselor algoritmi pentru operațiuni precum criptare și hashing. Acești algoritmi sunt implementați pe baza unui model (pattern) extensibil, care include două niveluri de moștenire.

În vârful ierarhiei se află o clasă de bază abstractă (cum ar fi AsymmetricAlgorithm sau HashAlgorithm) al cărei nume corespunde tipului de algoritm. Dintr-o astfel de clasă, se moștenește o clasă abstractă de nivel al doilea care oferă o interfață publică pentru utilizarea acestui algoritm. De exemplu, SHA1 (Secure Hash Algorithm) este o clasă derivată din HashAlgorithm și conține metode și proprietăți specifice algoritmului SHA1. În cele din urmă, implementarea algoritmului în sine este derivată din clasa de nivel al doilea; este instanța sa care este creată și utilizată de aplicația client. La acest nivel, implementarea poate fi gestionată, negestionată sau ambele.

Element Descriere
Algoritmi de criptare Un set de clase utilizate pentru a implementa algoritmi de criptare și hashing simetrici și asimetrici
Cursuri de ajutor Clase care oferă generare de numere aleatorii, transformări, interacțiune cu stocarea CryptoAPI și criptarea în sine bazată pe modelul de streaming
Certificate X.509 Clase definite în spațiul de nume System.Security.Сryptograph. X509Certificate și reprezentând certificate digitale
Semnături digitale XML Clase definite în spațiul de nume System.Cryptography.Xml care reprezintă semnături digitale în documentele XML

Tab. 1. Elemente de bază ale spațiului de nume Cryptography

Implementările negestionate sunt de obicei sufixate cu „CryptoServiceProvider” (să zicem, SHA1CryptoServiceProvider) pentru a indica faptul că implementarea este furnizată de fapt de un furnizor de servicii criptografice ( CSP ) care este instalat la nivel de sistem de operare și acționează ca un wrapper CryptoAPI .

Numele implementării gestionate includ sufixul „Gestionat” (de exemplu, SHA1Managed). Astfel de implementări nu se bazează pe CryptoAPI și conțin doar cod gestionat.

La instanțierea uneia dintre clasele concrete, constructorii originali stabilesc întotdeauna parametrii obiectului la valori rezonabile și sigure (dacă este posibil). Deci, algoritmii de criptare asimetrică bazați pe criptografia cu cheie publică generează o pereche de chei aleatoare, iar algoritmii de criptare simetrică generează o cheie aleatoare și un vector de inițializare (IV); cu toate acestea, ele ajustează automat proprietăți precum Mode și Padding. Mai mult, algoritmii de al doilea tip încearcă să folosească valori „persistente” în mod implicit.

Al doilea set principal de clase din spațiul de nume System.Security.Cryptography include atât clasele care sunt utilizate efectiv în procesul de criptare și decriptare a datelor, cât și diferite clase de ajutor . Acest spațiu de nume conține, de exemplu, clasa abstractă RandomNumberGenerator, din care sunt moștenite clasele RNGCryptoServiceProvider, ToBase64Transform și FromBase64Transform (utilizate în transformările de date corespunzătoare).

Spațiul de nume Cryptography nu numai că oferă algoritmi de criptare, dar conține și un spațiu de nume copil, X509Certificates. Acesta din urmă combină doar trei clase concepute pentru operațiuni cu certificate Authenticode X.509 v.3. Clasa X509Certificate oferă metodele statice CreateFromCertFile și CreateFromSignedFile pentru instanțierea unui certificat:

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

Spațiul de nume Cryptography are, de asemenea, un spațiu de nume copil , XML , care este utilizat de sistemul de securitate .NET Framework pentru a semna digital obiecte XML în conformitate cu proiectul Specificației WSC pentru sintaxa și procesarea semnăturilor XML ( http://www.w3.org/ TR/ 2000/WD-xmldsig-core-20000228/ ).

Algoritmi de criptare

Algoritmi simetrici

Există mai multe moduri de a forma coduri bloc. Cea mai simplă și intuitivă modalitate este de a împărți textul sursă în blocuri de dimensiunea corespunzătoare și apoi de a supune fiecare bloc separat unei transformări de criptare. Acest mod de utilizare a cifrurilor bloc se numește carte electronică de coduri (ECB). Principalul său dezavantaj este că aceleași blocuri de text simplu, atunci când sunt criptate, vor oferi aceleași blocuri de text cifrat, iar acest lucru poate facilita foarte mult sarcina de spargere a adversarului. Prin urmare, modul ECB nu este recomandat pentru cifrarea textelor care depășesc un bloc. În astfel de cazuri, este mai bine să utilizați unul dintre modurile care conectează diferite blocuri între ele.

În mod implicit, CryptoAPI utilizează cifrurile bloc în modul de înlănțuire a blocurilor de cifrat (CBC). În acest mod, în timpul criptării, următorul bloc al textului simplu este mai întâi combinat cu blocul anterior al textului cifrat (folosind un XOR pe biți), iar apoi secvența de biți rezultată este introdusă în cifrul bloc. Blocul rezultat de text cifrat este folosit pentru a cripta următorul bloc. Primul bloc de text simplu trebuie, de asemenea, combinat cu o secvență de biți, dar nu există încă un „bloc de text cifrat anterior”; prin urmare, modurile de criptare în buclă închisă necesită utilizarea unui alt parametru - se numește vector de inițializare (IV - vector de inițializare). IV este o valoare binară non-secretă, a cărei dimensiune este egală cu lungimea blocului de cifrare. Pentru a genera o cheie nouă, trebuie să apelați metoda GenerateKey, iar pentru vectorul de inițializare, metoda GenerateIV. De exemplu, pentru algoritmul RC2 acceptat de furnizorul criptografic de bază al Microsoft , dimensiunea blocului este de 64 de biți (8 octeți).

DESCryptoServiceProvider mDES; mDES = nou DESCryptoServiceProvider(); // Generați cheia nouă și IV aleatoriu mDES.GenerateKey(); mDES.GenerateIV();

Algoritm simetric
|— AES
| |— AESCryptoServiceProvider
| |— Gestionat AES
|— DES
| |— DESCryptoServiceProvider
|— RC2
| |— RC2CryptoServiceProvider
|— Rijndael
| |— RijndaelManaged
|— TripleDES
| |—
Ierarhia de algoritmi simetrici TripieDESCryptoServiceProvider

SymmetricAlgorithm este o clasă de bază abstractă de la care moștenesc alte clase specifice algoritmului . Algoritmii simetrici acceptați includ Standard de criptare a datelor (DES), RC2, Rijndael, Standard de criptare avansată (AES) și Standard de criptare triplă a datelor (TripleDES). Fiecare algoritm include o clasă abstractă derivată din SymmetricAlgorithm, cum ar fi DES, și o clasă gestionată sau de furnizor de servicii derivată din bază, cum ar fi DESCryptoServiceProvider. Proprietățile KeySize și BlockSize vă permit să definiți lungimea cheii și dimensiunea blocului de date (în biți) care poate fi criptat sau decriptat într-o singură operațiune.

Folosind clasa RijndaelManaged:

RijndaelManaged oEnc = nou 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 acceptă un model de programare bazat pe fluxuri. Clasele de flux , derivate din System.lO.Stream, reprezintă date din diferite magazine (fișiere text, documente XML , mesaje MSMQ , memorie și rețea) și vă permit să citiți sau să scrieți date din magazinele corespunzătoare. Această funcționalitate se bazează pe clasa CryptoStream, care derivă din System.IO.Stream și servește ca model de flux pentru transformările criptografice.

DESCryptoServiceProvider mDES = nou DESCryptoServiceProvider(); FileStream fsOutput = new FileStream("temp.dat", FileMode.Create, FileAccess.Write); Byte[] arInput = nou Byte[320]; //… // Creați un DES Encryptor din această instanță ICryptoTransform desEncript = mDES.CreateEncryptor(); // Creați un CryptoStream care convertește fluxul de fișiere // folosind criptarea DES CryptoStream sCrypto = new CryptoStream(fsOutput, desEncrypt, CryptoStreamMode.Write); // Scrieți fișierul criptat sCrypto.Write(arInput, 0, arInput.length); sCrypto.Close(); fsOutput.Close();

Criptarea asimetrică este utilizată pentru a cripta cantități mici de date, astfel încât CryptoStream nu este utilizat cu criptarea asimetrică.

Criptare asimetrică (criptare cu cheie publică)

Algoritmii asimetrici bine-cunoscuți includ algoritmul de semnătură digitală (DSA) și RSA. Acești algoritmi sunt derivați în cele din urmă din clasele abstracte DSA și RSA, care, la rândul lor, derivă din AsymmetricAlgorithm. Deoarece acești algoritmi sunt foarte complexi, au nevoie de clase helper derivate, de exemplu, din AsymmetricKeyExchangeFormatter și AsymmetricSignatureFormatter.

Algoritm asimetric
|— DSA
| |— DSACryptoServiceProvider
|— RSA
| |—RSACryptoServiceProvider

AsymmetricKeyExchangeFormatter
|— RSAOAEPKeyExchangeFormatter
|— RSAPKCS1KeyExchangeFormatter

AsymmetricKeyExchangeDeformatter
|— RSAOAEPKeyExchangeDeformatter
|— RSAPKCS1KeyExchangeDeformatter

AsymmetricKeySignatureFormatter
|—RSAOAEPSignatureFormatter
| —RSAPKCS1SignatureFormatter

AsymmetricSignatureDeformatter
|— RSAOAEPSignatureDeformatter
|— RSAPKCS1SignatureDeformatter
Ierarhia algoritmilor asimetrici

Nu numai că puteți lăsa constructorul original de algoritm asimetric să genereze o pereche de chei, dar puteți, de asemenea, să preluați o pereche de chei deja existentă din magazinul susținut de CSP .

CspParameters cp = new CspParameters(); cp.KeyContainerName = ContainerName; RSACryptoServiceProvider rsa = nou RSACryptoServiceProvider(cp);

Schimb de chei simetrice

Clasele RSAOAEPKeyExchangeFormatter/Deformatter și RSAPKCS1KeyExchangeFormatter/Deformatter sunt responsabile pentru schimbul de chei de sesiune în .NET . Acestea sunt derivate din clasele de bază AsymmetricKeyExchangeFormatter/Deformatter, care oferă metodele CreateKeyExchange și DecryptKeyExchange pentru criptarea și, respectiv, decriptarea cheilor de sesiune.

RSACryptoServiceProvider rsa1 = nou RSACryptoServiceProvider(1024); // destinatarul cheii RSAParameters rp = rsa1.ExportParameters(false); Console.WriteLine("Se transmite cheia publică expeditorului..."); // transmite cheia publică expeditorului //… RSACryptoServiceProvider rsa2 = nou RSACryptoServiceProvider(1024); // expeditorul cheii Console.WriteLine("Importăm cheia publică a receptorului..."); // import cheia publică a destinatarului rsa2.ImportParameters(rp); AsymmetricKeyExchangeFormatter kf = (AsymmetricKeyExchangeFormatter) RSAOAEPKeyExchangeFormatter nou (rsa2); tasta octet[] = octet nou[16]; // cheie pe 128 de biți byte[] enckey = kf.CreateKeyExchange(cheie); Console.WriteLine("Se trimite cheia de sesiune criptată către receptor..."); // transmiteți cheia de sesiune criptată destinatarului //… AsymmetricKeyExchangeDeformatter kd = (AsymmetricKeyExchangeDeformatter) nou RSAOAEPKeyExchangeDeformatter(rsa1); // Decriptează cheia byte[] deckey = kd.DecryptKeyExchange(enckey); for(int i = 0; i < 16 ; i++) if (deckey[i] != key[i]) { Console.WriteLine(" Schimbul cheilor a eșuat"); } Console.WriteLine(" Schimbul de chei a reușit");

Algoritmi hash

Spațiul de nume Cryptography conține clasa de bază HashAlgorithm și clase derivate care acceptă algoritmii MD5 , SHA1 , SHA256 , SHA384 și SHA512 . Algoritmul MD5 dă un hash de 128 de biți , în timp ce SHA1 oferă un  hash de 160 de biți. Numerele din numele altor versiuni ale algoritmilor SHA corespund lungimii hashurilor pe care le creează. Cu cât hash -ul este mai mare , cu atât algoritmul este mai fiabil și cu atât este mai greu de spart. Toți acești algoritmi sunt implementați în două versiuni: bazate pe cod gestionat și neadministrat.

HashAlqorithm
| —KeyedHashAlgorithm
| |— HMACSHA1
| |— MACTtripleDES
|— MD5
| |— MD5CryptoServiceProvider
|— SHA1
| |— SHA1CryptoServiceProvider
| |— SHA1Managed
|— SHA256
| |— SHA256 Gestionat
|— SHA384
| |— SHA384 Gestionat
|— SHA512
| |— SHA512Ierarhie gestionată
a algoritmilor de hashing

Pentru a calcula rezumatul , trebuie doar să creați o instanță a clasei de algoritm hash și să apelați metoda ComputeHash supraîncărcată, care moștenește de la HashAlgorithm:

FileStream fsData = new FileStream("mydata.txt",FileHode.Open, FileAccess.Read); Byte[] digest; SHA512Managed oSHA = nou SHA512Managed(digest - oSHA.ComputeHash(fsData)); fsKey.Close()

Aici, metodei ComputeHash primește un obiect Stream, dar acceptă și o matrice de octeți. Spațiul de nume Cryptography are, de asemenea, o clasă abstractă KeyedHashAlgorithm. Algoritmii implementați în clasele HMACSHA1 și MACTripleDES, derivate din KeyedHashAlgorithm, permit generarea unui Cod de autentificare a mesajelor ( MAC ). Folosind MAC-ul, puteți determina dacă datele transmise pe un canal de comunicare nesigur au fost modificate - cu condiția ca atât expeditorul, cât și destinatarul să utilizeze o cheie secretă partajată.

Semnătura digitală

Metoda SignHash a claselor RSACryptoServiceProvider și DSACryptoServiceProvider calculează o semnătură pentru un hash de date creat folosind un algoritm special. Algoritmul de hashing este transmis ca al doilea parametru ca identificator, care poate fi calculat folosind funcția MapNameToOID. Pentru RSACryptoServiceProvider, acesta este SHA1 și MD5, iar pentru DSACryptoServiceProvider este doar SHA1.

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

Clasele RSAPKCS1SignatureFormatter/Deformatter și DSASignatureFormatter/Deformatter creează o semnătură digitală . Ambele perechi de clase sunt moștenite din clasele AsymmetricSignatureFormatter/Deformatter, care oferă o interfață standard pentru crearea și verificarea unei semnături digitale - metodele CreateSignature și VerifySignature. Înainte de a calcula sau de a verifica o semnătură digitală, asigurați-vă că setați algoritmul de hashing care va fi utilizat în proces apelând SetHashAlgorithm. RSAPKCS1SignatureFormatter înțelege doi algoritmi de hashing - MD5 și SHA1, în timp ce DSASignatureFormatter - doar SHA1.

// creează semnătură digitală RSA AsymmetricSignatureFormatter sf; sf = (AsymmetricSignatureFormatter) nou RSAPKCS1SignatureFormatter(rsa); // creează un formatator sf.SetHashAlgorithm("MD5"); // selectează algoritmul de hashing sig = sf.CreateSignature(Hash); // creează o semnătură (hash-ul trebuie deja calculat mai devreme) //verifică semnătura digitală RSA AsymmetricSignatureDeformatter df; df = (AsymmetricSignatureDeformatter) nou RSAPKCS1SignatureDeformatter(rsa); // creează un deformator df.SetHashAlgorithm("MD5"); if (df.VerifySignature(Hash, sig)) // verifică semnătura { // semnătura este corectă } altfel { // semnătura este nevalidă }

Vezi și

Note

Literatură

  • Yu. E. Kuptsevici. Almanahul programatorului, volumul 4. Securitate în Microsoft .NET. - M . : Editura și casa comercială „Ediția Rusă”, 2004. - 304 p. - ISBN 5-7502-0184-8.

Link -uri