.NET Frameworkin salauspalvelut

Johdanto

.NET Framework sisältää joukon salauspalveluita, jotka laajentavat samanlaisia ​​Windows -palveluita CryptoAPI :n kautta . System.Security.Cryptography -nimiavaruus tarjoaa ohjelmallisen pääsyn useisiin salauspalveluihin, joita sovellukset voivat käyttää tietojen salaamiseen ja salauksen purkamiseen , tietojen eheyden varmistamiseen sekä digitaalisten allekirjoitusten ja sertifikaattien käsittelyyn.

Nimitilan kryptografia

Ylimmällä tasolla kryptografian nimiavaruus voidaan jakaa neljään pääosaan (taulukko 1). Tämän tilan päätarkoitus on tarjota luokille algoritmeja toimintoihin, kuten salaukseen ja tiivistykseen. Nämä algoritmit toteutetaan laajennettavan kuvion (pattern) perusteella, joka sisältää kaksi periytymistasoa.

Hierarkian yläosassa on abstrakti perusluokka (kuten AsymmetricAlgorithm tai HashAlgorithm), jonka nimi vastaa algoritmin tyyppiä. Tällaisesta luokasta peritään abstrakti toisen tason luokka, joka tarjoaa julkisen käyttöliittymän tämän algoritmin käyttämiseen. Esimerkiksi SHA1 (Secure Hash Algorithm) on HashAlgoritmista johdettu luokka , joka sisältää SHA1-algoritmille ominaisia ​​menetelmiä ja ominaisuuksia. Lopuksi itse algoritmin toteutus johdetaan toisen tason luokasta; asiakassovellus luo ja käyttää sen ilmentymää . Tällä tasolla toteutus voi olla hallittua, hallitsematonta tai molempia.

Elementti Kuvaus
Salausalgoritmit Joukko luokkia, joita käytetään toteuttamaan symmetrisiä ja epäsymmetrisiä salaus- ja hajautusalgoritmeja
Apukurssit Luokat, jotka tarjoavat satunnaislukujen generoinnin, muunnokset, vuorovaikutuksen CryptoAPI -tallennustilan kanssa ja itse salauksen suoratoistomallin perusteella
X.509-sertifikaatit System.Security.Сryptograph-nimiavaruudessa määritellyt luokat. X509 Sertifikaatit ja edustavat digitaalisia varmenteita
XML digitaaliset allekirjoitukset System.Cryptography.Xml-nimiavaruudessa määritellyt luokat, jotka edustavat digitaalisia allekirjoituksia XML - dokumenteissa

Tab. 1. Kryptografian nimitilan peruselementit

Hallitsemattomiin toteutuksiin liitetään yleensä pääte "CryptoServiceProvider" (esim. SHA1CryptoServiceProvider) osoittamaan, että toteutuksen tarjoaa Cryptographic Service Provider ( CSP ), joka on asennettu käyttöjärjestelmätasolla ja toimii CryptoAPI -kääreenä .

Hallittujen toteutusten nimissä on "Managed"-liite (esimerkiksi SHA1Managed). Tällaiset toteutukset eivät ole riippuvaisia ​​CryptoAPI :sta ja sisältävät vain hallittua koodia.

Alkuperäiset rakentajat asettavat objektin parametrit aina kohtuullisiin ja turvallisiin arvoihin (jos mahdollista) luodessaan jotakin konkreettisista luokista. Joten epäsymmetriset salausalgoritmit, jotka perustuvat julkisen avaimen salaukseen, luovat satunnaisen avainparin ja symmetriset salausalgoritmit generoivat satunnaisen avaimen ja alustusvektorin (IV); ne kuitenkin säätävät automaattisesti ominaisuuksia, kuten Mode ja Padding. Lisäksi toisen tyypin algoritmit yrittävät käyttää "pysyviä" arvoja oletuksena.

System.Security.Cryptography-nimiavaruuden toinen pääluokkajoukko sisältää sekä luokat , joita todella käytetään tietojen salauksessa ja salauksen purkamisessa, että erilaisia ​​apuluokkia . Tämä nimiavaruus sisältää esimerkiksi abstraktin luokan RandomNumberGenerator, josta RNGCryptoServiceProvider-, ToBase64Transform- ja FromBase64Transform- luokat peritään (käytetään vastaavissa datamuunnoksissa).

Salausnimiavaruudessa ei ole vain salausalgoritmeja, vaan se sisältää myös alinimitilan, X509Certificates. Jälkimmäinen yhdistää vain kolme luokkaa, jotka on suunniteltu toimimaan Authenticode X.509 v.3 -varmenteilla. X509Certificate-luokka tarjoaa CreateFromCertFile- ja CreateFromSignedFile-staattiset menetelmät varmenteen luomiseen:

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

