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.
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:
RSA sleutels zijn meer complex dan symmetrische sleutels. RSA sleutels worden parameters genoemd en worden vertegenwoordigd door een RSAParameters structure.
CSP - Crypto Service Provider
Sleutels kunnen ook worden geexporteerd naar de CSP door gebruik te maken van CryptoAPI key storage.
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.
Een nonkeyed has aanmaken:
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
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.
- 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
- CreateDecryptor
- CreateEncryptor
- GenerateVI
- GenerateKey
- ValidKeySize
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
CSP - Crypto Service Provider
Sleutels kunnen ook worden geexporteerd naar de CSP door gebruik te maken van CryptoAPI key storage.
Voor encrypten en decrypten van berichten moet gebruik gemaakt worden van RSACryptoServiceProvider.Encrypt en Decrypt methode. Beide hebben 2 parameters nodig:// 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") + " ");
}
- byte[] rgb - Een array van bytes die het bericht bevat om te encrypten of decrypten
- 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
- 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:
Een keyed hash 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));
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
- SignHash - Genereert een digitale handtekening gebaseerd op de hash van het bestand
- SignData - Genereert een digitale handtekening door eerst de hash van het bestand te maken en vervolgens de handtekening gebaseerd op de hash.
- VerifyHash - Verifieert een handtekening gebaseerd op de hash van het bestand
- VerifyData - Verifieert een handtekening gebaseerd op de gehele inhoud van het bestand.
Reacties
Een reactie posten