Walkthrough: Een cryptografische toepassing maken

Notitie

Dit artikel is van toepassing op Windows.

Zie ASP.NET Core Data Protection voor meer informatie over ASP.NET Core.

In dit scenario ziet u hoe u de inhoud van een bestand versleutelt en ontsleutelt. De codevoorbeelden zijn ontworpen voor een Windows Forms-toepassing. Deze toepassing demonstreert geen praktijkscenario's, zoals het gebruik van smartcards. In plaats daarvan worden de basisprincipes van versleuteling en ontsleuteling gedemonstreert.

In dit scenario worden de volgende richtlijnen voor versleuteling gebruikt:

  • Gebruik de Aes klasse, een symmetrisch algoritme, om gegevens te versleutelen en te ontsleutelen met behulp van de automatisch gegenereerde Key en IV.

  • Gebruik het RSA asymmetrische algoritme om de sleutel van de gegevens te versleutelen en te ontsleutelen die zijn versleuteld door Aes. Asymmetrische algoritmen kunnen het beste worden gebruikt voor kleinere hoeveelheden gegevens, zoals een sleutel.

    Notitie

    Als u gegevens op uw computer wilt beveiligen in plaats van versleutelde inhoud uit te wisselen met anderen, kunt u overwegen de ProtectedData klasse te gebruiken.

De volgende tabel bevat een overzicht van de cryptografische taken in dit onderwerp.

Taak Beschrijving
Een Windows Forms-toepassing maken Een lijst met de besturingselementen die nodig zijn om de toepassing uit te voeren.
Globale objecten declareren Declareert tekenreekspadvariabelen, de CspParameters, en de RSACryptoServiceProvider om globale context van de Form klasse te hebben.
Een asymmetrische sleutel maken Hiermee maakt u een asymmetrisch openbaar en persoonlijk sleutel-waardepaar en wijst u hieraan een sleutelcontainernaam toe.
Een bestand versleutelen Geeft een dialoogvenster weer om een bestand voor versleuteling te selecteren en versleutelt het bestand.
Een bestand ontsleutelen Geeft een dialoogvenster weer om een versleuteld bestand te selecteren voor ontsleuteling en ontsleutelt het bestand.
Een persoonlijke sleutel ophalen Hiermee haalt u het volledige sleutelpaar op met behulp van de naam van de sleutelcontainer.
Een openbare sleutel exporteren Slaat de sleutel op in een XML-bestand met alleen openbare parameters.
Een openbare sleutel importeren Laadt de sleutel uit een XML-bestand in de sleutelcontainer.
De toepassing testen Bevat procedures voor het testen van deze toepassing.

Vereisten

U hebt de volgende onderdelen nodig om dit scenario te voltooien:

Een Windows Forms-toepassing maken

De meeste codevoorbeelden in dit scenario zijn ontworpen als gebeurtenis-handlers voor knopbesturingselementen. De volgende tabel bevat de besturingselementen die vereist zijn voor de voorbeeldtoepassing en de vereiste namen die overeenkomen met de codevoorbeelden.

Controle Naam Teksteigenschap (indien nodig)
Button buttonEncryptFile Bestand versleutelen
Button buttonDecryptFile Bestand ontsleutelen
Button buttonCreateAsmKeys Sleutels maken
Button buttonExportPublicKey Openbare sleutel exporteren
Button buttonImportPublicKey Openbare sleutel importeren
Button buttonGetPrivateKey Persoonlijke sleutel ophalen
Label label1 Sleutel niet ingesteld
OpenFileDialog _encryptOpenFileDialog
OpenFileDialog _decryptOpenFileDialog

Dubbelklik op de knoppen in de Visual Studio Designer om de bijbehorende gebeurtenis-handlers te maken.

Globale objecten declareren

Voeg de volgende code toe als onderdeel van de declaratie van de klasse Form1. Bewerk de tekenreeksvariabelen voor uw omgeving en voorkeuren.

// Declare CspParameters and RsaCryptoServiceProvider
// objects with global scope of your Form class.
readonly 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";
' Declare CspParameters and RsaCryptoServiceProvider
' objects with global scope of your Form class.
ReadOnly _cspp As New CspParameters
Dim _rsa As RSACryptoServiceProvider

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

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

' Key container name for
' private/public key value pair.
Const KeyName As String = "Key01"

Een asymmetrische sleutel maken

