Exemplarische Vorgehensweise: Erstellen einer kryptografischen Anwendung

Aktualisiert: November 2007

Diese exemplarische Vorgehensweise veranschaulicht, wie Inhalt verschlüsselt und entschlüsselt wird. Die Codebeispiele sind für eine Windows Forms-Anwendung vorgesehen. Diese Anwendung zeigt keine realen Szenarien wie die Verwendung von Smartcards. Stattdessen veranschaulicht sie die Grundlagen der Ver- und Entschlüsselung.

Diese exemplarische Vorgehensweise verwendet die folgenden Richtlinien für Verschlüsselung:

  • Mit der RijndaelManaged-Klasse, einem symmetrischen Algorithmus, können Sie Daten ver- und entschlüsseln, indem Sie den automatisch generierten Key und IV verwenden.

  • Mit RSACryptoServiceProvider, einem asymmetrischen Algorithmus, können Sie den Schlüssel für die durch RijndaelManaged verschlüsselten Daten ver- und entschlüsseln. Asymmetrische Algorithmen können am besten für kleinere Datenmengen, zum Beispiel einen Schlüssel, verwendet werden.

    Hinweis:

    Wenn Sie Daten auf Ihrem Computer schützen möchten, anstatt mit anderen Personen verschlüsselte Inhalte auszutauschen, ziehen Sie in Erwägung, die ProtectedData-Klasse oder die ProtectedMemory-Klasse zu verwenden.

In der folgenden Tabelle werden die kryptografischen Aufgaben in diesem Thema zusammengefasst.

Aufgabe

Beschreibung

Erstellen einer Windows Forms-Anwendung

Listet die Steuerelemente auf, die zur Ausführung der Anwendung erforderlich sind.

Deklarieren von globalen Objekten

Deklariert Zeichenfolgenpfadvariablen, die CspParameters und den RSACryptoServiceProvider für den globalen Kontext der Form-Klasse.

Erstellen eines asymmetrischen Schlüssels

Erstellt ein asymmetrisches öffentliches und privates Schlüsselwertpaar und weist ihm einen Schlüsselcontainernamen zu.

Verschlüsseln einer Datei

Zeigt ein Dialogfeld an, in dem eine Datei für die Verschlüsselung ausgewählt wird, und verschlüsselt die Datei.

Entschlüsseln einer Datei

Zeigt ein Dialogfeld an, in dem eine verschlüsselte Datei für die Entschlüsselung ausgewählt wird, und entschlüsselt die Datei.

Abrufen eines privaten Schlüssels

Ruft das volle Schlüsselpaar mit dem Schlüsselcontainernamen ab.

Exportieren eines öffentlichen Schlüssels

Speichert den Schlüssel in einer XML-Datei mit ausschließlich öffentlichen Parametern.

Importieren eines öffentlichen Schlüssels

Lädt den Schlüssel aus einer XML-Datei in den Schlüsselcontainer.

Testen der Anwendung

Listet Verfahren zum Testen dieser Anwendung auf.

Vorbereitungsmaßnahmen

Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie die folgenden Komponenten:

Erstellen einer Windows Forms-Anwendung

Die meisten Codebeispiele in dieser exemplarischen Vorgehensweise sind als Ereignishandler für Button-Steuerelemente konzipiert. In der folgenden Tabelle sind die Steuerelemente aufgelistet, die für die Beispielanwendung und die erforderlichen Namen benötigt werden, um mit den Codebeispielen übereinzustimmen.

Steuerelement

Name

Texteigenschaft (nach Bedarf)

Button

buttonEncryptFile

Datei verschlüsseln

Button

buttonDecryptFile

Datei entschlüsseln

Button

buttonCreateAsmKeys

Schlüssel erstellen

Button

buttonExportPublicKey

Öffentlichen Schlüssel exportieren

Button

buttonImportPublicKey

Öffentlichen Schlüssel importieren

Button

buttonGetPrivateKey

Privaten Schlüssel abrufen

Label

label1

OpenFileDialog

openFileDialog1

OpenFileDialog

openFileDialog2

