Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A szimmetrikus titkosítás és az aszimmetrikus titkosítás különböző folyamatokkal történik. A szimmetrikus titkosítás streameken történik, ezért nagy mennyiségű adat titkosítására hasznos. Az aszimmetrikus titkosítás kis számú bájton történik, ezért csak kis mennyiségű adat esetén hasznos.
Szimmetrikus titkosítás
A felügyelt szimmetrikus titkosítási osztályokat egy speciális streamosztály, az úgynevezett a CryptoStream használatával titkosítja, amely titkosítja a streambe beolvasott adatokat. A CryptoStream osztály inicializálva van egy felügyelt streamosztálysal, egy olyan osztálysal, amely implementálja a ICryptoTransform felületet (amely egy titkosítási algoritmust megvalósító osztályból jön létre), valamint egy CryptoStreamMode enumerálással, amely leírja a CryptoStreamhez engedélyezett hozzáférés típusát. A CryptoStream osztály inicializálható az osztályból származó bármely osztály használatával, beleértve FileStreama Stream , MemoryStreamés NetworkStream. Ezekkel az osztályokkal szimmetrikus titkosítást végezhet különböző streamobjektumokon.
Az alábbi példa bemutatja, hogyan hozható létre az algoritmus alapértelmezett implementációs osztályának új példánya Aes . A példány titkosítást végez egy CryptoStream-osztályon . Ebben a példában a CryptoStream inicializálva van egy streamobjektummal, amely fileStream
bármilyen típusú felügyelt stream lehet. Az Aes-osztály CreateEncryptor metódusa átadja a titkosításhoz használt kulcsot és IV-et. Ebben az esetben a rendszer az alapértelmezett kulcsot és a generált aes
IV-et használja.
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);
A kód végrehajtása után a CryptoStream objektumba írt összes adat titkosítva lesz az AES-algoritmus használatával.
Az alábbi példa egy stream létrehozásának, a stream titkosításának, a streambe való írásnak és a stream bezárásának teljes folyamatát mutatja be. Ez a példa létrehoz egy fájlstreamet, amely a CryptoStream és az Aes osztály használatával van titkosítva. A generált IV a folyamat elejére FileStreamvan írva, így olvasható és visszafejthető. Ezután a rendszer egy üzenetet ír a titkosított streambe az StreamWriter osztálysal. Bár ugyanazt a kulcsot többször is használhatja az adatok titkosításához és visszafejtéséhez, javasoljuk, hogy minden alkalommal hozzon létre egy új véletlenszerű IV-et. Így a titkosított adatok mindig eltérőek, még akkor is, ha az egyszerű szöveg ugyanaz.
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
A kód az AES szimmetrikus algoritmusával titkosítja a streamet, majd a IV-et írja, majd titkosítja a ""Helló világ!" alkalmazás!" szöveget a streambe. Ha a kód sikeres, létrehoz egy TestData.txt nevű titkosított fájlt, és megjeleníti a következő szöveget a konzolon:
The file was encrypted.
A fájl visszafejtéséhez használja a szimmetrikus visszafejtési példát az Adatok visszafejtéséhez. Ez a példa és ez a példa ugyanazt a kulcsot adja meg.
Kivétel esetén azonban a kód a következő szöveget jeleníti meg a konzolon:
The encryption failed.
Aszimmetrikus titkosítás
Az aszimmetrikus algoritmusokat általában kis mennyiségű adat titkosítására használják, például szimmetrikus kulcs és IV titkosítására. Az aszimmetrikus titkosítást végző személy általában egy másik fél által létrehozott nyilvános kulcsot használja. Erre RSA a célra a .NET biztosítja az osztályt.
Az alábbi példa nyilvános kulcsadatokat használ egy szimmetrikus kulcs és IV titkosításához. Két bájttömb van inicializálva, amelyek egy harmadik fél nyilvános kulcsát jelölik. Ezekre RSAParameters az értékekre inicializál egy objektumot. Ezután a rendszer az RSAParameters objektumot (az általa képviselt nyilvános kulccsal együtt) importálja egy RSA-példányba a RSA.ImportParameters metódus használatával. Végül az osztály által Aes létrehozott titkos kulcs és IV titkosítva van. Ebben a példában a rendszerek 128 bites titkosítást igényelnek.
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);
}
}