Šifrování dat
Symetrické a asymetrické šifrování se provádí pomocí různých procesů. Symetrické šifrování je prováděno na datových proudech a proto je užitečné k šifrování velkých objemů dat. Asymetrické šifrování se provádí na malém počtu bajtů a proto je užitečné pouze pro malé množství dat.
Symetrické šifrování
Spravované třídy symetrického šifrování se používají se zvláštní třídou datového proudu nazvanou CryptoStream, která šifruje načtená data do datového proudu. Třída CryptoStream je inicializována se spravovanou třídou datového proudu. Třída implementuje rozhraní ICryptoTransform (vytvořené ze třídy, která implementuje kryptografický algoritmus) a výčet CryptoStreamMode, který popisuje typ povoleného přístupu pro CryptoStream. Třída CryptoStream může být inicializována pomocí libovolné třídy, která je odvozena od třídy Stream včetně FileStream, MemoryStream a NetworkStream. Pomocí těchto tříd můžete provést symetrické šifrování různých objektů datového proudu.
Následující příklad ukazuje, jak vytvořit novou instanci třídy RijndaelManaged, která implementuje šifrovací algoritmus Rijndael a použít ji k provedení šifrování na třídě CryptoStream. V tomto příkladu je CryptoStream inicializována s objektem datového proudu nazvaným MyStream, což může být libovolný typ spravovaného datového proudu. Metodě CreateEncryptor z třídy RijndaelManaged je předán klíč a IV, které se používají pro šifrování. V tomto případě je používán výchozí klíč a IV vygenerovaný z RMCrypto. Nakonec je předán CryptoStreamMode.Write, který specifikuje přístup pro zápis do datového proudu.
Dim RMCrypto As New RijndaelManaged()
Dim CryptStream As New CryptoStream(MyStream, RMCrypto.CreateEncryptor(RMCrypto.Key, RMCrypto.IV), CryptoStreamMode.Write)
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream CryptStream = new CryptoStream(MyStream, RMCrypto.CreateEncryptor(), CryptoStreamMode.Write);
Po provedení tohoto kódu, jsou jakákoliv data zapsána do objektu CryptoStream zašifrována pomocí algoritmu Rijndael.
Následující příklad zobrazuje celý proces vytváření datového proudu, šifrování datového proudu, zápis do datového proudu a zavření datového proudu. Tento příklad vytváří datový proud sítě, který je zašifrovaný pomocí tříd CryptoStream a RijndaelManaged. Zpráva je zapsána do šifrovaného datového proudu pomocí třídy StreamWriter.
Poznámka |
---|
Tento příklad také můžete použít pro zápis do souboru.Chcete-li to provést, odstraňte odkaz TcpClient a nahraďte NetworkStream tímto FileStream. |
Imports System
Imports System.IO
Imports System.Security.Cryptography
Imports System.Net.Sockets
Module Module1
Sub Main()
Try
'Create a TCP connection to a listening TCP process.
'Use "localhost" to specify the current computer or
'replace "localhost" with the IP address of the
'listening process.
Dim TCP As New TcpClient("localhost", 11000)
'Create a network stream from the TCP connection.
Dim NetStream As NetworkStream = TCP.GetStream()
'Create a new instance of the RijndaelManaged class
'and encrypt the stream.
Dim RMCrypto As New RijndaelManaged()
Dim Key As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}
Dim IV As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}
'Create a CryptoStream, pass it the NetworkStream, and encrypt
'it with the Rijndael class.
Dim CryptStream As New CryptoStream(NetStream, RMCrypto.CreateEncryptor(Key, IV), CryptoStreamMode.Write)
'Create a StreamWriter for easy writing to the
'network stream.
Dim SWriter As New StreamWriter(CryptStream)
'Write to the stream.
SWriter.WriteLine("Hello World!")
'Inform the user that the message was written
'to the stream.
Console.WriteLine("The message was sent.")
'Close all the connections.
SWriter.Close()
CryptStream.Close()
NetStream.Close()
TCP.Close()
Catch
'Inform the user that an exception was raised.
Console.WriteLine("The connection failed.")
End Try
End Sub
End Module
using System;
using System.IO;
using System.Security.Cryptography;
using System.Net.Sockets;
public class main
{
public static void Main(string[] args)
{
try
{
//Create a TCP connection to a listening TCP process.
//Use "localhost" to specify the current computer or
//replace "localhost" with the IP address of the
//listening process.
TcpClient TCP = new TcpClient("localhost",11000);
//Create a network stream from the TCP connection.
NetworkStream NetStream = TCP.GetStream();
//Create a new instance of the RijndaelManaged class
// and encrypt the stream.
RijndaelManaged RMCrypto = new RijndaelManaged();
byte[] Key = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
byte[] IV = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
//Create a CryptoStream, pass it the NetworkStream, and encrypt
//it with the Rijndael class.
CryptoStream CryptStream = new CryptoStream(NetStream,
RMCrypto.CreateEncryptor(Key, IV),
CryptoStreamMode.Write);
//Create a StreamWriter for easy writing to the
//network stream.
StreamWriter SWriter = new StreamWriter(CryptStream);
//Write to the stream.
SWriter.WriteLine("Hello World!");
//Inform the user that the message was written
//to the stream.
Console.WriteLine("The message was sent.");
//Close all the connections.
SWriter.Close();
CryptStream.Close();
NetStream.Close();
TCP.Close();
}
catch
{
//Inform the user that an exception was raised.
Console.WriteLine("The connection failed.");
}
}
}
Aby předchozí příklad proběhl úspěšně, musí existovat proces, který poslouchá na IP adrese a daném portu specifikovaném ve třídě TCPCLient. Pokud existuje naslouchající proces, kód se připojí k naslouchajícímu procesu, zašifruje datový proud pomocí symetrického algoritmu Rijndael a zapíše "Hello World!" do datového proudu. Pokud je kód úspěšný, zobrazí do konzole následující text:
The message was sent.
Ale pokud není nalezen žádný naslouchající proces nebo je vyvolána výjimka, kód zobrazí do konzole následující text:
The connection failed.
Asymetrické šifrování
Asymetrické algoritmy se obvykle používají k šifrování malého množství dat, například šifrování symetrického klíče a IV. Individuální provádění asymetrického šifrování obvykle používá veřejný klíč generovaný jinou stranou. Pro tyto účely je rozhraním .NET Framework poskytována třída RSACryptoServiceProvider.
Následující příklad k šifrování symetrického klíče a IV používá informace veřejného klíče. Dvě pole bytů, která představují veřejný klíč třetí strany jsou inicializována. Objekt RSAParameters je inicializován na tyto hodnoty. Dále je objekt RSAParameters (společně s veřejným klíčem, který představuje) importován do metody RSACryptoServiceProvider pomocí RSACryptoServiceProvider.ImportParameters. Nakonec jsou zašifrovány privátní klíč a IV vytvořené třídou RijndaelManaged. Tento příklad vyžaduje, aby systémy měly nainstalováno 128bitové šifrování.
Imports System
Imports System.Security.Cryptography
Module Module1
Sub Main()
'Initialize the byte arrays to the public key information.
Dim PublicKey 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 RSACryptoServiceProvider class.
Dim RSA As New RSACryptoServiceProvider()
'Create a new instance of the RSAParameters structure.
Dim RSAKeyInfo As New RSAParameters()
'Set RSAKeyInfo to the public key values.
RSAKeyInfo.Modulus = PublicKey
RSAKeyInfo.Exponent = Exponent
'Import key parameters into RSA.
RSA.ImportParameters(RSAKeyInfo)
'Create a new instance of the RijndaelManaged class.
Dim RM As New RijndaelManaged()
'Encrypt the symmetric key and IV.
EncryptedSymmetricKey = RSA.Encrypt(RM.Key, False)
EncryptedSymmetricIV = RSA.Encrypt(RM.IV, False)
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[] PublicKey = {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 RSACryptoServiceProvider class.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Create a new instance of the RSAParameters structure.
RSAParameters RSAKeyInfo = new RSAParameters();
//Set RSAKeyInfo to the public key values.
RSAKeyInfo.Modulus = PublicKey;
RSAKeyInfo.Exponent = Exponent;
//Import key parameters into RSA.
RSA.ImportParameters(RSAKeyInfo);
//Create a new instance of the RijndaelManaged class.
RijndaelManaged RM = new RijndaelManaged();
//Encrypt the symmetric key and IV.
EncryptedSymmetricKey = RSA.Encrypt(RM.Key, false);
EncryptedSymmetricIV = RSA.Encrypt(RM.IV, false);
}
}
Viz také
Koncepty
Generování klíčů pro šifrování a dešifrování