Doppelklicken Sie auf die Schaltflächen im Visual Studio-Designer, um ihre Ereignishandler zu erstellen.

Deklarieren von globalen Objekten

Fügen Sie das folgende Codebeispiel dem Form-Konstruktor hinzu. Bearbeiten Sie die Zeichenfolgenvariablen für die Umgebung und die Einstellungen.

' Declare CspParmeters and RsaCryptoServiceProvider 
' objects with global scope of your Form class.
Dim cspp As CspParameters = New System.Security.Cryptography.CspParameters
Dim rsa As RSACryptoServiceProvider

' Path variables for source, encryption, and
' decryption folders. Must end with a backslash.
Dim EncrFolder As String = "c:\Encrypt\"
Dim DecrFolder As String = "c:\Decrypt\"
Dim SrcFolder As String = "c:\docs\"

' Public key file
Dim PubKeyFile As String = "c:\encrypt\rsaPublicKey.txt"

' Key container name for
' private/public key value pair.
Dim keyName As String = "Key01"
// Declare CspParmeters and RsaCryptoServiceProvider
// objects with global scope of your Form class.
CspParameters cspp = new CspParameters();
RSACryptoServiceProvider rsa;

// Path variables for source, encryption, and
// decryption folders. Must end with a backslash.
const string EncrFolder = @"c:\Encrypt\";
const string DecrFolder = @"c:\Decrypt\";
const string SrcFolder = @"c:\docs\";

// Public key file
const string PubKeyFile = @"c:\encrypt\rsaPublicKey.txt";

// Key container name for
// private/public key value pair.
const string keyName = "Key01";

Erstellen eines asymmetrischen Schlüssels

Mit dieser Aufgabe wird ein asymmetrischer Schlüssel erstellt, der den RijndaelManaged-Schlüssel ver- und entschlüsselt. Dieser Schlüssel wurde zum Verschlüsseln des Inhalts verwendet und zeigt den Schlüsselcontainernamen auf dem Label-Steuerelement an.

Fügen Sie als Click-Ereignishandler für die Schaltfläche Create Keys (buttonCreateAsmKeys_Click) folgenden Code hinzu:

Private Sub buttonCreateAsmKeys_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonCreateAsmKeys.Click
    ' Stores a key pair in the key container.
    cspp.KeyContainerName = keyName
    rsa = New RSACryptoServiceProvider(cspp)
    rsa.PersistKeyInCsp = True

    If rsa.PublicOnly = True Then
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only"
    Else
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair"
    End If

End Sub
private void buttonCreateAsmKeys_Click(object sender, System.EventArgs e)
{
    // Stores a key pair in the key container.
    cspp.KeyContainerName = keyName;
    rsa = new RSACryptoServiceProvider(cspp);
    rsa.PersistKeyInCsp = true;
    if (rsa.PublicOnly == true)
       label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only";
    else
       label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair";

}

Verschlüsseln einer Datei

Diese Aufgabe enthält zwei Methoden: die Eventhandler-Methode für die Schaltfläche Encrypt File (buttonEncryptFile_Click) und die EncryptFile-Methode. Die erste Methode zeigt ein Dialogfeld zum Auswählen einer Datei an und übergibt den Dateinamen an die zweite Methode, die die Verschlüsselung durchführt.

Verschlüsselter Inhalt, Schlüssel und IV werden zusammen in einem FileStream gespeichert, der als Verschlüsselungspaket bezeichnet wird.

Die EncryptFile-Methode führt folgende Schritte aus:

  1. Erstellt einen symmetrischen RijndaelManaged-Algorithmus, um den Inhalt zu verschlüsseln.

  2. Erstellt ein RSACryptoServiceProvider-Objekt, um den RijndaelManaged-Schlüssel zu verschlüsseln.

  3. Verwendet ein CryptoStream-Objekt, um den FileStream der Quelldatei in Byteblöcken einzulesen und in einen Ziel-FileStream-Objekt für die verschlüsselte Datei zu verschlüsseln.

  4. Bestimmt die Längen von verschlüsseltem Schlüssel und IV und erstellt Bytearrays ihrer Längenwerte.

  5. Schreibt Schlüssel, IV und ihre Längenwerte ins verschlüsselte Paket.

