Hoofdstuk 12 - Les 3

Symmetrische sleutel encryptie, betekend geheimee sleutel encryptie. Deze methode gebruikt een geheime sleutel om zowel de data te encrypten als te decrypten. De ge-encrypte tekst wordt cipher text genoemd. Een nadeel van deze methode is dat beide partijen de gehieme sleutel moeten weten.

De meeste cryptie functionaliteit zit in de System.Security.Cryptography namespace.
  • RijndaelManaged - Omdat deze en AesManaged fully managed impementaties zijn, kunnen zij in partially trusted omgevingen gebruikt worden
  • AesManaged - Ook bekend als Advanced Encryption Standard. In essentie de Rijndael algoritme met een vaste block grootte en iteratie teller. Werkt hetzelfde als de rijndael class, maar met gelimiteerde blocks tot 128 bits
  • DES - Data Encryption Standard. Maakt gebruik van korte sleutels. Dat maakt het kwetsbaar en daarom zou het vermeden moeten worden
  • TripleDES - In essentie brengt het de DES algoritme drie keeer toe
  • RC2 - Een encryptie standaard die ontworpen is om DES te vervangen met en variabele sleutel grootte.
Alle bovenstaande classes erven van de System.Security.Cryptography.SymmetricAlgorithm class en hebben daarom allen de volgende properties:
  • BlockSize - Zet de block grootte in bits. De block grootte is het aantal bits die het algoritme verwerkt op een bepaald moment en kan normaal gesproken worden genegeerd als applicaties encryptie gebruiken.
  • FeedbackSize - Zet de feedback grootte in bits. De feedback grootte bepaalt 1 aspect van de algoritme's encryptie techniek. Als ontwikkelaar kan deze property vergeten worden
  • IV - Zet de Initilization Vector (IV) voor de symmetrische algoritme. Net zoals de key property moeten de encryptor en decryptor dezelfde waarde hebben.
  • Key - Zet de sleutel voor de symmetrische encryptie. Sleutels worden automatisch gegenereerd als deze niet handmatig worden gezet.
  • KeySize
  • legalblocksize
  • Mode>
  • Padding
En dit zijn de overgeërfde methode:
  • CreateDecryptor
  • CreateEncryptor
  • GenerateVI
  • GenerateKey
  • ValidKeySize
De System.Security.Cryptography.Rfc2898DeriveBytes class kan gebruikt worden om een password te veranderen in een sleutel. Deze class heeft 3 waarden nodig om een sleutel te maken: een zoutwaarde, een IV en het aantal iteraties die nodig is om de sleutel te maken. Als een van de waarde veranderd, dan verandert ook de sleutel.
string password = "fooBar";

// Maak een algoritme object
RijndaelManaged rm = new RijndaelManaged();

// Erf de sleutel en gebruik hem om het algoritme te bepalen
byte[] salt = Encoding.ASCII.GetBytes("Dit is de zoutwaarde");
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(password, salt);
rm.Key = key.GetBytes(rm.KeySize / 8);
rm.IV = key.GetBytes(rm.BlockSize / 8);


Asymmetrische encryptie, ook bekend als public-key encryptie, overwint het nadeel van symmetrische encryptie: de encryptor en decryptor hebben beide niet dezelfde sleutel nodig. Asymmetrische encryptie is gebaseerd op sleutel paren. In 1 paar is 1 sleutel public en 1 private. Berichten die encrypted zijn met de public key kunnen enkel decrypt worden met de private key. Deze encryptie is wel langzamer dan symmetrische encryptie, maar wel veiliger. Een veel gebruikte manier van asymmetrische encryptie is om een symmetrische sleutel en VI te encrypten en te verzenden. Deze methode wordt toegepast bij HTTPS en SSL.

Het .NET framework biedt twee classes aan om te werken met asymmetrische encryptie. Beide zijn gebaseerd op de System.Security.Cryptography.AsymmetricAlgorithm class. Deze class heeft geen bruikbare methodes. In plaats daarvan zijn de methodes geimplmenteerd in de classes die erven van deze class:
  • RSACryptoServiceProvider - Wordt gebruikt voor alle asymmetrische encryptie en decryptie. RSA is genoemd naar de achternamen van de ontwikkelaars: Ronald Rivers, Adi Shamir en Leonard Adleman
  • DSACryptoServiceProvider - wordt gebruikt voor het digitaal ondertekenen van berichten.


RSA sleutels zijn meer complex dan symmetrische sleutels. RSA sleutels worden parameters genoemd en worden vertegenwoordigd door een RSAParameters structure.
  • D - de private key
  • Exponent - Het korte gedeelte van de public key
  • Modules - Het lange gedeelte van de public key
Een public key te exporteren dient gebruik gemaakt te worden van de RSACryptoServiceProvider.ExportParameters methode. Geef false als parameter mee om alleen de public key te exporteren; true om zowel de public als private key te exporteren.

