Gegevens versleutelen
Symmetrische versleuteling en asymmetrische versleuteling worden uitgevoerd met behulp van verschillende processen. Symmetrische versleuteling wordt uitgevoerd op streams en is daarom handig om grote hoeveelheden gegevens te versleutelen. Asymmetrische versleuteling wordt uitgevoerd op een klein aantal bytes en is daarom alleen nuttig voor kleine hoeveelheden gegevens.
Symmetrische versleuteling
De beheerde symmetrische cryptografieklassen worden gebruikt met een speciale stroomklasse, een CryptoStream klasse die gegevens versleutelt die in de stream worden gelezen. De CryptoStream-klasse wordt geïnitialiseerd met een beheerde streamklasse, een klasse die de ICryptoTransform interface implementeert (gemaakt op basis van een klasse die een cryptografisch algoritme implementeert) en een CryptoStreamMode opsomming waarin het type toegang wordt beschreven dat is toegestaan voor de CryptoStream. De CryptoStream-klasse kan worden geïnitialiseerd met elke klasse die is afgeleid van de Stream klasse, inclusief FileStream, MemoryStreamen NetworkStream. Met deze klassen kunt u symmetrische versleuteling uitvoeren op verschillende streamobjecten.
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 versleuteling uit te voeren op een CryptoStream-klasse . In dit voorbeeld wordt de CryptoStream geïnitialiseerd met een stroomobject fileStream
dat elk type beheerde stream kan zijn. De methode CreateEncryptor van de klasse Aes wordt doorgegeven aan de sleutel en IV die worden gebruikt voor versleuteling. In dit geval worden de standaardsleutel en IV die zijn gegenereerd op basis van aes
deze sleutel gebruikt.
Dim aes As Aes = Aes.Create()
Dim cryptStream As New CryptoStream(
fileStream, aes.CreateEncryptor(key, iv), CryptoStreamMode.Write)
Aes aes = Aes.Create();
CryptoStream cryptStream = new CryptoStream(
fileStream, aes.CreateEncryptor(key, iv), CryptoStreamMode.Write);
Nadat deze code is uitgevoerd, worden alle gegevens die naar het CryptoStream-object worden geschreven, versleuteld met behulp van het AES-algoritme.
In het volgende voorbeeld ziet u het hele proces voor het maken van een stream, het versleutelen van de stream, het schrijven naar de stream en het sluiten van de stream. In dit voorbeeld wordt een bestandsstroom gemaakt die is versleuteld met behulp van de CryptoStream-klasse en de Aes-klasse . Gegenereerde IV wordt naar het begin geschreven FileStream, zodat deze kan worden gelezen en gebruikt voor ontsleuteling. Vervolgens wordt een bericht naar de versleutelde stream geschreven met de StreamWriter klasse. Hoewel dezelfde sleutel meerdere keren kan worden gebruikt voor het versleutelen en ontsleutelen van gegevens, wordt u aangeraden elke keer een nieuwe willekeurige IV te genereren. Op deze manier verschillen de versleutelde gegevens altijd, zelfs wanneer tekst zonder opmaak hetzelfde is.
using System.Security.Cryptography;
try
{
using (FileStream fileStream = new("TestData.txt", FileMode.OpenOrCreate))
{
using (Aes aes = Aes.Create())
{
byte[] key =
{
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16
};
aes.Key = key;
byte[] iv = aes.IV;
fileStream.Write(iv, 0, iv.Length);
using (CryptoStream cryptoStream = new(
fileStream,
aes.CreateEncryptor(),
CryptoStreamMode.Write))
{
// By default, the StreamWriter uses UTF-8 encoding.
// To change the text encoding, pass the desired encoding as the second parameter.
// For example, new StreamWriter(cryptoStream, Encoding.Unicode).
using (StreamWriter encryptWriter = new(cryptoStream))
{
encryptWriter.WriteLine("Hello World!");
}
}
}
}
Console.WriteLine("The file was encrypted.");
}
catch (Exception ex)
{
Console.WriteLine($"The encryption failed. {ex}");
}
Imports System
Imports System.IO
Imports System.Security.Cryptography
Module Module1
Sub Main()
Try
' Create a file stream
Using fileStream As New FileStream("TestData.txt", FileMode.OpenOrCreate)
' Create a new instance of the default Aes implementation class
' and configure encryption key.
Using aes As Aes = Aes.Create()
'Encryption key used to encrypt the stream.
'The same value must be used to encrypt and decrypt the stream.
Dim key As Byte() = {
&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8,
&H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16
}
aes.Key = key
' Stores IV at the beginning of the file.
' This information will be used for decryption.
Dim iv As Byte() = aes.IV
fileStream.Write(iv, 0, iv.Length)
' Create a CryptoStream, pass it the FileStream, and encrypt
' it with the Aes class.
Using cryptoStream As New CryptoStream(fileStream, aes.CreateEncryptor(), CryptoStreamMode.Write)
' By default, the StreamWriter uses UTF-8 encoding.
' To change the text encoding, pass the desired encoding as the second parameter.
' For example, New StreamWriter(cryptoStream, Encoding.Unicode).
Using sWriter As New StreamWriter(cryptoStream)
'Write to the stream.
sWriter.WriteLine("Hello World!")
End Using
End Using
End Using
End Using
'Inform the user that the message was written
'to the stream.
Console.WriteLine("The text was encrypted.")
Catch
'Inform the user that an exception was raised.
Console.WriteLine("The encryption failed.")
Throw
End Try
End Sub
End Module
De code versleutelt de stream met behulp van het symmetrische AES-algoritme en schrijft IV en versleuteld vervolgens 'Hallo wereld!' naar de stream. Als de code is geslaagd, wordt er een versleuteld bestand gemaakt met de naam TestData.txt en wordt de volgende tekst weergegeven in de console:
The file was encrypted.
U kunt het bestand ontsleutelen met behulp van het symmetrische ontsleutelingsvoorbeeld in Gegevens ontsleutelen. In dit voorbeeld en in dit voorbeeld wordt dezelfde sleutel opgegeven.
Als er echter een uitzondering optreedt, wordt de volgende tekst weergegeven in de console:
The encryption failed.
Asymmetrische versleuteling
Asymmetrische algoritmen worden meestal gebruikt om kleine hoeveelheden gegevens te versleutelen, zoals de versleuteling van een symmetrische sleutel en IV. Normaal gesproken gebruikt een persoon die asymmetrische versleuteling uitvoert de openbare sleutel die door een andere partij wordt gegenereerd. De RSA klasse wordt voor dit doel geleverd door .NET.
In het volgende voorbeeld worden openbare-sleutelgegevens gebruikt om een symmetrische sleutel en IV te versleutelen. Er worden twee bytematrices geïnitialiseerd die de openbare sleutel van een derde partij vertegenwoordigen. Een RSAParameters object wordt geïnitialiseerd voor deze waarden. Vervolgens wordt het RSAParameters-object (samen met de openbare sleutel die het vertegenwoordigt) geïmporteerd in een RSA-exemplaar met behulp van de RSA.ImportParameters methode. Ten slotte worden de persoonlijke sleutel en IV die door een Aes klasse zijn gemaakt, versleuteld. In dit voorbeeld moeten systemen 128-bits versleuteling hebben geïnstalleerd.
Imports System
Imports System.Security.Cryptography
Module Module1
Sub Main()
'Initialize the byte arrays to the public key information.
Dim modulus As Byte() = {214, 46, 220, 83, 160, 73, 40, 39, 201, 155, 19, 202, 3, 11, 191, 178, 56, 74, 90, 36, 248, 103, 18, 144, 170, 163, 145, 87, 54, 61, 34, 220, 222, 207, 137, 149, 173, 14, 92, 120, 206, 222, 158, 28, 40, 24, 30, 16, 175, 108, 128, 35, 230, 118, 40, 121, 113, 125, 216, 130, 11, 24, 90, 48, 194, 240, 105, 44, 76, 34, 57, 249, 228, 125, 80, 38, 9, 136, 29, 117, 207, 139, 168, 181, 85, 137, 126, 10, 126, 242, 120, 247, 121, 8, 100, 12, 201, 171, 38, 226, 193, 180, 190, 117, 177, 87, 143, 242, 213, 11, 44, 180, 113, 93, 106, 99, 179, 68, 175, 211, 164, 116, 64, 148, 226, 254, 172, 147}
Dim exponent As Byte() = {1, 0, 1}
'Create values to store encrypted symmetric keys.
Dim encryptedSymmetricKey() As Byte
Dim encryptedSymmetricIV() As Byte
'Create a new instance of the default RSA implementation class.
Dim rsa As RSA = RSA.Create()
'Create a new instance of the RSAParameters structure.
Dim rsaKeyInfo As New RSAParameters()
'Set rsaKeyInfo to the public key values.
rsaKeyInfo.Modulus = modulus
rsaKeyInfo.Exponent = exponent
'Import key parameters into rsa
rsa.ImportParameters(rsaKeyInfo)
'Create a new instance of the default Aes implementation class.
Dim aes As Aes = Aes.Create()
'Encrypt the symmetric key and IV.
encryptedSymmetricKey = rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1)
encryptedSymmetricIV = rsa.Encrypt(aes.IV, RSAEncryptionPadding.Pkcs1)
End Sub
End Module
using System;
using System.Security.Cryptography;
class Class1
{
static void Main()
{
//Initialize the byte arrays to the public key information.
byte[] modulus =
{
214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
106,99,179,68,175,211,164,116,64,148,226,254,172,147
};
byte[] exponent = { 1, 0, 1 };
//Create values to store encrypted symmetric keys.
byte[] encryptedSymmetricKey;
byte[] encryptedSymmetricIV;
//Create a new instance of the RSA class.
RSA rsa = RSA.Create();
//Create a new instance of the RSAParameters structure.
RSAParameters rsaKeyInfo = new RSAParameters();
//Set rsaKeyInfo to the public key values.
rsaKeyInfo.Modulus = modulus;
rsaKeyInfo.Exponent = exponent;
//Import key parameters into rsa.
rsa.ImportParameters(rsaKeyInfo);
//Create a new instance of the default Aes implementation class.
Aes aes = Aes.Create();
//Encrypt the symmetric key and IV.
encryptedSymmetricKey = rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1);
encryptedSymmetricIV = rsa.Encrypt(aes.IV, RSAEncryptionPadding.Pkcs1);
}
}