Das Verschlüsselungspaket hat das folgende Format:

  • Schlüssellänge, Bytes 0 - 3

  • IV-Länge, Bytes 4 - 7

  • Verschlüsselter Schlüssel

  • IV

  • Verschlüsselungstext

Durch die Längenangaben von Schlüssel und IV lassen sich Startpunkte und Längen aller Teile des Verschlüsselungspakets bestimmen. Diese können dann zum Entschlüsseln der Datei genutzt werden.

Fügen Sie als Click-Ereignishandler für die Schaltfläche Encrypt File (buttonEncryptFile_Click) folgenden Code hinzu:

Private Sub buttonEncryptFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonEncryptFile.Click
    If rsa Is Nothing Then
        MsgBox("Key not set.")
    Else
        ' Display a dialog box to select a file to encrypt.
        OpenFileDialog1.InitialDirectory = SrcFolder
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Try
                Dim fName As String = OpenFileDialog1.FileName
                If (Not (fName) Is Nothing) Then
                    Dim fInfo As FileInfo = New FileInfo(fName)
                    ' Use just the file name without path.
                    Dim name As String = fInfo.Name
                    EncryptFile(name)
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End If
    End If
End Sub
private void buttonEncryptFile_Click(object sender, System.EventArgs e)
{
    if (rsa == null)
        MessageBox.Show("Key not set.");
    else
    {

        // Display a dialog box to select a file to encrypt.
        openFileDialog1.InitialDirectory = SrcFolder;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string fName = openFileDialog1.FileName;
            if (fName != null)
            {
                FileInfo fInfo = new FileInfo(fName);
                // Pass the file name without the path.
                string name = fInfo.Name;
                EncryptFile(name);
            }
        }
    }
}

Fügen Sie die folgende EncryptFile-Methode dem Formular hinzu.

Private Sub EncryptFile(ByVal inFile As String)

    ' Create instance of Rijndael for
    ' symetric encryption of the data.
    Dim rjndl As RijndaelManaged = New RijndaelManaged
    rjndl.KeySize = 256
    rjndl.BlockSize = 256
    rjndl.Mode = CipherMode.CBC
    Dim transform As ICryptoTransform = rjndl.CreateEncryptor

    ' Use RSACryptoServiceProvider to 
    ' enrypt the Rijndael key.
    Dim keyEncrypted() As Byte = rsa.Encrypt(rjndl.Key, False)

    ' Create byte arrays to contain
    ' the length values of the key and IV.
    Dim LenK() As Byte = New Byte((4) - 1) {}
    Dim LenIV() As Byte = New Byte((4) - 1) {}
    Dim lKey As Integer = keyEncrypted.Length
    LenK = BitConverter.GetBytes(lKey)
    Dim lIV As Integer = rjndl.IV.Length
    LenIV = BitConverter.GetBytes(lIV)

    ' Write the following to the FileStream
    ' for the encrypted file (outFs):
    ' - length of the key
    ' - length of the IV
    ' - ecrypted key
    ' - the IV
    ' - the encrypted cipher content
    ' Change the file's extension to ".enc"

    Dim outFile As String = (EncrFolder _
                + (inFile.Substring(0, inFile.LastIndexOf(".")) + ".enc"))

    Using outFs As FileStream = New FileStream(outFile, FileMode.Create)

        outFs.Write(LenK, 0, 4)
        outFs.Write(LenIV, 0, 4)
        outFs.Write(keyEncrypted, 0, lKey)
        outFs.Write(rjndl.IV, 0, lIV)

        ' Now write the cipher text using
        ' a CryptoStream for encrypting.
        Using outStreamEncrypted As CryptoStream = New CryptoStream(outFs, transform, CryptoStreamMode.Write)
            ' By encrypting a chunk at
            ' a time, you can save memory
            ' and accommodate large files.
            Dim count As Integer = 0
            Dim offset As Integer = 0

            ' blockSizeBytes can be any arbitrary size.
            Dim blockSizeBytes As Integer = (rjndl.BlockSize / 8)
            Dim data() As Byte = New Byte((blockSizeBytes) - 1) {}
            Dim bytesRead As Integer = 0
            Using inFs As FileStream = New FileStream(inFile, FileMode.Open)
                Do
                    count = inFs.Read(data, 0, blockSizeBytes)
                    offset = (offset + count)
                    outStreamEncrypted.Write(data, 0, count)
                    bytesRead = (bytesRead + blockSizeBytes)
                Loop Until (count = 0)

                outStreamEncrypted.FlushFinalBlock()
                inFs.Close()
            End Using
            outStreamEncrypted.Close()
        End Using
        outFs.Close()
    End Using