CSP - Crypto Service Provider

Sleutels kunnen ook worden geexporteerd naar de CSP door gebruik te maken van CryptoAPI key storage.
// Maak een CSP parameter object
CspParameters csp = new CspParameters();
csp.KeyContainerName = "voorbeeldje";

// Maak een instantie van de RSA algoritme
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);

// Geef aan dat de key in de csp moet worden opgeslagen
rsa.PersistKeyInCsp = true;

// Maak een nieuw RSAParameter object met de private key
RSAPArameters privateKey = rsa.ExportParameters(true);

// Toon de private key
foreach(byte b in privateKey.D)
{
Console.Write(b.ToString("X2") + " ");
}
Voor encrypten en decrypten van berichten moet gebruik gemaakt worden van RSACryptoServiceProvider.Encrypt en Decrypt methode. Beide hebben 2 parameters nodig:
  1. byte[] rgb - Een array van bytes die het bericht bevat om te encrypten of decrypten
  2. bool fOAEP - indien true, encryptie en decryptie gebruiken Optimal Asymmetric Encryption Padding (OAEP). Dit wordt enkel ondersteund op Windows XP. Indien false, dan wordt Public Key Cryptography Standard (PKCS) data padding gebruikt.


Data kan worden beschermd door gebruik te maken van hashes. Een hash is een totaalcontrole (checksum) die uniek is voor een specifiek bestand of stuk data. Een hash kan gebruikt worden om te kijken of een bestand is gewijzigd nadat de laatste hash is gegenereerd.

Een hash kan niet worden gedecodeerd. Dit wordt vaak toegepast bij het opslaan van wachtwoorden.

Het .NET framework bevat 6 nonkeyed hash algoritmes en twee keyed hash algoritmes.
  • MD5 - The Message Digest 5 (MD5) algoritme. Hash size is 128 bits
  • RIPEMD160 - The Message Digest 160 (MD160). Hash size is 160 bits
  • SHA1 - The Secure Hash Algoritm (SHA1). Hash grootte 160 bits.
  • SHA 256 - SHA met een 256 bits grootte
  • SHA384
  • SHA512
Keyed hash algoritmes zorgen ervoor dat de hash alleen kan worden aangepast als de zender en ontvanger dezelfde sleutel gebruiken.
  • HMACSHA1 - Hash-based Message Authentication Code (HMAC) maakt gebruik van SHA1. Wordt gebruikt om te kijken of er met een bericht gerotzooid is over een onbeveiligde lijn. Maakt een hash code met een lengte van 20 bytes en een sleutel van elke grootte
  • MACTripleDES - Message Authentication Code (MAC) gebruik makend van TripleDES. Zelfde als HMACSHA1, maar maakt sleutels met een lengte van 8,16,24 bytes en hash codes met een lengte van 8 bytes.

Een nonkeyed has aanmaken:
// Maak een hash object
MD5 hash = new MD5CryptoServiceProvider();

// Sla de te hashen data op in een array
FileStream file = new FileStream(args[0], FileMode.Open, FileAccess.Read);
Binaryreader reader = new BinaryReader(file);

// Maak de hash
hash.ComputeHash(reader.ReadBytes((int)file.length));

// Haal de hash array op
Console.WriteLine(Convert.ToBase64String(hash.Has));
Een keyed hash aanmaken:
byte[] salt = Encoding.ASCEE.GetBytes("mijn zout");
Rfc2898DeriveBytes pwKey = new Rfc2898DeriveBytes(args[0], salt);
byte[] secretKey = pwKey.GetBytes(16);

// Maak hash agoritme object
HMACSHA1 hash = new HMACSHA1(secretKey);

// Sla data op die moet worden gehashed
FileStream file = new FileStream(args[1], FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(file);

// Maak de hash
hash.ComputeHash(reader.GetBytes((int)file.Length));

// Toon hash
Console.WriteLine(Convert.ToBase64String(hash.Hash));


Een digitale handtekening bewijst dat het gemaakt is door iemand die de private key bezit. Tevens authenticeren zij ook de identiteit van de afzender. Een handtekening kan door iedereen geverifieerd worden omdat iedereen toegang heeft tot de publieke sleutel.

Met DSACryptoServiceProvider en RSACryptoServiceProvider kunnen digitale handtekeningen gezet en geverifieerd worden. Beide implementeren dezelfcde vier methoden
  1. SignHash - Genereert een digitale handtekening gebaseerd op de hash van het bestand
  2. SignData - Genereert een digitale handtekening door eerst de hash van het bestand te maken en vervolgens de handtekening gebaseerd op de hash.
  3. VerifyHash - Verifieert een handtekening gebaseerd op de hash van het bestand
  4. VerifyData - Verifieert een handtekening gebaseerd op de gehele inhoud van het bestand.

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren