Todotnet Blog

Met de blik op Visual Studio 2005 en verder...

  Home :: Contact :: Syndication  :: Login
  69 Posts :: 3 Stories :: 27 Comments :: 32 Trackbacks

News

Onlangs is een memorystick met geheim defensiemateriaal zoek geraakt. Het ministerie van Defensie heeft zelf meegedeeld dat het bij de Koninklijke Marechaussee aangifte heeft gedaan van vermissing van een 'memory stick met gerubriceerde informatie'. Wat voor informatie er op het geheugenapparaat staat, is niet bekend. Eerder kwam op een soortgelijke wijze ook al informatie over de veiligheidsdienst AIVD op straat. In december nog bleek een AIVD-medewerker diskettes met vertrouwelijke informatie in een lease-auto te hebben achtergelaten. In 2004 verloor een medewerker van de dienst zijn laptop in de trein.

De eerste reactie van vele IT-ers is: “heeft men nog nooit van encryptie gehoord?” En inderdaad zou encryptie in staat zijn om het feitelijke materiaal vrij onleesbaar te maken voor hen die de sleutel niet hebben. Nu zijn weinig versleutelingsmethoden onkraakbaar, maar met nieuwe encryptie-technieken, zoals de Advance Encryption Standard (AES, ook bekend als Rijndael) duurt het wel even. In dit artikel wordt getoond hoe AES kan worden toegepast in het versleutelen van documenten. Gebruik van een combinatie van symmetrische als asymmetrische technieken maken versleuteling zowel veilig als praktisch.

Cryptografie

De System.Security.Cryptography namespace bevat cryptografische methoden voor het versleutelen en ontsleutelen van gegevens. Daarnaast zit er nog een reeks aan andere mogelijkheden in, zoals hashing, random getallen generatie en authenticatie van berichten.

Cryptografie beveiligt gegevens tegen het inzien of aanpassen en biedt zo een veilige manier om gegevens te versturen over normaalgesproken onveilige kanalen. De informatie kan versleuteld worden, verzonden en weer ontsleuteld aan de andere kant van de lijn. Als een derde partij het bericht onderschept, is het niet eenvoudig om achter de inhoud van het bericht te komen.

Als twee partijen met elkaar willen communiceren over een open verbinding, zorgen deze twee partijen er dus voor dat hun interactie niet te begrijpen is voor iemand die, al dan niet toevallig, staat mee te luisteren. Als de twee partijen ook nog eens ver van elkaar verwijderd zijn, moet partij A(rie) er zeker van zijn dat het bericht van partij B(renda) niet zo maar door iemand is aangepast gedurende de verzending. Bovendien moet Arie er zeker van zijn dat hij echt met Brenda praat en niet tegen iemand die zich voordoet als Brenda.

Cryptografie wordt dus gebruikt om de volgende doelen te bereiken.

  • Vertrouwlijkheid: om de identiteit of gegevens te beschermen tegen lezen.
  • Integriteit: om gegevens te beschermen tegen aanpassingen.
  • Authenticatie: om er zeker van te zijn dat de gegevens van een bepaalde partij afkomstig is.

Om deze doelen te bereiken kunnen Arie en Brenda een reeks van algoritmen en technieken gebruiken om een versleutelingsafspraak te maken.

Deze technieken zijn:

Versleuteling met een geheime sleutel (symmetrische cryptografie) – de gegevens worden getransformeerd om te voorkomen dat ze gelezen worden door ongewenste partijen. Deze vorm van encryptie gebruikt een enkele, gedeelde, geheime sleutel om gegevens te versleutelen en ontsleutelen.

Versleuteling met een publieke sleutel (asymmetrische cryptografie) – de gegevens worden getransformeerd om te voorkomen dat ze gelezen worden door ongewenste partijen, maar gebruikt een publieke en een privaat sleutelpaar om gegevens te versleutelen en ontsleutelen.

