Share via


Podrobné pokyny: Vytvoření aplikace pro šifrování

Tento návod ukazuje, jak šifrovat a dešifrovat obsah. Příklady kódu jsou určeny pro aplikace modelu Windows Forms. Tato aplikace neukazuje scénáře skutečného světa, například použití čipových karet. Místo toho ukazuje základní informace o šifrování a dešifrování.

Tento návod používá pro šifrování následující pokyny:

  • Používá třídu RijndaelManaged, symetrický algoritmus k šifrování a dešifrování dat pomocí jeho automaticky generovaného Key a IV.

  • Používá RSACryptoServiceProvider, asymetrický algoritmus pro šifrování a dešifrování klíče k datům šifrovaným RijndaelManaged. Asymetrické algoritmy jsou nejvhodnější pro menší množství dat, jako například klíč.

    PoznámkaPoznámka

    Pokud chcete chránit data v počítači namísto výměny šifrovaného obsahu s jinými uživateli, zvažte použití tříd ProtectedData nebo ProtectedMemory.

Následující tabulka shrnuje kryptografické úlohy v tomto tématu.

Úloha

Popis

Vytvoření aplikace modelu Windows Forms

Jsou uvedeny ovládací prvky, které jsou požadovány ke spuštění aplikace.

Deklarování globálních objektů

Deklaruje proměnné řetězce cesty, CspParameters a RSACryptoServiceProvider, aby byl globální kontext třídy Form.

Vytváření asymetrického klíče

Vytvoří asymetrické veřejné a soukromé hodnoty páru klíče a přiřadí jim název kontejneru klíče.

Šifrování souboru

Zobrazí dialogové okno k vybrání souboru pro šifrování a zašifruje soubor.

Dešifrování souboru

Zobrazí dialogové okno, ve kterém lze vybrat zašifrovaný soubor pro dešifrování a soubor dešifruje.

Získání privátního klíče

Získá úplný pár klíče pomocí názvu kontejneru klíče.

Export veřejného klíče

Klíč uloží do souboru XML s pouze veřejnými parametry.

Import veřejného klíče

Načte klíč do kontejneru klíče ze souboru XML.

Testování aplikace

Uvádí postupy pro testování této aplikace.

Požadavky

Chcete-li dokončit tento návod, potřebujete následující komponenty:

Vytvoření aplikace modelu Windows Forms

Většina z příkladů kódu v tomto návodu jsou navrženy tak, aby byly obslužné rutiny událostí pro tlačítka. V následující tabulce jsou uvedeny ovládací prvky potřebné pro ukázkovou aplikaci a jejich požadované názvy tak, aby odpovídaly příkladům kódu.

Control

Název

Vlastnost Text (podle potřeby)

Button

buttonEncryptFile

Zašifrovat soubor

Button

buttonDecryptFile

Dešifrovat soubor

Button

buttonCreateAsmKeys

Vytvořit klíče

Button

buttonExportPublicKey

Exportovat veřejný klíč

Button

buttonImportPublicKey

Importovat veřejný klíč

Button

buttonGetPrivateKey

Získat soukromý klíč

Label

label1

OpenFileDialog

openFileDialog1

OpenFileDialog

openFileDialog2

Dvakrát klikněte na tlačítka v návrháři sady Visual Studio k vytvoření jejich obslužných rutin událostí.

Deklarování globálních objektů

Přidejte následující kód do konstruktoru formuláře. Upravte proměnné řetězce pro vaše prostředí a předvolby.

' 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";

Vytváření asymetrického klíče

Tato úloha vytvoří asymetrický klíč, který šifruje a dešifruje klíč RijndaelManaged. Tento klíč byl použit k zašifrování obsahu a zobrazuje název kontejneru klíče na ovládacím prvku jmenovka.

Následující kód přidejte jako obslužná rutina události Click pro tlačítko Create Keys (buttonCreateAsmKeys_Click).

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";

}

Šifrování souboru

Tato úloha zahrnuje dvě metody: metoda obslužné rutiny události pro tlačítko Encrypt File (buttonEncryptFile_Click) a metoda EncryptFile. První metoda zobrazí dialogové okno pro výběr souboru a předá název souboru druhé metodě, která provádí šifrování.

Zašifrovaný obsah, klíč a IV jsou všechny ukládány do jednoho FileStream, který je označován jako balíček šifrování.

Metoda EncryptFile provede následující akce:

  1. Vytvoří symetrický algoritmus RijndaelManaged k šifrování obsahu.

  2. Vytvoří objekt RSACryptoServiceProvider pro šifrování klíče RijndaelManaged.

  3. Použije objekt CryptoStream ke čtení a šifrování FileStream zdrojového souboru v blocích bajtů do cílového objektu FileStream pro zašifrovaný soubor.

  4. Určuje délky šifrovaného klíče a IV a vytvoří pole bajtů hodnot jejich délky.

  5. Zapíše klíč, IV a jejich hodnoty délky do šifrovaného balíčku.

Šifrovaný balíček používá následující formát:

  • Délka klíče, bajty 0 - 3

  • Délka IV, bajty 4 - 7

  • Šifrovaný klíč

  • IV

  • Zašifrovaný text

Můžete použít délky klíče a IV k určení počátečních bodů a délek všech částí šifrovaného balíčku, které lze použít k dešifrování souboru.

Přidejte následující kód jako Click pro obslužnou rutinu události Encrypt File tlačítko (buttonEncryptFile_Click).

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.FullName
                    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.FullName;
                EncryptFile(name);
            }
        }
    }
}

