Entschlüsseln von Daten
Aktualisiert: November 2007
Die Entschlüsselung ist die umgekehrte Verschlüsselungsoperation. Bei der Verschlüsselung mit geheimem Schlüssel müssen Schlüssel und IV, die zum Verschlüsseln der Daten verwendet wurden, bekannt sein. Bei der Verschlüsselung mit öffentlichem Schlüssel muss entweder der öffentliche Schlüssel bekannt sein (wenn die Daten mit dem privaten Schlüssel verschlüsselt wurden) oder der private Schlüssel (wenn die Daten mit dem öffentlichen Schlüssel verschlüsselt wurden).
Symmetrische Entschlüsselung
Die Entschlüsselung von Daten, die mit symmetrischen Algorithmen verschlüsselt wurden, ist mit dem Prozess der Datenverschlüsselung mit symmetrischen Algorithmen vergleichbar. Zum Entschlüsseln von Daten, die aus einem beliebigen verwalteten Streamobjekt gelesen werden, wird die CryptoStream-Klasse in Verbindung mit den von .NET Framework bereitgestellten symmetrischen Kryptografieklassen verwendet.
Das folgende Beispiel stellt dar, wie eine neue Instanz der RijndaelManaged-Klasse erstellt und zum Entschlüsseln eines CryptoStream-Objekts verwendet wird. In diesem Beispiel wird zunächst eine neue Instanz der RijndaelManaged-Klasse erstellt. Danach wird ein CryptoStream-Objekt erstellt und mit dem Wert eines verwalteten Streams mit dem Namen MyStream initialisiert. Anschließend wird der CreateDecryptor-Methode aus der RijndaelManaged-Klasse derselbe Schlüssel und IV übergeben, der für die Verschlüsselung verwendet wurde. Danach erfolgt die Übergabe an den CryptoStream-Konstruktor. Zum Schluss wird die CryptoStreamMode.Read-Enumeration an den CryptoStream-Konstruktor übergeben, um den Lesezugriff auf den Stream zu definieren.
Dim RMCrypto As New RijndaelManaged()
Dim CryptStream As New CryptoStream(MyStream, RMCrypto.CreateDecryptor(RMCrypto.Key, RMCrypto.IV), CryptoStreamMode.Read)
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream CryptStream = new CryptoStream(MyStream, RMCrypto.CreateDecryptor(Key, IV), CryptoStreamMode.Read);
Das folgende Beispiel veranschaulicht den gesamten Prozess: das Erzeugen und Entschlüsseln des Streams, das Lesen aus dem Stream und das Schließen des Streams. Ein TCPListener-Objekt wird erstellt, durch das bei Herstellung einer Verbindung zum überwachenden Objekt ein Netzwerkstream initialisiert wird. Der Netzwerkstream wird dann mit der CryptoStream-Klasse und der RijndaelManaged-Klasse entschlüsselt. Voraussetzung bei diesem Beispiel ist, dass die Werte von Schlüssel und IV erfolgreich übertragen oder zuvor vereinbart wurden. Der für die Verschlüsselung und Übertragung dieser Werte erforderliche Code ist nicht enthalten.
Imports System
Imports System.Net.Sockets
Imports System.Threading
Imports System.IO
Imports System.Net
Imports System.Security.Cryptography
Module Module1
Sub Main()
'The key and IV must be the same values that were 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}
Dim IV As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}
Try
'Initialize a TCPListener on port 11000
'using the current IP address.
Dim TCPListen As New TcpListener(IPAddress.Any, 11000)
'Start the listener.
TCPListen.Start()
'Check for a connection every five seconds.
While Not TCPListen.Pending()
Console.WriteLine("Still listening. Will try in 5 seconds.")
Thread.Sleep(5000)
End While
'Accept the client if one is found.
Dim TCP As TcpClient = TCPListen.AcceptTcpClient()
'Create a network stream from the connection.
Dim NetStream As NetworkStream = TCP.GetStream()
'Create a new instance of the RijndaelManaged class
'and decrypt the stream.
Dim RMCrypto As New RijndaelManaged()
'Create an instance of the CryptoStream class, pass it the NetworkStream, and decrypt
'it with the Rijndael class using the key and IV.
Dim CryptStream As New CryptoStream(NetStream, RMCrypto.CreateDecryptor(Key, IV), CryptoStreamMode.Read)
'Read the stream.
Dim SReader As New StreamReader(CryptStream)
'Display the message.
Console.WriteLine("The decrypted original message: {0}", SReader.ReadToEnd())
'Close the streams.
SReader.Close()
NetStream.Close()
TCP.Close()
'Catch any exceptions.
Catch
Console.WriteLine("The Listener Failed.")
End Try
End Sub
End Module
using System;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Net;
using System.Security.Cryptography;
class Class1
{
static void Main(string[] args)
{
//The key and IV must be the same values that were used
//to encrypt the stream.
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};
try
{
//Initialize a TCPListener on port 11000
//using the current IP address.
TcpListener TCPListen = new TcpListener(IPAdress.Any, 11000);
//Start the listener.
TCPListen.Start();
//Check for a connection every five seconds.
while(!TCPListen.Pending())
{
Console.WriteLine("Still listening. Will try in 5 seconds.");
Thread.Sleep(5000);
}
//Accept the client if one is found.
TcpClient TCP = TCPListen.AcceptTcpClient();
//Create a network stream from the connection.
NetworkStream NetStream = TCP.GetStream();
//Create a new instance of the RijndaelManaged class
// and decrypt the stream.
RijndaelManaged RMCrypto = new RijndaelManaged();
//Create a CryptoStream, pass it the NetworkStream, and decrypt
//it with the Rijndael class using the key and IV.
CryptoStream CryptStream = new CryptoStream(NetStream,
RMCrypto.CreateDecryptor(Key, IV),
CryptoStreamMode.Read);
//Read the stream.
StreamReader SReader = new StreamReader(CryptStream);
//Display the message.
Console.WriteLine("The decrypted original message: {0}", SReader.ReadToEnd());
//Close the streams.
SReader.Close();
NetStream.Close();
TCP.Close();
}
//Catch any exceptions.
catch
{
Console.WriteLine("The Listener Failed.");
}
}
}
Damit das obige Beispiel funktioniert, muss eine verschlüsselte Verbindung zum Listener hergestellt werden. Für die Verbindung muss derselbe Schlüssel und IV sowie derselbe Algorithmus wie für den Listener verwendet werden. Wenn eine solche Verbindung hergestellt werden kann, wird die Nachricht entschlüsselt und in der Konsole angezeigt.
Asymmetrische Entschlüsselung
In der Regel generiert ein Teilnehmer (Teilnehmer A) einen öffentlichen und einen privaten Schlüssel und speichert diese im Arbeitsspeicher oder in einem kryptografischen Schlüsselcontainer. Teilnehmer A sendet dann den öffentlichen Schlüssel an einen anderen Teilnehmer (Teilnehmer B). Teilnehmer B verschlüsselt mithilfe des öffentlichen Schlüssels Daten und sendet diese zurück an Teilnehmer A. Nachdem Teilnehmer A die Daten empfangen hat, entschlüsselt er die Daten mithilfe des entsprechenden privaten Schlüssels. Die Entschlüsselung ist nur dann erfolgreich, wenn Teilnehmer A den privaten Schlüssel verwendet, der dem öffentlichen Schlüssel entspricht, mit dem Teilnehmer B die Daten verschlüsselt hat.
Informationen dazu, wie Sie einen asymmetrischen Schlüssel in einem sicheren Container für kryptografische Schlüssel speichern und später diesen asymmetrischen Schlüssel abrufen, finden Sie unter Gewusst wie: Speichern von asymmetrischen Schlüsseln in einem Schlüsselcontainer.
Das folgende Beispiel veranschaulicht die Entschlüsselung von zwei Bytearrays, die einen symmetrischen Schlüssel und einen IV darstellen. Informationen dazu, wie der asymmetrische öffentliche Schlüssel aus dem RSACryptoServiceProvider-Objekt in ein Format extrahiert wird, das auf einfache Weise an Dritte gesendet werden kann, finden Sie unter Verschlüsseln von Daten.
'Create a new instance of the RSACryptoServiceProvider class.
Dim RSA As New RSACryptoServiceProvider()
' 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, False)
SymmetricIV = RSA.Decrypt(EncryptedSymmetricIV, False)
//Create a new instance of the RSACryptoServiceProvider class.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
// 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, false);
SymmetricIV = RSA.Decrypt( EncryptedSymmetricIV , false);
Siehe auch
Konzepte
Erzeugen von Schlüsseln für die Ver- und Entschlüsselung