Ondertekening (cryptografic signing) – zorgt er voor dat de gegevens van een bepaalde partij afkomstig zijn door deze te ondertekenen met een unieke digitale handtekening. Hier wordt ook van hash functies gebruik gemaakt.

Cryptografische hashes – vertaalt een gegevensreeks van een willekeurige lengte naar een bytereeks van een vaste lengte. Een hash is statistisch gezien uniek; elke unieke reeks van twee bytes levert een andere hash-waarde op.

De classes die beschikbaar zijn in het .NET Framework kunnen in dezelfde categorieën worden opgedeeld: symmetrische cryptografie, assymetrische cryptografie, signing en hashes.

Techniek

Classes

Versleuteling met een geheime sleutel (symmetrisch)

DESCryptoServiceProvider

RijndaelManaged

TripleDESCryptoServiceProvider

 

Versleuteling met een publiek/privaat sleutelpaar (asymmetrisch)

RSACryptoServiceProvider

DSACryptoServiceProvider

 

Digitale handtekeningen

 

DSACryptoServiceProvider

RSACryptoServiceProvider

 

Hashes

HMAC (dit is een abstracte class, afgeleiden hiervan zijn bijvoorbeeld: HMACMD5, HMACSHA512, HMACRIPEMD160)

SHA1CryptoServiceProvider

 

In dit artikel wordt niet ingegaan om de mogelijkheden van Hashes en digitale handtekeningen. Daarentegen doorlopen we het proces van versleutelen en ontsleutelen van bestanden waarbij gebruikt wordt gemaakt van zowel een assymmetrisch als een symmetrisch encryptie component. Door deze combinatie zijn we in staat om op een veilige manier bestanden naar elkaar te sturen zonder dat een derde partij, althans een partij die niet over de benodigde private key beschikt, de inhoud van deze documenten kan ontcijferen.

Encryptie: symmetrisch en asymmetrisch

Een praktische toepassing van encryptie is het versleutelen van bestanden. De bijlage onderaan dit artikel bevat de broncode om deze versleuteling uit te voeren. De meest relevante code wordt hieronder besproken.

De volgende figuren geven het algemene proces van versleuteling en ontsleuteling weer.

figuur 1: het encryptieproces 


figuur 2: ontcijferingsproces

De class waarin de encryptie en decryptie plaatsvindt, kent een factory-methode om een nieuwe RSACryptoServiceProvider te leveren. Deze RSACryptoServiceProvider is in staat assymmetrisch te versleutelen met behulp van het RSA algoritme. Het algoritme werd in 1977 ontworpen door Ron Rivest, Adi Shamir en Len Adleman (vandaar de afkorting RSA).

  109         public static RSACryptoServiceProvider CreateNew()

  110         {  

  111             return new RSACryptoServiceProvider();

  112         }

De RSACryptoServiceProvider levert een publieke en private sleutel voor het encrypten en decrypten van gegevens. In de voorbeeldapplicatie die als bijlage is te downloaden, wordt de mogelijkheid geboden om de private sleutel op een te kiezen locatie op te slaan. Die locatie kan zeer goed een USB stick zijn. Als de USB stick met de private sleutel niet beschikbaar is, is men niet in staat om de gegevens te ontcijferen. Er zijn tegenwoordig ook USB sticks beschikbaar met een vingerafdrukbeveiliging. Door de private sleutel op een dergelijke USB stick op te slaan worden vertrouwelijke documenten nog beter beschermd.

Je kunt je afvragen waarom we niet direct met de publieke sleutel uit de RSACryptoServiceProvider een bestand kunnen encrypten. Dat is wel mogelijk, maar het RSA algoritme is veel trager dan een symmetrisch encryptie-algoritme. Voor bestanden van enige omvang zou RSA te traag werken. Vandaar dat we kiezen voor een symmetrisch encryptiecomponent in de vorm van AES. AES staat voor Advanced Encryption Standard en geldt als de opvolger van de "Data Encryption Standard" (DES).