Met deze taak maakt u een asymmetrische sleutel waarmee de Aes sleutel wordt versleuteld en ontsleuteld. Deze sleutel is gebruikt om de inhoud te versleutelen en de naam van de sleutelcontainer wordt weergegeven op het label-besturingselement.

Voeg de volgende code toe als gebeurtenis-handler Click voor de Create Keys knop (buttonCreateAsmKeys_Click).

private void buttonCreateAsmKeys_Click(object sender, EventArgs e)
{
    // Stores a key pair in the key container.
    _cspp.KeyContainerName = KeyName;
    _rsa = new RSACryptoServiceProvider(_cspp)
    {
        PersistKeyInCsp = true
    };

    label1.Text = _rsa.PublicOnly
        ? $"Key: {_cspp.KeyContainerName} - Public Only"
        : $"Key: {_cspp.KeyContainerName} - Full Key Pair";
}
Private Sub buttonCreateAsmKeys_Click(ByVal sender As Object, ByVal e As EventArgs) Handles buttonCreateAsmKeys.Click
    ' Stores a key pair in the key container.
    _cspp.KeyContainerName = KeyName
    _rsa = New RSACryptoServiceProvider(_cspp) With {
        .PersistKeyInCsp = True
    }

    If _rsa.PublicOnly Then
        Label1.Text = $"Key: {_cspp.KeyContainerName} - Public Only"
    Else
        Label1.Text = $"Key: {_cspp.KeyContainerName} - Full Key Pair"
    End If

End Sub

Een bestand versleutelen

Deze taak omvat twee methoden: de gebeurtenis-handlermethode voor de Encrypt File knop (buttonEncryptFile_Click) en de EncryptFile methode. Met de eerste methode wordt een dialoogvenster weergegeven voor het selecteren van een bestand en wordt de bestandsnaam doorgegeven aan de tweede methode, die de versleuteling uitvoert.

De versleutelde inhoud, sleutel en IV worden allemaal opgeslagen in één FileStream, die het versleutelingspakket wordt genoemd.

De EncryptFile methode doet het volgende:

  1. Hiermee maakt u een Aes symmetrisch algoritme om de inhoud te versleutelen.
  2. Hiermee maakt u een RSACryptoServiceProvider -object om de Aes sleutel te versleutelen.
  3. Hiermee wordt een CryptoStream -object gebruikt om de FileStream van het bronbestand in blokken bytes te lezen en te versleutelen in een doelobject FileStream voor het versleutelde bestand.
  4. Bepaalt de lengte van de versleutelde sleutel en IV en maakt bytematrices van hun lengtewaarden.
  5. Hiermee worden de sleutel, IV en de lengtewaarden naar het versleutelde pakket geschreven.

Het versleutelingspakket gebruikt de volgende indeling:

  • Sleutellengte, bytes 0 - 3
  • IV lengte, bytes 4 - 7
  • Versleutelde sleutel
  • IV
  • Coderingstekst

U kunt de lengten van de sleutel en IV gebruiken om de beginpunten en lengtes van alle onderdelen van het versleutelingspakket te bepalen, die vervolgens kunnen worden gebruikt om het bestand te ontsleutelen.

Voeg de volgende code toe als gebeurtenis-handler Click voor de Encrypt File knop (buttonEncryptFile_Click).

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

Voeg de volgende EncryptFile methode toe aan het formulier.

private void EncryptFile(FileInfo file)
{
    // Create instance of Aes for
    // symmetric encryption of the data.
    Aes aes = Aes.Create();
    ICryptoTransform transform = aes.CreateEncryptor();

    // Use RSACryptoServiceProvider to
    // encrypt the AES key.
    // rsa is previously instantiated:
    //    rsa = new RSACryptoServiceProvider(cspp);
    byte[] keyEncrypted = _rsa.Encrypt(aes.Key, false);

    // Create byte arrays to contain
    // the length values of the key and IV.
    int lKey = keyEncrypted.Length;
    byte[] LenK = BitConverter.GetBytes(lKey);
    int lIV = aes.IV.Length;
    byte[] LenIV = BitConverter.GetBytes(lIV);

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

    // Change the file's extension to ".enc"
    string outFile =
        Path.Combine(EncrFolder, Path.ChangeExtension(file.Name, ".enc"));

    using (var outFs = new FileStream(outFile, FileMode.Create))
    {
        outFs.Write(LenK, 0, 4);
        outFs.Write(LenIV, 0, 4);
        outFs.Write(keyEncrypted, 0, lKey);
        outFs.Write(aes.IV, 0, lIV);

        // Now write the cipher text using
        // a CryptoStream for encrypting.
        using (var 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 = aes.BlockSize / 8;
            byte[] data = new byte[blockSizeBytes];
            int bytesRead = 0;

            using (var inFs = new FileStream(file.FullName, FileMode.Open))
            {
                do
                {
                    count = inFs.Read(data, 0, blockSizeBytes);
                    offset += count;
                    outStreamEncrypted.Write(data, 0, count);
                    bytesRead += blockSizeBytes;
                } while (count > 0);
            }
            outStreamEncrypted.FlushFinalBlock();
        }
    }
}
Private Sub EncryptFile(ByVal inFile As String)
    ' Create instance of Aes for
    ' symmetric encryption of the data.
    Dim aes As Aes = Aes.Create()
    Dim transform As ICryptoTransform = aes.CreateEncryptor

    ' Use RSACryptoServiceProvider to
    ' encrypt the AES key.
    Dim keyEncrypted() As Byte = _rsa.Encrypt(aes.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 = aes.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
    ' - encrypted key
    ' - the IV
    ' - the encrypted cipher content
    ' Change the file's extension to ".enc"
    Dim startFileName As Integer = inFile.LastIndexOf("\") + 1
    Dim outFile As String = (EncrFolder _
                + (inFile.Substring(startFileName, inFile.LastIndexOf(".") - startFileName) + ".enc"))

    Using outFs As New FileStream(outFile, FileMode.Create)
        outFs.Write(LenK, 0, 4)
        outFs.Write(LenIV, 0, 4)
        outFs.Write(keyEncrypted, 0, lKey)
        outFs.Write(aes.IV, 0, lIV)

        ' Now write the cipher text using
        ' a CryptoStream for encrypting.
        Using outStreamEncrypted As 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 = (aes.BlockSize / 8)
            Dim data() As Byte = New Byte((blockSizeBytes) - 1) {}
            Dim bytesRead As Integer = 0
            Using inFs As 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

Een bestand ontsleutelen

Deze taak omvat twee methoden: de gebeurtenis-handlermethode voor de Decrypt File knop (buttonDecryptFile_Click) en de DecryptFile methode. Met de eerste methode wordt een dialoogvenster weergegeven voor het selecteren van een bestand en wordt de bestandsnaam doorgegeven aan de tweede methode, die de ontsleuteling uitvoert.

De Decrypt methode doet het volgende:

  1. Hiermee maakt u een Aes symmetrisch algoritme om de inhoud te ontsleutelen.
  2. Leest de eerste acht bytes van het FileStream versleutelde pakket in bytematrices om de lengten van de versleutelde sleutel en de IV te verkrijgen.
  3. Extraheert de sleutel en IV uit het versleutelingspakket in bytematrices.
  4. Hiermee maakt u een RSACryptoServiceProvider object om de Aes sleutel te ontsleutelen.
  5. Hiermee wordt een CryptoStream -object gebruikt om de sectie coderingstekst van het FileStream versleutelingspakket in blokken bytes te lezen en te ontsleutelen in het FileStream object voor het ontsleutelde bestand. Wanneer dit is voltooid, wordt de ontsleuteling voltooid.

Voeg de volgende code toe als gebeurtenis-handler Click voor de Decrypt File knop.

private void buttonDecryptFile_Click(object sender, EventArgs e)
{
    if (_rsa is null)
    {
        MessageBox.Show("Key not set.");
    }
    else
    {
        // Display a dialog box to select the encrypted file.
        _decryptOpenFileDialog.InitialDirectory = EncrFolder;
        if (_decryptOpenFileDialog.ShowDialog() == DialogResult.OK)
        {
            string fName = _decryptOpenFileDialog.FileName;
            if (fName != null)
            {
                DecryptFile(new FileInfo(fName));
            }
        }
    }
}
Private Sub buttonDecryptFile_Click(ByVal sender As Object, ByVal e As EventArgs) Handles buttonDecryptFile.Click
    If _rsa Is Nothing Then
        MsgBox("Key not set.")
    Else
        ' Display a dialog box to select the encrypted file.
        _decryptOpenFileDialog.InitialDirectory = EncrFolder
        If (_decryptOpenFileDialog.ShowDialog = Windows.Forms.DialogResult.OK) Then
            Try
                Dim fName As String = _decryptOpenFileDialog.FileName
                If ((fName) IsNot Nothing) Then
                    Dim fi As 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

Voeg de volgende DecryptFile methode toe aan het formulier.

private void DecryptFile(FileInfo file)
{
    // Create instance of Aes for
    // symmetric decryption of the data.
    Aes aes = Aes.Create();

    // 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];

    // Construct the file name for the decrypted file.
    string outFile =
        Path.ChangeExtension(file.FullName.Replace("Encrypt", "Decrypt"), ".txt");

    // Use FileStream objects to read the encrypted
    // file (inFs) and save the decrypted file (outFs).
    using (var inFs = new FileStream(file.FullName, FileMode.Open))
    {
        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 position of
        // the cipher text (startC)
        // and its length(lenC).
        int startC = lenK + lenIV + 8;
        int lenC = (int)inFs.Length - startC;

        // Create the byte arrays for
        // the encrypted Aes 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);

        Directory.CreateDirectory(DecrFolder);
        // Use RSACryptoServiceProvider
        // to decrypt the AES key.
        byte[] KeyDecrypted = _rsa.Decrypt(KeyEncrypted, false);

        // Decrypt the key.
        ICryptoTransform transform = aes.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 (var outFs = new FileStream(outFile, FileMode.Create))
        {
            int count = 0;
            int offset = 0;

            // blockSizeBytes can be any arbitrary size.
            int blockSizeBytes = aes.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 (var 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();
            }
        }
    }
}
Private Sub DecryptFile(ByVal inFile As String)
    ' Create instance of Aes for
    ' symmetric decryption of the data.
    Dim aes As Aes = Aes.Create()

    ' 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 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)
        Directory.CreateDirectory(DecrFolder)
        ' User RSACryptoServiceProvider
        ' to decrypt the AES key
        Dim KeyDecrypted() As Byte = _rsa.Decrypt(KeyEncrypted, False)

        ' Decrypt the key.
        Dim transform As ICryptoTransform = aes.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 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 = (aes.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 New CryptoStream(outFs, transform, CryptoStreamMode.Write)
                Do
                    count = inFs.Read(data, 0, blockSizeBytes)
                    offset += count
                    outStreamDecrypted.Write(data, 0, count)
                Loop Until (count = 0)

                outStreamDecrypted.FlushFinalBlock()
            End Using
        End Using
    End Using
End Sub

Een openbare sleutel exporteren

Met deze taak wordt de sleutel die door de Create Keys knop is gemaakt, opgeslagen in een bestand. Alleen de openbare parameters worden geëxporteerd.

Deze taak simuleert het scenario waarbij Alice Bob haar openbare sleutel geeft, zodat hij bestanden voor haar kan versleutelen. Hij en anderen die deze openbare sleutel hebben, kunnen ze niet ontsleutelen omdat ze niet het volledige sleutelpaar met persoonlijke parameters hebben.

Voeg de volgende code toe als gebeurtenis-handler Click voor de Export Public Key knop (buttonExportPublicKey_Click).

void buttonExportPublicKey_Click(object sender, EventArgs e)
{
    // Save the public key created by the RSA
    // to a file. Caution, persisting the
    // key to a file is a security risk.
    Directory.CreateDirectory(EncrFolder);
    using (var sw = new StreamWriter(PubKeyFile, false))
    {
        sw.Write(_rsa.ToXmlString(false));
    }
}
Private Sub buttonExportPublicKey_Click(ByVal sender As Object, ByVal e As 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.
    Directory.CreateDirectory(EncrFolder)
    Using sw As New StreamWriter(PubKeyFile)
        sw.Write(_rsa.ToXmlString(False))
    End Using
End Sub

Een openbare sleutel importeren

Deze taak laadt de sleutel met alleen openbare parameters, zoals gemaakt door de Export Public Key knop, en stelt deze in als de naam van de sleutelcontainer.

Deze taak simuleert het scenario waarbij Bob de sleutel van Alice laadt met alleen openbare parameters, zodat hij bestanden voor haar kan versleutelen.

Voeg de volgende code toe als de Click gebeurtenis-handler voor de Import Public Key knop (buttonImportPublicKey_Click).

void buttonImportPublicKey_Click(object sender, EventArgs e)
{
    using (var sr = new StreamReader(PubKeyFile))
    {
        _cspp.KeyContainerName = KeyName;
        _rsa = new RSACryptoServiceProvider(_cspp);

        string keytxt = sr.ReadToEnd();
        _rsa.FromXmlString(keytxt);
        _rsa.PersistKeyInCsp = true;

        label1.Text = _rsa.PublicOnly
            ? $"Key: {_cspp.KeyContainerName} - Public Only"
            : $"Key: {_cspp.KeyContainerName} - Full Key Pair";
    }
}
Private Sub buttonImportPublicKey_Click(ByVal sender As Object, ByVal e As EventArgs) Handles buttonImportPublicKey.Click
    Using sr As 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 Then
            Label1.Text = $"Key: {_cspp.KeyContainerName} - Public Only"
        Else
            Label1.Text = $"Key: {_cspp.KeyContainerName} - Full Key Pair"
        End If
    End Using
End Sub

Een persoonlijke sleutel ophalen

Met deze taak wordt de naam van de sleutelcontainer ingesteld op de naam van de sleutel die is gemaakt met behulp van de Create Keys knop. De sleutelcontainer bevat het volledige sleutelpaar met persoonlijke parameters.

Deze taak simuleert het scenario waarbij Alice haar persoonlijke sleutel gebruikt om bestanden te ontsleutelen die door Bob zijn versleuteld.

Voeg de volgende code toe als de Click gebeurtenis-handler voor de Get Private Key knop (buttonGetPrivateKey_Click).

private void buttonGetPrivateKey_Click(object sender, EventArgs e)
{
    _cspp.KeyContainerName = KeyName;
    _rsa = new RSACryptoServiceProvider(_cspp)
    {
        PersistKeyInCsp = true
    };

    label1.Text = _rsa.PublicOnly
        ? $"Key: {_cspp.KeyContainerName} - Public Only"
        : $"Key: {_cspp.KeyContainerName} - Full Key Pair";
}
Private Sub buttonGetPrivateKey_Click(ByVal sender As Object,
    ByVal e As EventArgs) Handles buttonGetPrivateKey.Click
    _cspp.KeyContainerName = KeyName
    _rsa = New RSACryptoServiceProvider(_cspp) With {
        .PersistKeyInCsp = True
    }
    If _rsa.PublicOnly Then
        Label1.Text = $"Key: {_cspp.KeyContainerName} - Public Only"
    Else
        Label1.Text = $"Key: {_cspp.KeyContainerName} - Full Key Pair"
    End If
End Sub

De toepassing testen

Nadat u de toepassing hebt gebouwd, voert u de volgende testscenario's uit.

Sleutels maken, versleutelen en ontsleutelen

  1. Klik op de knop Create Keys. Het label geeft de sleutelnaam weer en geeft aan dat het een volledig sleutelpaar is.
  2. Klik op de knop Export Public Key. Houd er rekening mee dat het exporteren van de parameters voor de openbare sleutel de huidige sleutel niet wijzigt.
  3. Klik op de Encrypt File knop en selecteer een bestand.
  4. Klik op de Decrypt File knop en selecteer het zojuist versleutelde bestand.
  5. Bekijk het bestand dat zojuist is ontsleuteld.
  6. Sluit de toepassing en start deze opnieuw om het ophalen van persistente sleutelcontainers in het volgende scenario te testen.

Versleutelen met behulp van de openbare sleutel

  1. Klik op de knop Import Public Key. Het label geeft de sleutelnaam weer en geeft aan dat deze alleen openbaar is.
  2. Klik op de Encrypt File knop en selecteer een bestand.
  3. Klik op de Decrypt File knop en selecteer het zojuist versleutelde bestand. Dit mislukt omdat u de persoonlijke sleutel moet hebben om te kunnen ontsleutelen.

Dit scenario laat zien dat u alleen de openbare sleutel hebt om een bestand voor een andere persoon te versleutelen. Normaal gesproken zou die persoon u alleen de openbare sleutel geven en de persoonlijke sleutel onthouden voor ontsleuteling.

Ontsleutelen met behulp van de persoonlijke sleutel

  1. Klik op de knop Get Private Key. Het label geeft de sleutelnaam weer en geeft aan of het het volledige sleutelpaar is.
  2. Klik op de Decrypt File knop en selecteer het zojuist versleutelde bestand. Dit zal lukken omdat u het volledige sleutelpaar hebt om te ontsleutelen.

Zie ook