Delen via


Cryptografische sleutels

In dit artikel wordt beschreven hoe u standaardfuncties voor sleutelderivatie gebruikt om sleutels af te leiden en hoe u inhoud versleutelt met behulp van symmetrische en asymmetrische sleutels.

Symmetrische sleutels

Symmetrische sleutelversleuteling, ook wel versleuteling van geheime sleutels genoemd, vereist dat de sleutel die wordt gebruikt voor versleuteling ook wordt gebruikt voor ontsleuteling. U kunt een klasse SymmetricKeyAlgorithmProvider gebruiken om een symmetrisch algoritme op te geven en een sleutel te maken of te importeren. U kunt statische methoden in de klasse CryptographicEngine gebruiken om gegevens te versleutelen en ontsleutelen met behulp van het algoritme en de sleutel.

Symmetrische sleutelversleuteling maakt doorgaans gebruik van blokcoderingen en blokcoderingsmodi. Een blokcodering is een symmetrische versleutelingsfunctie die werkt op blokken met vaste grootte. Als het bericht dat u wilt versleutelen langer is dan de bloklengte, moet u een blokcoderingsmodus gebruiken. Een blokcoderingsmodus is een symmetrische versleutelingsfunctie die is gebouwd met behulp van een blokcodering. Het versleutelt tekst zonder opmaak als een reeks blokken met vaste grootte. De volgende modi worden ondersteund voor apps:

  • De ECB-modus (elektronisch codebook) versleutelt elk blok van het bericht afzonderlijk. Dit wordt niet beschouwd als een beveiligde versleutelingsmodus.
  • De CBC-modus (cipher block chaining) maakt gebruik van het vorige coderingsblok om het huidige blok te verdoezelen. U moet bepalen welke waarde moet worden gebruikt voor het eerste blok. Deze waarde wordt de initialisatievector (IV) genoemd.
  • De CCM-modus (teller met CBC-MAC) combineert de CBC-blokcoderingsmodus met een MAC (Message Authentication Code).
  • De GCM-modus (Galois-tellermodus) combineert de tellerversleutelingsmodus met de Galois-verificatiemodus.

Voor sommige modi zoals CBC moet u een initialisatievector (IV) gebruiken voor het eerste coderingsblok. Hier volgen algemene initialisatievectors. U geeft de IV op bij het aanroepen van CryptographicEngine.Encrypt. In de meeste gevallen is het belangrijk dat de IV nooit opnieuw wordt gebruikt met dezelfde sleutel.

  • Vast maakt gebruik van dezelfde IV voor alle berichten die moeten worden versleuteld. Deze actie lekt informatie en het gebruik ervan wordt niet aanbevolen.
  • De teller verhoogt automatisch de IV voor elk blok.
  • Random maakt een pseudorandom IV. U kunt CryptographicBuffer.GenerateRandom gebruiken om de IV te maken.
  • Nonce-Generated gebruikt een uniek nummer voor elk bericht dat moet worden versleuteld. Normaal gesproken is de nonce een aangepast bericht of transactie-ID. De nonce hoeft niet geheim te worden gehouden, maar mag nooit opnieuw worden gebruikt onder dezelfde sleutel.

De meeste modi vereisen dat de lengte van de tekst zonder opmaak exact een veelvoud van de blokgrootte is. Dit vereist meestal dat u de tekst zonder opmaak opvult om de juiste lengte te verkrijgen.

Hoewel blokcijfers blokken van data met een vaste grootte versleutelen, zijn streamcijfers symmetrische encrypties die heldere tekstbits combineren met een pseudorandom bitstroom (genaamd een sleutelstroom) voor het genereren van de cijfertekst. Sommige blok-coderingsmodi, zoals de uitvoerfeedbackmodus (OTF) en de tellermodus (CTR), zetten een blokcode effectief om in een stroomcode. Werkelijke stroomcijfers zoals RC4 werken echter meestal met hogere snelheden dan blokcijfermodi kunnen bereiken.

In het volgende voorbeeld ziet u hoe u de klasse SymmetricKeyAlgorithmProvider gebruikt om een symmetrische sleutel te maken en deze te gebruiken voor het versleutelen en ontsleutelen van gegevens.

Asymmetrische sleutels

Asymmetrische sleutelcryptografie, ook wel openbare-sleutelcryptografie genoemd, maakt gebruik van een openbare sleutel en een persoonlijke sleutel om versleuteling en ontsleuteling uit te voeren. De sleutels zijn verschillend, maar wiskundig gerelateerd. Normaal gesproken wordt de persoonlijke sleutel geheim gehouden en gebruikt om gegevens te ontsleutelen terwijl de openbare sleutel wordt gedistribueerd naar belanghebbenden en wordt gebruikt om gegevens te versleutelen. Asymmetrische cryptografie is ook handig voor het ondertekenen van gegevens.

Omdat asymmetrische cryptografie veel langzamer is dan symmetrische cryptografie, wordt deze zelden gebruikt om grote hoeveelheden gegevens rechtstreeks te versleutelen. In plaats daarvan wordt het meestal op de volgende manier gebruikt om sleutels te versleutelen.

  • Alice vereist dat Bob haar alleen versleutelde berichten stuurt.
  • Alice maakt een persoonlijk/openbaar sleutelpaar, houdt haar persoonlijke sleutel geheim en publiceert haar openbare sleutel.
  • Bob heeft een bericht dat hij naar Alice wil sturen.
  • Bob maakt een symmetrische sleutel.
  • Bob gebruikt zijn nieuwe symmetrische sleutel om zijn bericht te versleutelen naar Alice.
  • Bob gebruikt de openbare sleutel van Alice om zijn symmetrische sleutel te versleutelen.
  • Bob verzendt het versleutelde bericht en de versleutelde symmetrische sleutel naar Alice (enveloppen).
  • Alice gebruikt haar persoonlijke sleutel (van het persoonlijke/openbare paar) om de symmetrische sleutel van Bob te ontsleutelen.
  • Alice gebruikt de symmetrische sleutel van Bob om het bericht te ontsleutelen.

U kunt een AsymmetricKeyAlgorithmProvider-object gebruiken om een asymmetrisch algoritme of een handtekeningalgoritme op te geven, een kortstondig sleutelpaar te maken of te importeren, of om het gedeelte met de openbare sleutel van een sleutelpaar te importeren.

Sleutels afleiden

Het is vaak nodig om extra sleutels af te leiden van een gedeeld geheim. U kunt de klasse KeyDerivationAlgorithmProvider en een van de volgende gespecialiseerde methoden in de klasse KeyDerivationParameters gebruiken om sleutels af te leiden.

Object Beschrijving
BuildForPbkdf2 Hiermee maakt u een KeyDerivationParameters-object voor gebruik in de wachtwoord-gebaseerde sleutelafleidingsfunctie 2 (PBKDF2).
BuildForSP800108 Hiermee maakt u een KeyDerivationParameters-object voor gebruik in een tellermodus, hash-gebaseerde berichtverificatiecode (HMAC) sleutel derivation-functie.
BuildForSP80056a Hiermee maakt u een KeyDerivationParameters-object voor gebruik in de functie SP800-56A-sleuteldeivatie.