Gegevens ontsleutelen
Ontsleuteling is de omgekeerde bewerking van versleuteling. Voor versleuteling van geheime sleutels moet u zowel de sleutel als iv kennen die zijn gebruikt om de gegevens te versleutelen. Voor versleuteling van openbare sleutels moet u de openbare sleutel (als de gegevens zijn versleuteld met behulp van de persoonlijke sleutel) of de persoonlijke sleutel (als de gegevens zijn versleuteld met behulp van de openbare sleutel) weten.
Symmetrische ontsleuteling
De ontsleuteling van gegevens die zijn versleuteld met symmetrische algoritmen, is vergelijkbaar met het proces dat wordt gebruikt voor het versleutelen van gegevens met symmetrische algoritmen. De CryptoStream klasse wordt gebruikt met symmetrische cryptografieklassen van .NET om gegevens te ontsleutelen die zijn gelezen uit een beheerd streamobject.
In het volgende voorbeeld ziet u hoe u een nieuw exemplaar van de standaard-implementatieklasse voor het Aes algoritme maakt. Het exemplaar wordt gebruikt om ontsleuteling uit te voeren op een CryptoStream object. In dit voorbeeld wordt eerst een nieuw exemplaar van de Aes implementatieklasse gemaakt. De initialisatievectorwaarde (IV) wordt gelezen uit een beheerde stroomvariabele. fileStream
Vervolgens wordt een CryptoStream object geïnstitualiseerd en geïnitialiseerd naar de waarde van het fileStream
exemplaar. De SymmetricAlgorithm.CreateDecryptor methode van het Aes exemplaar wordt doorgegeven aan de IV-waarde en dezelfde sleutel die is gebruikt voor versleuteling.
Dim aes As Aes = Aes.Create()
Dim cryptStream As New CryptoStream(
fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read)
Aes aes = Aes.Create();
CryptoStream cryptStream = new CryptoStream(
fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read);
In het volgende voorbeeld ziet u het hele proces voor het maken van een stream, het ontsleutelen van de stream, het lezen van de stream en het sluiten van de streams. Er wordt een bestandsstroomobject gemaakt dat een bestand met de naam TestData.txt leest. De bestandsstroom wordt vervolgens ontsleuteld met behulp van de CryptoStream-klasse en de Aes-klasse . In dit voorbeeld wordt de sleutelwaarde opgegeven die wordt gebruikt in het symmetrische versleutelingsvoorbeeld voor het versleutelen van gegevens. De code die nodig is om deze waarden te versleutelen en over te dragen, wordt niet weergegeven.
using System.Security.Cryptography;
try
{
using (FileStream fileStream = new("TestData.txt", FileMode.Open))
{
using (Aes aes = Aes.Create())
{
byte[] iv = new byte[aes.IV.Length];
int numBytesToRead = aes.IV.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
int n = fileStream.Read(iv, numBytesRead, numBytesToRead);
if (n == 0) break;
numBytesRead += n;
numBytesToRead -= n;
}
byte[] key =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16
};
using (CryptoStream cryptoStream = new(
fileStream,
aes.CreateDecryptor(key, iv),
CryptoStreamMode.Read))
{
// By default, the StreamReader uses UTF-8 encoding.
// To change the text encoding, pass the desired encoding as the second parameter.
// For example, new StreamReader(cryptoStream, Encoding.Unicode).
using (StreamReader decryptReader = new(cryptoStream))
{
string decryptedMessage = await decryptReader.ReadToEndAsync();
Console.WriteLine($"The decrypted original message: {decryptedMessage}");
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"The decryption failed. {ex}");
}
Imports System
Imports System.IO
Imports System.Security.Cryptography
Module Module1
Sub Main()
' Decryption key must be the same value that was used
' to encrypt the stream.
Dim key As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}
Try
' Create a file stream.
Using fileStream As New FileStream("TestData.txt", FileMode.Open)
' Create a new instance of the default Aes implementation class
Using aes As Aes = Aes.Create()
' Reads IV value from beginning of the file.
Dim iv As Byte() = New Byte(aes.IV.Length - 1) {}
Dim numBytesToRead As Integer = CType(aes.IV.Length, Integer)
Dim numBytesRead As Integer = 0
While (numBytesToRead > 0)
Dim n As Integer = fileStream.Read(iv, numBytesRead, numBytesToRead)
If n = 0 Then
Exit While
End If
numBytesRead += n
numBytesToRead -= n
End While
Using cryptoStream As New CryptoStream(fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read)
' By default, the StreamReader uses UTF-8 encoding.
' To change the text encoding, pass the desired encoding as the second parameter.
' For example, New StreamReader(cryptoStream, Encoding.Unicode).
Using decryptReader As New StreamReader(cryptoStream)
' Display the message.
Console.WriteLine($"The decrypted original message: {decryptReader.ReadToEnd()}")
End Using
End Using
End Using
End Using
Catch
Console.WriteLine("The decryption Failed.")
Throw
End Try
End Sub
End Module
In het voorgaande voorbeeld wordt dezelfde sleutel gebruikt en het algoritme dat wordt gebruikt in het symmetrische versleutelingsvoorbeeld voor het versleutelen van gegevens. Het ontsleutelt het TestData.txt-bestand dat door dat voorbeeld is gemaakt en geeft de oorspronkelijke tekst weer op de console.
Asymmetrische ontsleuteling
Normaal gesproken genereert een partij (partij A) zowel een openbare als een persoonlijke sleutel en slaat de sleutel op in het geheugen of in een cryptografische sleutelcontainer. Partij A stuurt vervolgens de openbare sleutel naar een andere partij (partij B). Met behulp van de openbare sleutel versleutelt partij B gegevens en stuurt de gegevens terug naar partij A. Nadat de gegevens zijn ontvangen, ontsleutelt partij A deze met behulp van de persoonlijke sleutel die overeenkomt. Ontsleuteling is alleen mogelijk als partij A de persoonlijke sleutel gebruikt die overeenkomt met de openbare sleutel partij B die wordt gebruikt voor het versleutelen van de gegevens.
Zie How to: Store Asymmetric Keys in a Key Container (Asymmetrische sleutels opslaan in een sleutelcontainer) voor informatie over het opslaan van een asymmetrische sleutel in een container met beveiligde cryptografische sleutels en het later ophalen van de asymmetrische sleutel.
In het volgende voorbeeld ziet u de ontsleuteling van twee matrices van bytes die een symmetrische sleutel en IV vertegenwoordigen. Zie Encrypting Data voor informatie over het extraheren van de asymmetrische openbare sleutel uit het RSA object in een indeling die u eenvoudig naar een derde partij kunt verzenden.
'Create a new instance of the RSA class.
Dim rsa As RSA = RSA.Create()
' Export the public key information and send it to a third party.
' Wait for the third party to encrypt some data and send it back.
'Decrypt the symmetric key and IV.
symmetricKey = rsa.Decrypt(encryptedSymmetricKey, RSAEncryptionPadding.Pkcs1)
symmetricIV = rsa.Decrypt(encryptedSymmetricIV, RSAEncryptionPadding.Pkcs1)
//Create a new instance of the RSA class.
RSA rsa = RSA.Create();
// Export the public key information and send it to a third party.
// Wait for the third party to encrypt some data and send it back.
//Decrypt the symmetric key and IV.
symmetricKey = rsa.Decrypt(encryptedSymmetricKey, RSAEncryptionPadding.Pkcs1);
symmetricIV = rsa.Decrypt(encryptedSymmetricIV , RSAEncryptionPadding.Pkcs1);