End Sub
private void EncryptFile(string inFile)
{

    // Create instance of Rijndael for
    // symetric encryption of the data.
    RijndaelManaged rjndl = new RijndaelManaged();
    rjndl.KeySize = 256;
    rjndl.BlockSize = 256;
    rjndl.Mode = CipherMode.CBC;
    ICryptoTransform transform = rjndl.CreateEncryptor();

    // Use RSACryptoServiceProvider to
    // enrypt the Rijndael key.
    byte[] keyEncrypted = rsa.Encrypt(rjndl.Key, false);

    // Create byte arrays to contain
    // the length values of the key and IV.
    byte[] LenK = new byte[4];
    byte[] LenIV = new byte[4];

    int lKey = keyEncrypted.Length;
    LenK = BitConverter.GetBytes(lKey);
    int lIV = rjndl.IV.Length;
    LenIV = BitConverter.GetBytes(lIV);

    // Write the following to the FileStream
    // for the encrypted file (outFs):
    // - length of the key
    // - length of the IV
    // - ecrypted key
    // - the IV
    // - the encrypted cipher content

   // Change the file's extension to ".enc"
    string outFile = EncrFolder + inFile.Substring(0, inFile.LastIndexOf(".")) + ".enc";

    using (FileStream outFs = new FileStream(outFile, FileMode.Create))
    {

            outFs.Write(LenK, 0, 4);
            outFs.Write(LenIV, 0, 4);
            outFs.Write(keyEncrypted, 0, lKey);
            outFs.Write(rjndl.IV, 0, lIV);

            // Now write the cipher text using
            // a CryptoStream for encrypting.
            using (CryptoStream outStreamEncrypted = new CryptoStream(outFs, transform, CryptoStreamMode.Write))
            {

                // By encrypting a chunk at
                // a time, you can save memory
                // and accommodate large files.
                int count = 0;
                int offset = 0;

                // blockSizeBytes can be any arbitrary size.
                int blockSizeBytes = rjndl.BlockSize / 8;
                byte[] data = new byte[blockSizeBytes];
                int bytesRead = 0;

                using (FileStream inFs = new FileStream(inFile, FileMode.Open))
                {
                    do
                    {
                        count = inFs.Read(data, 0, blockSizeBytes);
                        offset += count;
                        outStreamEncrypted.Write(data, 0, count);
                        bytesRead += blockSizeBytes;
                    }
                    while (count > 0);
                inFs.Close();
                }
                outStreamEncrypted.FlushFinalBlock();
                outStreamEncrypted.Close();
            }
            outFs.Close();
    }

}

Entschlüsseln einer Datei

Diese Aufgabe enthält zwei Methoden: die Eventhandlermethode für die Schaltfläche Decrypt File (buttonEncryptFile_Click) und die DecryptFile-Methode. Die erste Methode zeigt ein Dialogfeld zum Auswählen einer Datei an und übergibt den Dateinamen an die zweite Methode, die die Entschlüsselung durchführt.