Přidejte následující metodu EncryptFile do formuláře.

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 startFileName As Integer = inFile.LastIndexOf("\") + 1
    Dim outFile As String = (EncrFolder _
                + (inFile.Substring(startFileName, inFile.LastIndexOf(".") - startFileName) + ".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.
    // rsa is previously instantiated: 
    //    rsa = new RSACryptoServiceProvider(cspp);
    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

    int startFileName = inFile.LastIndexOf("\\") + 1;
   // Change the file's extension to ".enc"
    string outFile = EncrFolder + inFile.Substring(startFileName, inFile.LastIndexOf(".")- startFileName) + ".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();
    }

}

Dešifrování souboru

Tato úloha zahrnuje dvě metody, metodu obslužné rutiny události pro tlačítko Decrypt File (buttonEncryptFile_Click) a metodu DecryptFile. První metoda zobrazí dialogové okno pro výběr souboru a předá jeho název souboru druhé metodě, která provádí dešifrování.

Metoda Decrypt provede následující akce:

  1. Vytvoří symetrický algoritmus RijndaelManaged k dešifrování obsahu.

  2. Přečte prvních osm bajtů FileStream šifrovaného balíčku do pole bajtů k získání délek šifrovaného klíče a IV.

  3. Extrahuje klíč a IV z šifrovaného balíčku do pole bajtů.

  4. Vytvoří objekt RSACryptoServiceProvider pro dešifrování klíče RijndaelManaged.

  5. Používá objekt CryptoStream ke čtení a dešifrování sekce se zašifrovaným textem šifrovacího balíčku FileStream, v blocích bajtů, do objektu FileStream pro dešifrovaný soubor. Jakmile je toto dokončeno, dešifrování je dokončeno.

Následující kód přidejte jako obslužná rutina události Click pro tlačítko Decrypt File.

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);
            }
        }
    }
}

Přidejte následující metodu DecryptFile do formuláře.

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)
        Directory.CreateDirectory(DecrFolder)
        ' User RSACryptoServiceProvider
        ' to decryt the Rijndael key
        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;

    // 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);
        Directory.CreateDirectory(DecrFolder);
        // 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();
    }

}

Export veřejného klíče

Tato úloha uloží klíč vytvořený tlačítkem Create Keys do souboru. Exportuje pouze veřejné parametry.

Tato úloha simuluje scénář, jak Alice předává její veřejný klíč Bob, aby mu umožnila šifrovat soubory pro ní. On a ostatní používající tento veřejný klíč nebudou schopni jej dešifrovat, protože nemají úplný pár klíče se soukromými parametry.

Následující kód přidejte jako obslužná rutina události Click pro tlačítko Export Public Key (buttonExportPublicKey_Click).

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.
    Directory.CreateDirectory(EncrFolder)
    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.
    Directory.CreateDirectory(EncrFolder);
    StreamWriter sw = new StreamWriter(PubKeyFile, false);
    sw.Write(rsa.ToXmlString(false));
    sw.Close();
}

Import veřejného klíče

Tato úloha načte klíč s pouze veřejnými parametry, jak byly vytvořeny pomocí tlačítka Export Public Key a nastaví ho jako název kontejneru klíče.

Tato úloha simuluje scénář, jak Bob načítá klíč Alice s pouze veřejnými parametry, takže pro ní může šifrovat soubory.

Následující kód přidejte jako obslužná rutina události Click pro tlačítko Import Public Key (buttonImportPublicKey_Click).

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();
}

Získání privátního klíče

Tato úloha nastaví název kontejneru klíč na název klíče vytvořeného pomocí tlačítka Create Keys. Kontejner klíče bude obsahovat úplný pár klíče s soukromými parametry.

Tato úloha simuluje scénář, jak Alice pomocí vlastního soukromého klíče dešifruje soubory zašifrované Bob.

Následující kód přidejte jako obslužná rutina události Click pro tlačítko Get Private Key (buttonGetPrivateKey_Click).

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";

}

Testování aplikace

Po vytvoření aplikace proveďte následující scénáře testování.

Vytvořit klíče, šifrovat a dešifrovat

  1. Klikněte na tlačítko Create Keys. Jmenovka zobrazí název klíče a ukazuje, že je to úplný pár klíče.

  2. Klikněte na tlačítko Export Public Key. Všimněte si, že export parametrů veřejného klíče nezmění aktuální klíč.

  3. Klikněte na tlačítko Encrypt File a vyberte soubor.

  4. Klikněte na tlačítko Decrypt File a vyberte soubor právě zašifrovaný.

  5. Zkontrolujte soubor právě dešifrovaný.

  6. Ukončete aplikaci a restartujte ji k otestování načítání trvalých kontejnerů klíčů v dalším scénáři.

Šifrování pomocí veřejného klíče

  1. Klikněte na tlačítko Import Public Key. Jmenovka zobrazí název klíče a ukazuje, že je pouze veřejný.

  2. Klikněte na tlačítko Encrypt File a vyberte soubor.

  3. Klikněte na tlačítko Decrypt File a vyberte soubor právě zašifrovaný. Toto se nezdaří, protože musíte mít soukromý klíč k dešifrování.

Tento scénář ukazuje, jak máme pouze veřejný klíč k šifrování souboru jiné osoby. Tato osoba by obvykle poskytla pouze veřejný klíč a odepřela soukromý klíč pro dešifrování.

Dešifrovat pomocí soukromého klíče

  1. Klikněte na tlačítko Get Private Key. Jmenovka zobrazí název klíče a ukazuje, zda je to úplný pár klíče.

  2. Klikněte na tlačítko Decrypt File a vyberte soubor právě zašifrovaný. Toto bude úspěšné, protože máte úplný pár klíče k dešifrování.

Viz také

Koncepty

Služby šifrování

Další zdroje

Kryptografické úlohy