AES is een subset van het Rijndael-algoritme waarbij de blokgrootte 128-bits is, en de sleutel 128, 192 of 256 bits. Rijndael zelf kan alle blokgrootten en sleutels aan die een veelvoud zijn van 32-bit met een minimum van 128-bit en een maximum van 256-bit.

De volgende code instantieert de RijndaelManaged class zodat we deze kunnen gebruiken om het document symmetrisch te versleutelen.

  128             RijndaelManaged CryptoAlgo = new RijndaelManaged();

  129             CryptoAlgo.KeySize = KEY_SIZE;

  130             CryptoAlgo.GenerateKey();

  131             CryptoAlgo.GenerateIV();

Het .NET Framework maakt gebruik van een stream-gebaseerd ontwerp voor cryptografie. Voor de transformatie maken we gebruik van een drietal filestreams. We hebben een stream nodig voor het lezen van het oorspronkelijke document (OriginalFile), vervolgens een stream voor het schrijven van het versleutelde bestand en tot slot een voor het feitelijk versleutelen (EncryptedStream). De CryptoStream class is de kern die het echte werk uitvoert en stuurt, via een object dat de ICryptoTransform interface implementeert, de binnenkomende bytes naar de uitgaande FileStream.

  125             // haal een encryptor op voor gebruik in de Encrypted stream

  126             ICryptoTransform encryptor = CryptoAlgo.CreateEncryptor();

  127 

  128             // Encrypt het bestand           

  129             FileStream OriginalFile = new FileStream(fileName, FileMode.Open, FileAccess.Read);

  130             FileStream EncryptedFile = new FileStream(fileName + ".enc", FileMode.Create, FileAccess.Write);

  131             CryptoStream EncryptedStream = new CryptoStream(EncryptedFile, encryptor, CryptoStreamMode.Write);

Zoals we in figuur 1 hebben kunnen zien, nemen we de gebruikte Rijndael sleutel op in het eindbestand. Er zijn twee eigenschappen van belang  voor het maken en gebruiken van Rijndael. Ten eerste de sleutel (Key), en ten tweede de initalisatievector (IV). Het zou niet zo verstandig zijn deze onversleuteld op te nemen. Vandaar dat we deze versleutelen met de RSACryptoServiceProvider.

  133             // Haal de bytestream van Rijndael Key en IV (versleuteld met publieke sleutel)

  134             // om toe te voegen aan het bestand

  135             byte[] EncryptedRijndaelKey = _cryptoService.Encrypt(CryptoAlgo.Key, true);

  136             byte[] EncryptedRijndaelIV = _cryptoService.Encrypt(CryptoAlgo.IV, true);

  137 

  138             // schrijf een header met de Rijndael sleutel gegevens

  139             EncryptedFile.WriteByte(Byte.Parse(EncryptedRijndaelKey.Length.ToString()));

  140             EncryptedFile.WriteByte(Byte.Parse(EncryptedRijndaelIV.Length.ToString()));

  141             EncryptedFile.Write(EncryptedRijndaelKey, 0, EncryptedRijndaelKey.Length);

  142             EncryptedFile.Write(EncryptedRijndaelIV, 0, EncryptedRijndaelIV.Length);

Nu kunnen we de rest van het oorspronkelijke bestand lezen, versleutelen en opslaan.

  144             // Open de stream van het oorspronkelijke bestand en versleutel het           

  145             byte[] b = new byte[1024];

  146 

  147             while (true)

  148             {

  149                 int ReadLength = OriginalFile.Read(b, 0, b.Length);

  150                 if (ReadLength == b.Length)

  151                 {

  152                     EncryptedStream.Write(b, 0, b.Length);

  153                 }

  154                 else

  155                 {

  156                     EncryptedStream.Write(b, 0, ReadLength);

  157                     break;

  158                 }

  159             }