Die Decrypt-Methode führt folgende Schritte aus:

  1. Erstellt einen symmetrischen RijndaelManaged-Algorithmus, um den Inhalt zu entschlüsseln.

  2. Liest die ersten acht Bytes vom FileStream des verschlüsselten Pakets in Bytearrays, um die Längen von verschlüsseltem Schlüssel und IV zu erhalten.

  3. Extrahiert Schlüssel und IV aus dem Verschlüsselungspaket in Bytearrays.

  4. Erstellt ein RSACryptoServiceProvider-Objekt, um den RijndaelManaged-Schlüssel zu entschlüsseln.

  5. Verwendet ein CryptoStream-Objekt, um den Abschnitt mit dem Verschlüsselungstext des FileStream-Verschlüsselungspakets in Byteblöcken einzulesen und im FileStream-Objekt für die verschlüsselte Datei zu entschlüsseln. Nach Abschluss dieses Vorgangs ist die Entschlüsselung abgeschlossen.

Fügen Sie als Click-Ereignishandler für die Schaltfläche Decrypt File folgenden Code hinzu:

Private Sub buttonDecryptFile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonDecryptFile.Click
    If rsa Is Nothing Then
        MsgBox("Key not set.")
    Else
        ' Display a dialog box to select the encrypted file.
        OpenFileDialog2.InitialDirectory = EncrFolder
        If (OpenFileDialog2.ShowDialog = Windows.Forms.DialogResult.OK) Then
            Try
                Dim fName As String = OpenFileDialog2.FileName
                If (Not (fName) Is Nothing) Then
                    Dim fi As FileInfo = New FileInfo(fName)
                    Dim name As String = fi.Name
                    DecryptFile(name)
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End If
    End If
End Sub
private void buttonDecryptFile_Click(object sender, EventArgs e)
{
    if (rsa == null)
        MessageBox.Show("Key not set.");
    else
    {
        // Display a dialog box to select the encrypted file.
        openFileDialog2.InitialDirectory = EncrFolder;
        if (openFileDialog2.ShowDialog() == DialogResult.OK)
        {
            string fName = openFileDialog2.FileName;
            if (fName != null)
            {
                FileInfo fi = new FileInfo(fName);
                string name = fi.Name;
                DecryptFile(name);
            }
        }
    }
}

Fügen Sie die folgende DecryptFile-Methode dem Formular hinzu.

Private Sub DecryptFile(ByVal inFile As String)
    ' Create instance of Rijndael for
    ' symetric decryption of the data.
    Dim rjndl As RijndaelManaged = New RijndaelManaged
    rjndl.KeySize = 256
    rjndl.BlockSize = 256
    rjndl.Mode = CipherMode.CBC

    ' Create byte arrays to get the length of
    ' the encrypted key and IV.
    ' These values were stored as 4 bytes each
    ' at the beginning of the encrypted package.
    Dim LenK() As Byte = New Byte(4 - 1) {}
    Dim LenIV() As Byte = New Byte(4 - 1) {}

    ' Construct the file name for the decrypted file.
    Dim outFile As String = (DecrFolder _
                + (inFile.Substring(0, inFile.LastIndexOf(".")) + ".txt"))

    ' Use FileStream objects to read the encrypted
    ' file (inFs) and save the decrypted file (outFs).
    Using inFs As FileStream = New FileStream((EncrFolder + inFile), FileMode.Open)

        inFs.Seek(0, SeekOrigin.Begin)
        inFs.Read(LenK, 0, 3)
        inFs.Seek(4, SeekOrigin.Begin)
        inFs.Read(LenIV, 0, 3)

        Dim lengthK As Integer = BitConverter.ToInt32(LenK, 0)
        Dim lengthIV As Integer = BitConverter.ToInt32(LenIV, 0)
        Dim startC As Integer = (lengthK + lengthIV + 8)
        Dim lenC As Integer = (CType(inFs.Length, Integer) - startC)
        Dim KeyEncrypted() As Byte = New Byte(lengthK - 1) {}
        Dim IV() As Byte = New Byte(lengthIV - 1) {}

        ' Extract the key and IV
        ' starting from index 8
        ' after the length values.
        inFs.Seek(8, SeekOrigin.Begin)
        inFs.Read(KeyEncrypted, 0, lengthK)
        inFs.Seek(8 + lengthK, SeekOrigin.Begin)
        inFs.Read(IV, 0, lengthIV)
        Dim KeyDecrypted() As Byte = rsa.Decrypt(KeyEncrypted, False)

        ' Decrypt the key.
        Dim transform As ICryptoTransform = rjndl.CreateDecryptor(KeyDecrypted, IV)

        ' Decrypt the cipher text from
        ' from the FileSteam of the encrypted
        ' file (inFs) into the FileStream
        ' for the decrypted file (outFs).
        Using outFs As FileStream = New FileStream(outFile, FileMode.Create)
            Dim count As Integer = 0
            Dim offset As Integer = 0

            ' blockSizeBytes can be any arbitrary size.
            Dim blockSizeBytes As Integer = (rjndl.BlockSize / 8)
            Dim data() As Byte = New Byte(blockSizeBytes - 1) {}
            ' By decrypting a chunk a time,
            ' you can save memory and
            ' accommodate large files.
            ' Start at the beginning
            ' of the cipher text.
            inFs.Seek(startC, SeekOrigin.Begin)
            Using outStreamDecrypted As CryptoStream = New CryptoStream(outFs, transform, CryptoStreamMode.Write)
                Do
                    count = inFs.Read(data, 0, blockSizeBytes)
                    offset = (offset + count)
                    outStreamDecrypted.Write(data, 0, count)
                Loop Until (count = 0)

                outStreamDecrypted.FlushFinalBlock()
                outStreamDecrypted.Close()
            End Using
            outFs.Close()
        End Using
        inFs.Close()
    End Using
