Šifrování dat
Symetrické šifrování a asymetrické šifrování se provádí pomocí různých procesů. Symetrické šifrování se provádí u datových proudů a je proto užitečné šifrovat velké objemy dat. Asymetrické šifrování se provádí na malém počtu bajtů, a proto je užitečné pouze pro malé objemy dat.
Symetrické šifrování
Spravované symetrické kryptografické třídy se používají se speciální třídou datového proudu, CryptoStream která šifruje data načtená do datového proudu. CryptoStream třída je inicializována spravovanou stream třídy, třída, která implementuje ICryptoTransform rozhraní (vytvořenou z třídy, která implementuje kryptografický algoritmus) a CryptoStreamMode výčet, který popisuje typ přístupu povolený pro CryptoStream. CryptoStream třídy lze inicializovat pomocí jakékoli třídy, která je odvozena od Stream třídy, včetně FileStream, a .NetworkStreamMemoryStream Pomocí těchto tříd můžete provádět symetrické šifrování u různých objektů datového proudu.
Následující příklad ukazuje, jak vytvořit novou instanci výchozí třídy implementace pro Aes algoritmus. Instance se používá k šifrování třídy CryptoStream . V tomto příkladu se CryptoStream inicializuje s objektem datového proudu, fileStream
který může být libovolný typ spravovaného datového proudu. Metoda CreateEncryptor z třídy Aes je předán klíč a IV, které se používají k šifrování. V tomto případě se použije výchozí klíč a iv vygenerovaný z aes
.
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);
Po provedení tohoto kódu se všechna data zapsaná do objektu CryptoStream zašifrují pomocí algoritmu AES.
Následující příklad ukazuje celý proces vytvoření datového proudu, šifrování datového proudu, zápis do datového proudu a zavření streamu. Tento příklad vytvoří datový proud souboru, který je šifrovaný pomocí CryptoStream třídy a Aes třídy. Vygenerovaný IV je zapsán na začátek FileStream, takže je možné jej číst a používat k dešifrování. Pak se zpráva zapíše do šifrovaného datového StreamWriter proudu s třídou. Stejný klíč lze použít vícekrát k šifrování a dešifrování dat, doporučuje se pokaždé vygenerovat nový náhodný IV. Tímto způsobem se šifrovaná data vždy liší, i když je prostý text stejný.
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
Kód šifruje datový proud pomocí symetrického algoritmu AES a zapíše IV a pak zašifruje "Hello World!" do datového proudu. Pokud je kód úspěšný, vytvoří šifrovaný soubor s názvem TestData.txt a zobrazí se v konzole následující text:
The file was encrypted.
Soubor můžete dešifrovat pomocí příkladu symetrického dešifrování v části Dešifrování dat. Tento příklad a tento příklad určují stejný klíč.
Pokud je však vyvolána výjimka, zobrazí se v konzole následující text:
The encryption failed.
Asymetrické šifrování
Asymetrické algoritmy se obvykle používají k šifrování malých objemů dat, jako je šifrování symetrického klíče a IV. Jednotlivec provádějící asymetrický šifrování obvykle používá veřejný klíč vygenerovaný jinou stranou. Třída RSA je poskytována rozhraním .NET pro tento účel.
Následující příklad používá informace o veřejném klíči k šifrování symetrického klíče a IV. Inicializují se dvě pole bajtů, která představují veřejný klíč třetí strany. Objekt RSAParameters je inicializován na tyto hodnoty. Dále se objekt RSAParameters (spolu s veřejným klíčem, který představuje) importuje do instance RSA pomocí RSA.ImportParameters metody. Nakonec se privátní klíč a IV vytvořené Aes třídou zašifrují. Tento příklad vyžaduje, aby systémy měly nainstalované 128bitové šifrování.
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);
}
}