Cryptography-nimiavaruudessa on myös alinimiavaruus , XML , jota .NET Framework -turvajärjestelmä käyttää XML-objektien digitaaliseen allekirjoittamiseen luonnoksen WSC Specification for XML Signature Syntax and Processing ( http://www.w3.org/ ) mukaisesti. TR/2000/WD-xmldsig-core-20000228/ ).

Salausalgoritmit

Symmetriset algoritmit

On olemassa useita tapoja muodostaa lohkosalauksia. Yksinkertaisin ja intuitiivisin tapa on jakaa lähdeteksti sopivan kokoisiksi lohkoiksi ja sitten kohdistaa jokaiseen lohkoon erikseen salausmuunnos. Tätä lohkosalauksen käyttötapaa kutsutaan elektroniseksi koodikirjaksi (ECB). Sen suurin haittapuoli on, että samat selkeän tekstin lohkot salattuna antavat samat salatekstilohkot, ja tämä voi suuresti helpottaa vastustajan murtamista. Siksi ECB-tilaa ei suositella salaamaan tekstiä, jotka ovat pidempiä kuin yksi lohko. Tällaisissa tapauksissa on parempi käyttää yhtä tiloista, jotka yhdistävät eri lohkot toisiinsa.

Oletusarvoisesti CryptoAPI käyttää lohkosalauksia CBC-tilassa (Cipher block chaining). Tässä tilassa salauksen aikana seuraava selkeän tekstin lohko yhdistetään ensin salatekstin edelliseen lohkoon (käyttäen bittikohtaista XOR:ta), ja sitten tuloksena oleva bittisekvenssi syötetään lohkosalaukseen. Tuloksena olevaa salatekstilohkoa käytetään seuraavan lohkon salaamiseen. Aivan ensimmäinen selvätekstilohko on myös yhdistettävä johonkin bittisarjaan, mutta "edellistä salatekstilohkoa" ei ole vielä olemassa; siksi suljetun silmukan salaustilat edellyttävät yhden lisäparametrin käyttöä - sitä kutsutaan alustusvektoriksi (IV - alustusvektori). IV on ei-salainen binääriarvo, jonka koko on yhtä suuri kuin salauslohkon pituus. Uuden avaimen luomiseksi sinun on kutsuttava GenerateKey-menetelmä ja alustusvektorille GenerateIV-menetelmä. Esimerkiksi Microsoftin salaustoimittajan tukeman RC2-algoritmin lohkokoko on 64 bittiä (8 tavua).

DESCryptoServiceProvider mDES; mDES = uusi DESCryptoServiceProvider(); // Luo uusi avain ja IV satunnaisesti mDES.GenerateKey(); mDES.GenerateIV();

SymmetricAlgoritm
|— AES
| |— AESCryptoServiceProvider
| |— AES-hallittu
|— DES
| |— DESCryptoServiceProvider
|— RC2
| |— RC2CryptoServiceProvider
|— Rijndael
| |— RijndaelManaged
|— TripleDES
| |— TripieDESCryptoServiceProvider
Symmetric Algorithms -hierarkia

SymmetricAlgorithm on abstrakti perusluokka, josta muut algoritmikohtaiset luokat perivät. Tuettuja symmetrisiä algoritmeja ovat Data Encryption Standard (DES), RC2, Rijndael, Advanced Encryption Standard (AES) ja Triple Data Encryption Standard (TripleDES). Jokainen algoritmi sisältää SymmetricAlgorithm- pohjaisen abstraktin luokan, kuten DES, ja kantapohjaisen hallitun tai palveluntarjoajan luokan, kuten DESCryptoServiceProvider. KeySize- ja BlockSize-ominaisuuksien avulla voit määrittää avaimen pituuden ja datalohkon koon (bitteinä), jotka voidaan salata tai purkaa yhdellä toiminnolla.

RijndaelManaged-luokan käyttäminen:

RijndaelManaged oEnc = new RijndaelManaged(); int i; StringstrKey = Merkkijono.Tyhjä; StringstrlV = Merkkijono.Tyhjä; 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 tukee tietovirtoihin perustuvaa ohjelmointimallia. System.lO.Streamista johdetut stream- luokat edustavat tietoja eri varastoista (tekstitiedostot, XML - asiakirjat, MSMQ -viestit, muisti ja verkko) ja antavat sinun lukea tietoja vastaavista varastoista tai kirjoittaa niihin. Tämä toiminnallisuus perustuu CryptoStream-luokkaan, joka on peräisin System.IO.Streamista ja toimii stream-mallina kryptografisille muunnoksille.

DESCryptoServiceProvider mDES = new DESCryptoServiceProvider(); FileStream fsOutput = new FileStream("temp.dat", FileMode.Create, FileAccess.Write); Tavu[] arInput = uusi tavu[320]; //… // Luo DES-salaus tästä esiintymästä ICryptoTransform desEncript = mDES.CreateEncryptor(); // Luo CryptoStream, joka muuntaa tiedostovirran // DES-salauksen avulla CryptoStream sCrypto = uusi CryptoStream(fsOutput, desEncrypt, CryptoStreamMode.Write); // Kirjoita salattu tiedosto sCrypto.Write(arInput, 0, arInput.length); sCrypto.Close(); fsOutput.Close();

Epäsymmetristä salausta käytetään pienten tietomäärien salaamiseen, joten CryptoStreamia ei käytetä epäsymmetrisen salauksen kanssa.

Epäsymmetrinen salaus (julkisen avaimen salaus)

Tunnettuja epäsymmetrisiä algoritmeja ovat Digital Signature Algorithm (DSA) ja RSA. Nämä algoritmit johdetaan lopulta abstrakteista luokista DSA ja RSA, jotka puolestaan ​​ovat peräisin AsymmetricAlgoritmista. Koska nämä algoritmit ovat erittäin monimutkaisia, ne tarvitsevat auttajaluokkia, jotka on johdettu esimerkiksi AsymmetricKeyExchangeFormatterista ja AsymmetricSignatureFormatterista.

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

AsymmetricKeyExchangeFormatter
|— RSAOAEPKeyExchangeFormatter
|— RSAPKCS1KeyExchangeFormatter

AsymmetricKeyExchangeDeformatter
|— RSAOAEPKeyExchangeDeformatter
|— RSAPKCS1KeyExchangeDeformatter

AsymmetricKeySignatureFormatter
|—RSAOAEPSignatureFormatter
| —RSAPKCS1SignatureFormatter

AsymmetricSignatureDeformatter
|— RSAOAEPSignatureDeformatter
|— RSAPKCS1SignatureDeformatter
Epäsymmetristen algoritmien hierarkia

Sen lisäksi, että voit antaa alkuperäisen epäsymmetrisen algoritmin rakentajan luoda avainparin, voit myös noutaa jo olemassa olevan avainparin CSP :n tukemasta varastosta .

CspParameters cp = new CspParameters(); cp.KeyContainerName = SäilönNimi; RSACryptoServiceProvider rsa = uusi RSACryptoServiceProvider(cp);

Symmetrinen avainten vaihto

RSAOAEPKeyExchangeFormatter/Deformatter- ja RSAPKCS1KeyExchangeFormatter/Deformatter-luokat vastaavat istuntoavainten vaihdosta .NET :ssä. Ne on johdettu AsymmetricKeyExchangeFormatter/Deformatter-perusluokista, jotka tarjoavat CreateKeyExchange- ja DecryptKeyExchange-menetelmät istuntoavainten salaamiseen ja salauksen purkamiseen.

RSACryptoServiceProvider rsa1 = uusi RSACryptoServiceProvider(1024); // avaimen vastaanottaja RSAParameters rp = rsa1.ExportParameters(false); Console.WriteLine("Lähettäjälle välitetään julkista avainta..."); // välittää julkisen avaimen lähettäjälle //… RSACryptoServiceProvider rsa2 = uusi RSACryptoServiceProvider(1024); // avaimen lähettäjä Console.WriteLine("Tuodaan vastaanottimen julkista avainta..."); // tuoda vastaanottajan julkinen avain rsa2.ImportParameters(rp); AsymmetricKeyExchangeFormatter kf = (AsymmetricKeyExchangeFormatter) uusi RSAOAEPKeyExchangeFormatter(rsa2); tavu[] avain = uusi tavu[16]; // 128-bittinen avain tavu[] enckey = kf.CreateKeyExchange(avain); Console.WriteLine("Lähetetään salattua istuntoavainta vastaanottajalle..."); // välittää salatun istuntoavaimen vastaanottajalle //… AsymmetricKeyExchangeDeformatter kd = (AsymmetricKeyExchangeDeformatter) uusi RSAOAEPKeyExchangeDeformatter(rsa1); // Pura avaimen salaus tavu[] deckey = kd.DecryptKeyExchange(enckey); for(int i = 0; i < 16 ; i++) if (deckey[i] != avain[i]) { Console.WriteLine("Avaimenvaihto epäonnistui "); } Console.WriteLine("Avaimen vaihto onnistui");

Hash-algoritmit

Cryptography-nimiavaruus sisältää HashAlgorithm-perusluokan ja johdetut luokat, jotka tukevat MD5- , SHA1- , SHA256- , SHA384- ja SHA512-algoritmeja . MD5-algoritmi antaa 128-bittisen hajautusarvon , kun taas SHA1 antaa  160-bittisen hajautusarvon. Muiden SHA-algoritmien versioiden nimissä olevat numerot vastaavat niiden luomien tiivisteiden pituutta. Mitä suurempi hash on, sitä luotettavampi algoritmi on ja sitä vaikeampi on murtaa. Kaikki nämä algoritmit on toteutettu kahdessa versiossa: perustuen hallituun ja hallitsemattomaan koodiin.

HashAlqorithm
| —KeyedHashAlgorithm
| |— HMACSHA1
| |— MACtripleDES
|— MD5
| |— MD5CryptoServiceProvider
|— SHA1
| |— SHA1CryptoServiceProvider
| |— SHA1Managed
| — SHA256
| |— SHA256Hallinnoitu
|— SHA384
| |— SHA384Hallinnoitu
|— SHA512
| |— SHA512Hallittu
hajautusalgoritmien hierarkia

Laskeaksesi tiivistelmän sinun tarvitsee vain luoda hash-algoritmiluokan esiintymä ja kutsua sen ylikuormitettu ComputeHash-menetelmä, joka perii HashAlgoritmilta:

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

Tässä ComputeHash-menetelmälle välitetään Stream-objekti, mutta se hyväksyy myös tavutaulukon. Cryptography-nimiavaruudessa on myös abstrakti KeyedHashAlgorithm-luokka. HMACSHA1- ja MACTripleDES-luokissa toteutetut algoritmit , jotka on johdettu KeyedHashAlgorithmista, mahdollistavat MAC (Message Authentication Code ) -koodin luomisen. MAC:n avulla voit määrittää, onko suojaamattoman viestintäkanavan kautta lähetettyä dataa muutettu - edellyttäen, että sekä lähettäjä että vastaanottaja käyttävät jaettua salaista avainta.

Digitaalinen allekirjoitus

RSACryptoServiceProvider- ja DSACryptoServiceProvider-luokkien SignHash-menetelmä laskee allekirjoituksen erikoisalgoritmilla luodulle datahajautusarvolle . Hajautusalgoritmi välitetään toisena parametrina tunnisteena, joka voidaan laskea MapNameToOID-funktiolla. RSACryptoServiceProviderille tämä on SHA1 ja MD5, ja DSACryptoServiceProviderille vain SHA1.

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

RSAPKCS1SignatureFormatter/Deformatter- ja DSASignatureFormatter/Deformatter-luokat luovat digitaalisen allekirjoituksen . Molemmat luokkaparit on peritty AsymmetricSignatureFormatter/Deformatter-luokista, jotka tarjoavat vakiorajapinnan digitaalisen allekirjoituksen luomiseen ja tarkistamiseen - CreateSignature- ja VerifySignature-menetelmistä. Ennen kuin lasket tai vahvistat digitaalisen allekirjoituksen, muista asettaa prosessissa käytettävä hajautusalgoritmi kutsumalla SetHashAlgorithm. RSAPKCS1SignatureFormatter ymmärtää kahta hajautusalgoritmia - MD5 ja SHA1, kun taas DSASignatureFormatter - vain SHA1.

// Luo digitaalinen RSA-allekirjoitus EpäsymmetrinenSignatureFormatter sf; sf = (EpäsymmetrinenSignatureFormatter) uusi RSAPKCS1SignatureFormatter(rsa); // luo muotoilija sf.SetHashAlgorithm("MD5"); // valitse hajautusalgoritmi sig = sf.CreateSignature(Hash); // luo allekirjoitus (tiiviste on laskettava jo aiemmin) //tarkista RSA-digitaalinen allekirjoitus EpäsymmetrinenSignatureDeformatter df; df = (AsymmetricSignatureDeformatter) uusi RSAPKCS1SignatureDeformatter(rsa); // luo deformaattorin df.SetHashAlgorithm("MD5"); if (df.VerifySignature(Hash, sig)) // tarkista allekirjoitus { // allekirjoitus on oikein } muu { // allekirjoitus on virheellinen }

Katso myös

Muistiinpanot

Kirjallisuus

  • Yu. E. Kuptsevich. Ohjelmoijan almanakka, osa 4. Suojaus Microsoft .NET:ssä. - M . : Kustannus- ja kauppatalo "Russian Edition", 2004. - 304 s. - ISBN 5-7502-0184-8.

Linkit