End Sub
private void DecryptFile(string inFile)
{

    // Create instance of Rijndael for
    // symetric decryption of the data.
    RijndaelManaged rjndl = new RijndaelManaged();
    rjndl.KeySize = 256;
    rjndl.BlockSize = 256;
    rjndl.Mode = CipherMode.CBC;
    rjndl.Padding = PaddingMode.None;

    // Create byte arrays to get the length of
    // the encrypted key and IV.
    // These values were stored as 4 bytes each
    // at the beginning of the encrypted package.
    byte[] LenK = new byte[4];
    byte[] LenIV = new byte[4];

    // Consruct the file name for the decrypted file.
    string outFile = DecrFolder + inFile.Substring(0, inFile.LastIndexOf(".")) + ".txt";

    // Use FileStream objects to read the encrypted
    // file (inFs) and save the decrypted file (outFs).
    using (FileStream inFs = new FileStream(EncrFolder + inFile, FileMode.Open))
    {

        inFs.Seek(0, SeekOrigin.Begin);
        inFs.Seek(0, SeekOrigin.Begin);
        inFs.Read(LenK, 0, 3);
        inFs.Seek(4, SeekOrigin.Begin);
        inFs.Read(LenIV, 0, 3);

        // Convert the lengths to integer values.
        int lenK = BitConverter.ToInt32(LenK, 0);
        int lenIV = BitConverter.ToInt32(LenIV, 0);

        // Determine the start postition of
        // the ciphter text (startC)
        // and its length(lenC).
        int startC = lenK + lenIV + 8;
        int lenC = (int)inFs.Length - startC;

        // Create the byte arrays for
        // the encrypted Rijndael key,
        // the IV, and the cipher text.
        byte[] KeyEncrypted = new byte[lenK];
        byte[] IV = new byte[lenIV];

        // Extract the key and IV
        // starting from index 8
        // after the length values.
        inFs.Seek(8, SeekOrigin.Begin);
        inFs.Read(KeyEncrypted, 0, lenK);
        inFs.Seek(8 + lenK, SeekOrigin.Begin);
        inFs.Read(IV, 0, lenIV);

        // Use RSACryptoServiceProvider
        // to decrypt the Rijndael key.
        byte[] KeyDecrypted = rsa.Decrypt(KeyEncrypted, false);

        // Decrypt the key.
        ICryptoTransform transform = rjndl.CreateDecryptor(KeyDecrypted, IV);

        // Decrypt the cipher text from
        // from the FileSteam of the encrypted
        // file (inFs) into the FileStream
        // for the decrypted file (outFs).
        using (FileStream outFs = new FileStream(outFile, FileMode.Create))
        {

            int count = 0;
            int offset = 0;

            // blockSizeBytes can be any arbitrary size.
            int blockSizeBytes = rjndl.BlockSize / 8;
            byte[] data = new byte[blockSizeBytes];


            // By decrypting a chunk a time,
            // you can save memory and
            // accommodate large files.

            // Start at the beginning
            // of the cipher text.
            inFs.Seek(startC, SeekOrigin.Begin);
            using (CryptoStream outStreamDecrypted = new CryptoStream(outFs, transform, CryptoStreamMode.Write))
            {
                do
                {
                    count = inFs.Read(data, 0, blockSizeBytes);
                    offset += count;
                    outStreamDecrypted.Write(data, 0, count);

                }
                while (count > 0);

                outStreamDecrypted.FlushFinalBlock();
                outStreamDecrypted.Close();
            }
            outFs.Close();
        }
        inFs.Close();
    }

}