De benodigde stappen voor het ontcijferen van het bestand liggen voor de hand. Om de Rijndael sleutel te kunnen ontcijferen hebben we de private key nodig. Als we deze eenmaal hebben kunnen we met de CryptoStream class en een Decryptor de oorspronkelijke gegevens weer terugkrijgen.

  179         // ontcijfer het bestand en geef de naam van het bestand terug

  180         public string Decrypt(string fileName, string privateKeyFileName, bool keepSource, bool temporary)

  181         {

  182             // haal de AES sleutel op met de private RSA key

  183             if (_cryptoService == null)

  184             {

  185                 string PublicPrivateKeyString = GetString(privateKeyFileName);

  186                 _cryptoService = new RSACryptoServiceProvider();

  187                 _cryptoService.FromXmlString(PublicPrivateKeyString);

  188             }

  189 

  190             string DecryptedFileName = fileName.Replace(".enc", "") + ".dec";

  191 

  192             FileStream EncryptedFile = new FileStream(fileName, FileMode.Open, FileAccess.Read);

  193 

  194             // haal de AES key op uit het document

  195             RijndaelManaged CryptoAlgo = GetEncryptedRijndael(EncryptedFile);

  196 

  197             ICryptoTransform decryptor = CryptoAlgo.CreateDecryptor();

  198             FileStream DecryptedFile = new FileStream(DecryptedFileName, FileMode.Create, FileAccess.Write);

  199             CryptoStream EncryptedStream = new CryptoStream(EncryptedFile, decryptor, CryptoStreamMode.Read);

  200 

  201 

  202             // Open de stream van het versleutelde bestand en ontcijfer het           

  203             byte[] b = new byte[1024];

  204 

  205             while (true)

  206             {

  207                 int ReadLength = EncryptedStream.Read(b, 0, b.Length);

  208                 if (ReadLength == b.Length)

  209                 {

  210                     DecryptedFile.Write(b, 0, b.Length);

  211                 }

  212                 else

  213                 {

  214                     DecryptedFile.Write(b, 0, ReadLength);

  215                     break;

  216                 }

  217             }

  218 

  219             DecryptedFile.Close();

  220             EncryptedFile.Close();

  221             EncryptedStream.Close();

  222 

  223             string ReturningFileName = DecryptedFileName;

  224 

  225             if (!keepSource)

  226             {

  227                 File.Delete(fileName);

  228                 File.Move(DecryptedFileName, fileName);

  229             }

  230 

  231             if (temporary)

  232             {

  233                 FileInfo file = new FileInfo(fileName);

  234 

  235                 ReturningFileName = file.DirectoryName + "\\~" + file.Name;

  236                 if (File.Exists(ReturningFileName))

  237                 {

  238                     ShredFile(ReturningFileName, 5);

  239                     File.Delete(ReturningFileName);

  240 

  241                 }               

  242                 File.Move(DecryptedFileName, ReturningFileName);

  243             }

  244 

  245             return ReturningFileName;

  246         }

In de bijlage bij dit artikel de complete broncode te vinden. Om het gebruik van de CryptoEngine class wat vriendelijker te maken en eens te proberen is er een Windows Forms client gemaakt die de encryptie en decryptie methoden aanroept.


Man-in-the-middle attack

Zowel bij symmetrische als bij asymmetrische encryptiemethoden is het belangrijk hoe de sleutels verspreid worden. Bij de symmetrische methode is de sleutel per definitie publiek, omdat er maar één sleutel is en die sleutel wordt gebruikt voor zowel encryptie als decryptie. Hoe dan ook geldt dat er een manier moet zijn om de publieke sleutel van partij A(rie) aan de ontvangende partij B(renda) kenbaar te maken.

