.NET Framework inkluderar en uppsättning kryptografiska tjänster som utökar liknande Windows -tjänster genom CryptoAPI . Namnutrymmet System.Security.Cryptography ger programmatisk åtkomst till en mängd olika kryptografiska tjänster som applikationer kan använda för att kryptera och dekryptera data , säkerställa dataintegritet och bearbeta digitala signaturer och certifikat.
På den högsta nivån kan namnutrymmet Kryptografi delas upp i fyra huvuddelar (tabell 1). Huvudsyftet med detta utrymme är att förse klasser med algoritmer för operationer som kryptering och hash. Dessa algoritmer implementeras på basis av ett förlängningsbart mönster (mönster), som inkluderar två nivåer av arv.
Överst i hierarkin finns en abstrakt basklass (som AsymmetricAlgorithm eller HashAlgorithm) vars namn motsvarar algoritmtypen. Från en sådan klass ärvs en abstrakt klass på andra nivån som tillhandahåller ett offentligt gränssnitt för att använda denna algoritm. Till exempel är SHA1 (Secure Hash Algorithm) en klass som härrör från HashAlgorithm och innehåller metoder och egenskaper som är specifika för SHA1-algoritmen. Slutligen härleds implementeringen av själva algoritmen från klassen på andra nivån; det är dess instans som skapas och används av klientapplikationen. På den här nivån kan implementeringen hanteras, ohanterad eller båda.
Element | Beskrivning |
---|---|
Krypteringsalgoritmer | En uppsättning klasser som används för att implementera symmetrisk och asymmetrisk kryptering och hashalgoritmer |
Hjälparklasser | Klasser som ger generering av slumptal, transformationer, interaktion med CryptoAPI- lagringen och själva kryptering baserat på streamingmodellen |
X.509-certifikat | Klasser definierade i namnområdet System.Security.Сryptograph. X509Certifikat och representerar digitala certifikat |
Digitala XML -signaturer | Klasser definierade i System.Cryptography.Xml-namnområdet som representerar digitala signaturer i XML- dokument |
Flik. 1. Grundläggande element i namnområdet Kryptografi
Ohanterade implementeringar suffixas vanligtvis med "CryptoServiceProvider" (säg, SHA1CryptoServiceProvider) för att indikera att implementeringen faktiskt tillhandahålls av en kryptografisk tjänsteleverantör ( CSP ) som är installerad på operativsystemnivå och fungerar som en CryptoAPI-omslutning .
Namn på hanterade implementeringar inkluderar suffixet "Managed" (till exempel SHA1Managed). Sådana implementeringar förlitar sig inte på CryptoAPI och innehåller endast hanterad kod.
När man instansierar en av betongklasserna ställer de ursprungliga konstruktörerna alltid objektets parametrar till rimliga och säkra värden (om möjligt). Så, asymmetriska krypteringsalgoritmer baserade på publik nyckelkryptografi genererar ett slumpmässigt nyckelpar, och symmetriska krypteringsalgoritmer genererar en slumpmässig nyckel och initialiseringsvektor (IV); Men de justerar automatiskt egenskaper som Mode och Padding. Dessutom försöker algoritmer av den andra typen använda "beständiga" värden som standard.
Den andra huvuduppsättningen klasser i System.Security.Cryptography-namnutrymmet inkluderar både de klasser som faktiskt används i processen att kryptera och dekryptera data, såväl som olika hjälpklasser . Detta namnutrymme innehåller till exempel den abstrakta klassen RandomNumberGenerator, från vilken klasserna RNGCryptoServiceProvider, ToBase64Transform och FromBase64Transform ärvs (används i motsvarande datatransformationer).
Namnutrymmet Kryptografi tillhandahåller inte bara krypteringsalgoritmer, utan innehåller också ett underordnat namnområde, X509Certificates. Den senare kombinerar endast tre klasser designade för operationer med Authenticode X.509 v.3-certifikat. Klassen X509Certificate tillhandahåller de statiska metoderna CreateFromCertFile och CreateFromSignedFile för att instansiera ett certifikat:
X509Certificate c = X509Certificate.CreateFromCertFile("myCert.cer"); Console.WriteLine(c.GetName); Console.WriteLine(c.GetPublicKeyString); Console.WriteLine(c.GetSerialNumberString); Console.WriteLine(c.GetExpirationDateString);Namnutrymmet Kryptografi har också ett underordnat namnområde , XML , som används av säkerhetssystemet .NET Framework för att digitalt signera XML-objekt i enlighet med utkastet till WSC-specifikationen för XML-signatursyntax och bearbetning ( http://www.w3.org/ TR/ 2000/WD-xmldsig-core-20000228/ ).
Det finns flera sätt att skapa blockchiffer. Det enklaste och mest intuitiva sättet är att dela upp källtexten i block av lämplig storlek och sedan separat utsätta varje block för en krypteringstransformation. Detta sätt att använda blockchiffer kallas för en elektronisk kodbok (ECB). Dess största nackdel är att samma block av klartext när de krypteras ger samma block av chiffertext, och detta kan avsevärt underlätta motståndarens uppgift att knäcka. Därför rekommenderas inte ECB-läget för chiffrering av texter som är längre än ett block. I sådana fall är det bättre att använda ett av lägena som förbinder olika block med varandra.
Som standard använder CryptoAPI blockchiffer i cipher block chaining-läge (CBC). I detta läge, under kryptering, kombineras först nästa block i klartexten med det föregående blocket i chiffertexten (med hjälp av en bitvis XOR), och sedan matas den resulterande bitsekvensen in i blockchifferet. Det resulterande blocket med chiffertext används för att kryptera nästa block. Det allra första klartextblocket måste också kombineras med någon sekvens av bitar, men det finns inget "föregående chiffertextblock" ännu; därför kräver slutna krypteringslägen användning av ytterligare en parameter - den kallas initieringsvektorn (IV - initieringsvektor). IV är ett icke-hemligt binärt värde, vars storlek är lika med längden på chifferblocket. För att generera en ny nyckel måste du anropa GenerateKey-metoden och för initialiseringsvektorn GenerateIV-metoden. Till exempel, för RC2-algoritmen som stöds av Microsofts underliggande kryptografiska leverantör är blockstorleken 64 bitar (8 byte).
DESCryptoServiceProvider mDES; mDES = ny DESCryptoServiceProvider(); // Generera ny nyckel och IV slumpmässigt mDES.GenerateKey(); mDES.GenerateIV();
Symmetrisk algoritm
|— AES
| |— AESCryptoServiceProvider
| |— AES Managed
|— DES
| |— DESCryptoServiceProvider
|— RC2
| |— RC2CryptoServiceProvider
|— Rijndael
| |— RijndaelManaged
|— TripleDES
| |— TripieDESCryptoServiceProvider
Hierarki av symmetriska algoritmer
SymmetricAlgorithm är en abstrakt basklass från vilken andra algoritmspecifika klasser ärver. Symmetriska algoritmer som stöds inkluderar Data Encryption Standard (DES), RC2, Rijndael, Advanced Encryption Standard (AES) och Triple Data Encryption Standard (TripleDES). Varje algoritm inkluderar en SymmetricAlgorithm-härledd abstrakt klass, såsom DES, och en bashärledd hanterad eller tjänsteleverantörsklass, såsom DESCryptoServiceProvider. Egenskaperna KeySize och BlockSize låter dig definiera nyckellängden och storleken på datablocket (i bitar) som kan krypteras eller dekrypteras i en enda operation.
Använda klassen 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 stöder en programmeringsmodell baserad på strömmar. Strömklasserna , härledda från System.lO.Stream, representerar data från olika butiker (textfiler, XML - dokument, MSMQ- meddelanden, minne och nätverk) och låter dig läsa data från eller skriva till motsvarande butiker. Denna funktion är baserad på CryptoStream-klassen, som härrör från System.IO.Stream och fungerar som en strömmodell för kryptografiska transformationer.
DESCryptoServiceProvider mDES = ny DESCryptoServiceProvider(); FileStream fsOutput = new FileStream("temp.dat", FileMode.Create, FileAccess.Write); Byte[] arInput = ny Byte[320]; //… // Skapa en DES Encryptor från denna instans ICryptoTransform desEncript = mDES.CreateEncryptor(); // Skapa en CryptoStream som konverterar filströmmen // med DES-kryptering CryptoStream sCrypto = ny CryptoStream(fsOutput, desEncrypt, CryptoStreamMode.Write); // Skriv den krypterade filen sCrypto.Write(arInput, 0, arInput.length); sCrypto.Close(); fsOutput.Close();Asymmetrisk kryptering används för att kryptera små mängder data, så CryptoStream används inte med asymmetrisk kryptering.
Välkända asymmetriska algoritmer inkluderar Digital Signature Algorithm (DSA) och RSA. Dessa algoritmer härrör i slutändan från de abstrakta klasserna DSA och RSA, som i sin tur härrör från AsymmetricAlgorithm. Eftersom dessa algoritmer är mycket komplexa behöver de hjälpklasser härledda från till exempel AsymmetricKeyExchangeFormatter och AsymmetricSignatureFormatter.
Asymmetrisk algoritm
|— DSA
| |— DSACryptoServiceProvider
|— RSA
| |—RSACryptoServiceProvider
AsymmetricKeyExchangeFormatter
|— RSAOAEPKeyExchangeFormatter
|— RSAPKCS1KeyExchangeFormatter
AsymmetricKeyExchangeDeformatter
|— RSAOAEPKeyExchangeDeformatter
|— RSAPKCS1KeyExchangeDeformatter
AsymmetricKeySignatureFormatter
|—RSAOAEPSignatureFormatter
|
—RSAPKCS1SignatureFormatter
AsymmetricSignatureDeformatter
|— RSAOAEPSignatureDeformatter
|— RSAPKCS1SignatureDeformatter
Hierarki av asymmetriska algoritmer
Du kan inte bara låta den ursprungliga asymmetriska algoritmkonstruktören generera ett nyckelpar, utan du kan också hämta ett redan existerande nyckelpar från det CSP -stödda lagret .
CspParameters cp = new CspParameters(); cp.KeyContainerName = Behållarnamn; RSACryptoServiceProvider rsa = ny RSACryptoServiceProvider(cp);Klasserna RSAOAEPKeyExchangeFormatter/Deformatter och RSAPKCS1KeyExchangeFormatter/Deformatter är ansvariga för utbyte av sessionsnyckel i .NET . De härrör från basklasserna AsymmetricKeyExchangeFormatter/Deformatter, som tillhandahåller metoderna CreateKeyExchange och DecryptKeyExchange för att kryptera respektive dekryptera sessionsnycklar.
RSACryptoServiceProvider rsa1 = ny RSACryptoServiceProvider(1024); // nyckelmottagare RSAParametrar rp = rsa1.ExportParameters(false); Console.WriteLine("Passerar offentlig nyckel till avsändaren..."); // skicka den publika nyckeln till avsändaren //… RSACryptoServiceProvider rsa2 = ny RSACryptoServiceProvider(1024); // nyckelavsändare Console.WriteLine("Importerar mottagarens publika nyckel..."); // importera mottagarens publika nyckel rsa2.ImportParameters(rp); AsymmetricKeyExchangeFormatter kf = (AsymmetricKeyExchangeFormatter) ny RSAOAEPKeyExchangeFormatter(rsa2); byte[] nyckel = ny byte[16]; // 128 bitars nyckel byte[] enckey = kf.CreateKeyExchange(nyckel); Console.WriteLine("Skickar krypterad sessionsnyckel till mottagaren..."); // skicka den krypterade sessionsnyckeln till mottagaren //… AsymmetricKeyExchangeDeformatter kd = (AsymmetricKeyExchangeDeformatter) ny RSAOAEPKeyExchangeDeformatter(rsa1); // Dekryptera nyckeln byte[] decky = kd.DecryptKeyExchange(enckey); for(int i = 0; i < 16 ; i++) if (decky[i] != nyckel[i]) { Console.WriteLine("Nyckelbyte misslyckades "); } Console.WriteLine("Nyckelutbyte lyckades ");Namnutrymmet Kryptografi innehåller basklassen HashAlgorithm och härledda klasser som stöder algoritmerna MD5 , SHA1 , SHA256 , SHA384 och SHA512 . MD5-algoritmen ger en 128 bitars hash , medan SHA1 ger en 160 bitars hash. Siffrorna i namnen på andra versioner av SHA-algoritmer motsvarar längden på hasharna de skapar. Ju större hash , desto mer tillförlitlig algoritm och desto svårare är den att knäcka. Alla dessa algoritmer implementeras i två versioner: baserad på hanterad och ohanterad kod.
HashAlqoritm
| —KeyedHashAlgorithm
| |— HMACSHA1
| |— MACTripleDES
|— MD5
| |— MD5CryptoServiceProvider
|— SHA1
| |— SHA1CryptoServiceProvider
| |— SHA1Managed
|— SHA256
| |— SHA256Managed
|— SHA384
| |— SHA384Managed
|— SHA512
| |— SHA512Managed
Hierarki av hashalgoritmer
För att beräkna sammandraget behöver du bara skapa en instans av hashalgoritmklassen och anropa dess överbelastade ComputeHash-metod, som ärver från HashAlgorithm:
FileStream fsData = new FileStream("mydata.txt",FileHode.Open, FileAccess.Read); Byte[] digest; SHA512Managed oSHA = new SHA512Managed(digest - oSHA.ComputeHash(fsData)); fsKey.Close()Här skickas ComputeHash-metoden ett Stream-objekt, men den accepterar också en byte-array. Namnutrymmet Kryptografi har också en abstrakt KeyedHashAlgorithm-klass. Algoritmerna som implementeras i klasserna HMACSHA1 och MACTripleDES, härledda från KeyedHashAlgorithm, tillåter generering av en meddelandeautentiseringskod ( MAC ). Med hjälp av MAC kan du avgöra om data som överförs över en osäker kommunikationskanal har modifierats - förutsatt att både avsändaren och mottagaren använder en delad hemlig nyckel.
SignHash-metoden för klasserna RSACryptoServiceProvider och DSACryptoServiceProvider beräknar en signatur för en datahash som skapats med en speciell algoritm. Hashingalgoritmen skickas som den andra parametern som en identifierare, som kan beräknas med funktionen MapNameToOID. För RSACryptoServiceProvider är detta SHA1 och MD5, och för DSACryptoServiceProvider är det endast SHA1.
rsaCSP.SignHash(hashedData, CryptoConfig.MapNameToOID("SHA1"));Klasserna RSAPKCS1SignatureFormatter/Deformatter och DSASignatureFormatter/Deformatter skapar en digital signatur . Båda klassparen ärvs från klasserna AsymmetricSignatureFormatter/Deformatter, som tillhandahåller ett standardgränssnitt för att skapa och verifiera en digital signatur - metoderna CreateSignature och VerifySignature. Innan du beräknar eller verifierar en digital signatur, se till att ställa in hashalgoritmen som kommer att användas i processen genom att anropa SetHashAlgorithm. RSAPKCS1SignatureFormatter förstår två hashalgoritmer - MD5 och SHA1, medan DSASignatureFormatter - endast SHA1.
// skapa RSA digital signatur AsymmetricSignatureFormatter sf; sf = (AsymmetricSignatureFormatter) new RSAPKCS1SignatureFormatter(rsa); // skapa en formatterare sf.SetHashAlgorithm("MD5"); // välj hashalgoritm sig = sf.CreateSignature(Hash); // skapa en signatur (hash måste redan beräknas tidigare) //verifiera RSA digital signatur AsymmetricSignatureDeformatter df; df = (AsymmetricSignatureDeformatter) new RSAPKCS1SignatureDeformatter(rsa); // skapa en deformerare df.SetHashAlgorithm("MD5"); if (df.VerifySignature(Hash, sig)) // verifiera signaturen { // signaturen är korrekt } annan { // signaturen är ogiltig }.NETTO | |
---|---|
Genomföranden | |
Arkitektur | |
Infrastruktur | |
Microsofts språk | |
Andra språk | |
Windows Foundations | |
Komponenter | |
Jämförelser |
|
Framtida teknologier | |
Informationsresurser |