Exportieren eines öffentlichen Schlüssels

Diese Aufgabe speichert den von der Schaltfläche Create Keys erstellten Schlüssel in einer Datei. Sie exportiert nur die öffentlichen Parameter.

Diese Aufgabe simuliert das Szenario, dass Alice ihren öffentlichen Schlüssel Bob gibt, sodass er Dateien an sie verschlüsseln kann. Er und andere, die im Besitz dieses öffentlichen Schlüssels sind, können die Dateien nicht entschlüsseln, da sie nicht das vollständige Schlüsselpaar mit privaten Parametern besitzen.

Fügen Sie als Click-Ereignishandler für die Schaltfläche Export Public Key (buttonExportPublicKey_Click) folgenden Code hinzu:

Private Sub buttonExportPublicKey_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonExportPublicKey.Click
    ' Save the public key created by the RSA
    ' to a file. Caution, persisting the
    ' key to a file is a security risk.
    Dim sw As StreamWriter = New StreamWriter(PubKeyFile)
    sw.Write(rsa.ToXmlString(False))
    sw.Close()
End Sub
void buttonExportPublicKey_Click(object sender, System.EventArgs e)
{
    // Save the public key created by the RSA
    // to a file. Caution, persisting the
    // key to a file is a security risk.
    StreamWriter sw = new StreamWriter(PubKeyFile);
    sw.Write(rsa.ToXmlString(false));
    sw.Close();
}

Importieren eines öffentlichen Schlüssels

Diese Aufgabe lädt den Schlüssel mit ausschließlich öffentlichen Parametern, wie mit der Schaltfläche Export Public Key erstellt, und legt ihn als Schlüsselcontainernamen fest.

Diese Aufgabe simuliert das Szenario, dass Bob den Schlüssel von Alice mit ausschließlich öffentlichen Parametern lädt, sodass er Dateien an sie verschlüsseln kann.

Fügen Sie als Click-Ereignishandler für die Schaltfläche Import Public Key (buttonImportPublicKey_Click) folgenden Code hinzu:

Private Sub buttonImportPublicKey_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonImportPublicKey.Click
    Dim sr As StreamReader = New StreamReader(PubKeyFile)
    cspp.KeyContainerName = keyName
    rsa = New RSACryptoServiceProvider(cspp)
    Dim keytxt As String = sr.ReadToEnd
    rsa.FromXmlString(keytxt)
    rsa.PersistKeyInCsp = True
    If rsa.PublicOnly = True Then
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only"
    Else
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair"
    End If
    sr.Close()
End Sub
void buttonImportPublicKey_Click(object sender, System.EventArgs e)
{
    StreamReader sr = new StreamReader(PubKeyFile);
    cspp.KeyContainerName = keyName;
    rsa = new RSACryptoServiceProvider(cspp);
    string keytxt = sr.ReadToEnd();
    rsa.FromXmlString(keytxt);
    rsa.PersistKeyInCsp = true;
    if (rsa.PublicOnly == true)
        label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only";
    else
        label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair";
    sr.Close();
}

Abrufen eines privaten Schlüssels

Diese Aufgabe legt den Schlüsselcontainernamen auf den Namen des Schlüssels fest, der mit der Schaltfläche Create Keys erstellt wurde. Der Schlüsselcontainer enthält das komplette Schlüsselpaar mit privaten Parametern.

Diese Aufgabe simuliert das Szenario, dass Alice mit ihrem privaten Schlüssel die von Bob verschlüsselten Dateien entschlüsselt.

Fügen Sie als Click-Ereignishandler für die Schaltfläche Get Private Key (buttonGetPrivateKey_Click) folgenden Code hinzu:

Private Sub buttonGetPrivateKey_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles buttonGetPrivateKey.Click
    cspp.KeyContainerName = keyName
    rsa = New RSACryptoServiceProvider(cspp)
    rsa.PersistKeyInCsp = True
    If rsa.PublicOnly = True Then
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only"
    Else
        Label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair"
    End If
End Sub
private void buttonGetPrivateKey_Click(object sender, EventArgs e)
{
    cspp.KeyContainerName = keyName;

    rsa = new RSACryptoServiceProvider(cspp);
    rsa.PersistKeyInCsp = true;

    if (rsa.PublicOnly == true)
        label1.Text = "Key: " + cspp.KeyContainerName + " - Public Only";
    else
        label1.Text = "Key: " + cspp.KeyContainerName + " - Full Key Pair";

}

Testen der Anwendung

Nachdem Sie die Anwendung erstellt haben, führen Sie die folgenden Testszenarien aus.

So erstellen Sie Schlüssel, so ver- und entschlüsseln Sie

  1. Klicken Sie auf die Schaltfläche Create Keys. Die Bezeichnung zeigt den Schlüsselnamen an und dass es sich um ein vollständiges Schlüsselpaar handelt.

  2. Klicken Sie auf die Schaltfläche Export Public Key. Beachten Sie, dass das Exportieren der öffentlichen Schlüsselparameter den aktuellen Schlüssel nicht ändert.

  3. Klicken Sie auf die Schaltfläche Encrypt File, und wählen Sie eine Datei aus.

  4. Klicken Sie auf die Schaltfläche Decrypt File, und wählen Sie die gerade verschlüsselte Datei aus.

  5. Überprüfen Sie die gerade entschlüsselte Datei.

  6. Schließen Sie die Anwendung, und starten Sie sie wieder, um das Abrufen von beibehaltenen Schlüsselcontainern im nächsten Szenario zu testen.

So verschlüsseln Sie mit dem öffentlichen Schlüssel

  1. Klicken Sie auf die Schaltfläche Import Public Key. Die Bezeichnung zeigt den Schlüsselnamen an und dass es sich ausschließlich um den öffentlichen Schlüssel handelt.

  2. Klicken Sie auf die Schaltfläche Encrypt File, und wählen Sie eine Datei aus.

  3. Klicken Sie auf die Schaltfläche Decrypt File, und wählen Sie die gerade verschlüsselte Datei aus. Dies kann nicht durchgeführt werden, da Sie zum Entschlüsseln den privaten Schlüssel haben müssen.

Dieses Szenario veranschaulicht, wie mit ausschließlich dem öffentlichen Schlüssel eine Datei für eine andere Person verschlüsselt wird. Normalerweise würde diese Person Ihnen nur den öffentlichen Schlüssel geben und den nicht weitergegebenen privaten Schlüssel zur Entschlüsselung verwenden.

So entschlüsseln Sie mit dem privaten Schlüssel

  1. Klicken Sie auf die Schaltfläche Get Private Key. Die Bezeichnung zeigt den Schlüsselnamen an und ob es sich um das vollständige Schlüsselpaar handelt.

  2. Klicken Sie auf die Schaltfläche Decrypt File, und wählen Sie die gerade verschlüsselte Datei aus. Dies kann durchgeführt werden, da Sie das vollständige Schlüsselpaar zum Entschlüsseln besitzen.

Siehe auch

Weitere Ressourcen

Kryptografische Aufgaben

Kryptografische Dienste