In dit verband moeten we ons bewust zijn van de mogelijkheid van een man-in-the-middle attack. Veronderstel dat Charles de communicatie tussen Arie en Brenda kan onderscheppen. Hij ontvangt dan een publieke sleutel van Arie, maakt zelf een nieuwe publieke en private sleutel en stuurt zijn eigen publieke sleutel naar Brenda, die denkt dat ze de publieke sleutel van Arie heeft ontvangen.


Charles kan zo verdere berichten van Brenda (vercijferd met zijn publieke sleutel) ontvangen, ontcijferen met zijn geheime sleutel, en (eventueel veranderd) weer versleuteld met de eerder ontvangen publieke sleutel naar Arie sturen (Arie denkt dat het bericht rechtstreeks van Brenda komt).

Arie en Brenda merken in beginsel niet dat Charles ertussen zit. Bescherming tegen een dergelijke aanval is meestal gebaseerd op digitale certificaten of andere onderdelen van een publieke sleutel infrastructuur. Een andere oplossing is dat Arie en Brenda de sleutels (of een checksum) vergelijken tijdens een "echte" ontmoeting.

Conclusies

Cryptografie, de kunst om gegevens te beschermen tegen ongeoorloofd inzien, kent vele aspecten. Je kunt cryptografie gebruiken om bestanden te versleutelen, maar ook gegevens die in beweging zijn op een netwerk. Het gebruik van cryptografie maakt het mogelijk om onveilige kanalen wat veiliger te maken en hiermee de integriteit te verhogen.

De cryptografische classes van het .NET framework bevatten veel functionaliteit waardoor je geen wiskundig genie of algoritme expert hoeft te zijn om er gebruik van te maken. Sommige van deze classes zijn simpelweg wrappers rondom de Win32 CryptoAPI, maar anderen zijn gemaakt in pure managed code.

Het wordt steeds belangrijker om op een veilige manier om te gaan met gevoelige gegevens in een applicatie. Door het gebruikt van encryptie zowel symmetrisch als asymmetrisch wordt de mogelijkheid tot ongewenste publicatie van gegevens een stuk lastiger. In het voorbeeld van dit artikel wordt de mogelijkheid geboden om de geheime sleutel op een mobiel opslagapparaat, zoals een USB stick, te plaatsen. Gebruik je eigen fantasie om dit idee verder te nemen en toe te passen in je eigen omgeving.

Meer informatie

Download Broncode (NB: de broncode zit in een Visual Studio 2005 project, maar er zijn geen speciale .NET 2.0 onderdelen gebruikt. De CryptoEngine class kan dus zonder meer ook in een Visual Studio 2003 project worden opgenomen.)

 

posted on Friday, January 27, 2006 9:38 PM

Feedback

# Cryptography in .NET 1/30/2006 8:31 AM ToDotNet


# Cryptography in .NET 9/26/2006 1:33 PM ToDotNet


# Good location, like the color 11/24/2010 4:30 PM Karaoke Free Downloads
"I believe you have imagined about adding some video clips to your weblog posts to maintain your readers more entertained? I indicate I just learn by way of the entire web page here and it was wonderful but considering that I'm extra of a visual learner, I identified that to become much more useful. Properly you must let me understand how it turns out! I love what you people today are carrying out and up as well. This kind of great function and opinions! Preserve up the great work guys. I've added this web site to my blogroll. This can be a cool website thanks for sharing this useful data.! I will check out your web site frequently for some latest post."

--------------------------------------------
my website is
http://coffeecups.mobi

Also welcome you!

# http://onlytopreviews.com 2/11/2011 8:31 PM vizio tv reviews
"Have you ever regarded as including a lot more movies for your blog posts to maintain the readers more entertained? I imply I just go through as a result of the total article of yours and it was really good but because I am more of a visual learner,I observed that for being far more useful. Just my my concept, Excellent good fortune "


Post Feedback

Title:
Name:
Url:
Comments: 
Protected by Clearscreen.SharpHIPEnter the code you see: