İzlenecek Yol: Şifreleme Uygulaması Oluşturma

Not

Bu makale Windows için geçerlidir.

ASP.NET Core hakkında bilgi için bkz. ASP.NET Core Data Protection.

Bu kılavuzda, bir dosyanın içeriğinin nasıl şifrelenip şifresinin çözüldüğü gösterilmektedir. Kod örnekleri Windows Forms bir uygulama için tasarlanmıştır. Bu uygulama, akıllı kartlar kullanma gibi gerçek dünya senaryolarını göstermez. Bunun yerine şifreleme ve şifre çözmenin temellerini gösterir.

Bu kılavuz şifreleme için aşağıdaki yönergeleri kullanır:

  • Aes Otomatik olarak oluşturulan Key ve IVkullanarak verileri şifrelemek ve şifresini çözmek için simetrik bir algoritma olan sınıfını kullanın.

  • tarafından şifrelenen RSAAesverilerin anahtarını şifrelemek ve şifresini çözmek için asimetrik algoritmayı kullanın. Asimetrik algoritmalar, anahtar gibi daha az miktarda veri için en iyi şekilde kullanılır.

    Not

    Şifrelenmiş içeriği diğer kişilerle değiştirmek yerine bilgisayarınızdaki verileri korumak istiyorsanız sınıfını ProtectedData kullanmayı göz önünde bulundurun.

Aşağıdaki tabloda bu konudaki şifreleme görevleri özetlemektedir.

Görev Açıklama
Windows Forms uygulaması oluşturma Uygulamayı çalıştırmak için gereken denetimleri listeler.
Genel nesneleri bildirme dize yolu değişkenlerini, CspParametersve RSACryptoServiceProvider öğesini sınıfının genel bağlamını Form bildirir.
Asimetrik anahtar oluşturma Asimetrik bir ortak ve özel anahtar-değer çifti oluşturur ve buna bir anahtar kapsayıcı adı atar.
Dosyayı şifreleme Şifreleme için bir dosya seçmek için bir iletişim kutusu görüntüler ve dosyayı şifreler.
Dosyanın şifresini çözme Şifre çözme için şifrelenmiş bir dosya seçmek için bir iletişim kutusu görüntüler ve dosyanın şifresini çözer.
Özel anahtar alma Anahtar kapsayıcı adını kullanarak tam anahtar çiftini alır.
Ortak anahtarı dışarı aktarma Anahtarı yalnızca ortak parametrelerle bir XML dosyasına kaydeder.
Ortak anahtarı içeri aktarma Anahtarı bir XML dosyasından anahtar kapsayıcısına yükler.
Uygulamayı test edin Bu uygulamayı test etme yordamlarını listeler.

Önkoşullar

Bu izlenecek yolu tamamlamak için aşağıdaki bileşenlere ihtiyacınız vardır:

Windows Forms uygulaması oluşturma

Bu kılavuzdaki kod örneklerinin çoğu düğme denetimleri için olay işleyicileri olacak şekilde tasarlanmıştır. Aşağıdaki tabloda örnek uygulama için gereken denetimler ve kod örnekleriyle eşleşmesi için gerekli adları listelenmiştir.

Denetim Name Text özelliği (gerektiği gibi)
Button buttonEncryptFile Dosyayı Şifrele
Button buttonDecryptFile Dosyanın Şifresini Çöz
Button buttonCreateAsmKeys Anahtar Oluşturma
Button buttonExportPublicKey Ortak Anahtarı Dışarı Aktar
Button buttonImportPublicKey Ortak Anahtarı İçeri Aktar
Button buttonGetPrivateKey Özel Anahtar Al
Label label1 Anahtar ayarlanmadı
OpenFileDialog _encryptOpenFileDialog
OpenFileDialog _decryptOpenFileDialog

Olay işleyicilerini oluşturmak için Visual Studio tasarımcısındaki düğmelere çift tıklayın.

Genel nesneleri bildirme

Form1 sınıfının bildiriminin bir parçası olarak aşağıdaki kodu ekleyin. Ortamınız ve tercihleriniz için dize değişkenlerini düzenleyin.

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

Asimetrik anahtar oluşturma

Bu görev, anahtarı şifreleyen ve şifresini çözen Aes asimetrik bir anahtar oluşturur. Bu anahtar, içeriği şifrelemek için kullanılmıştır ve etiket denetiminde anahtar kapsayıcı adını görüntüler.

DüğmebuttonCreateAsmKeys_Click () için Create Keys olay işleyicisi olarak Click aşağıdaki kodu ekleyin.

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

Dosyayı şifreleme

Bu görev iki yöntem içerir: düğme (buttonEncryptFile_Click) için Encrypt File olay işleyici yöntemi ve EncryptFile yöntemi. İlk yöntem, bir dosya seçmek için bir iletişim kutusu görüntüler ve dosya adını şifrelemeyi gerçekleştiren ikinci yönteme geçirir.

Şifrelenmiş içerik, anahtar ve IV'nin tümü şifreleme paketi olarak adlandırılan bir FileStreamöğesine kaydedilir.

EncryptFile yöntemi aşağıdakileri yapar:

  1. İçeriği şifrelemek için bir Aes simetrik algoritma oluşturur.
  2. Anahtarı şifrelemek Aes için bir RSACryptoServiceProvider nesne oluşturur.
  3. CryptoStream Kaynak dosyanın bayt blokları halinde okunmasını ve şifrelenmesini FileStream ve şifrelenmiş dosyanın hedef FileStream nesnesine dönüştürülmesi için bir nesne kullanır.
  4. Şifrelenmiş anahtar ve IV'nin uzunluklarını belirler ve uzunluk değerlerinden bayt dizileri oluşturur.
  5. Anahtar, IV ve uzunluk değerlerini şifrelenmiş pakete yazar.

Şifreleme paketi aşağıdaki biçimi kullanır:

  • Anahtar uzunluğu, bayt 0 - 3
  • IV uzunluğu, bayt 4 - 7
  • Şifrelenmiş anahtar
  • IV
  • Şifre metni

Şifreleme paketinin tüm bölümlerinin başlangıç noktalarını ve uzunluklarını belirlemek için anahtarın ve IV'nin uzunluklarını kullanabilirsiniz. Bu noktalar daha sonra dosyanın şifresini çözmek için kullanılabilir.

DüğmebuttonEncryptFile_Click () için Encrypt File olay işleyicisi olarak Click aşağıdaki kodu ekleyin.

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

Forma aşağıdaki EncryptFile yöntemi ekleyin.

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

Dosyanın şifresini çözme

Bu görev iki yöntem içerir: düğme için Decrypt File olay işleyici yöntemi ()buttonDecryptFile_Click ve DecryptFile yöntemi. İlk yöntem, bir dosyayı seçmek için bir iletişim kutusu görüntüler ve dosya adını şifre çözme işlemini gerçekleştiren ikinci yönteme geçirir.

Decrypt yöntemi aşağıdakileri yapar:

  1. İçeriğin şifresini çözmek için bir Aes simetrik algoritma oluşturur.
  2. Şifrelenmiş anahtarın ve IV'nin FileStream uzunluklarını elde etmek için şifrelenmiş paketin ilk sekiz baytını bayt dizilerine okur.
  3. Şifreleme paketinden anahtarı ve IV'yi bayt dizilerine ayıklar.
  4. Anahtarın Aes şifresini çözmek için bir RSACryptoServiceProvider nesne oluşturur.
  5. Şifresi çözülen dosyanın nesnesine bayt blokları halinde şifreleme paketinin FileStream şifre metin bölümünü FileStream okumak ve şifresini çözmek için bir CryptoStream nesnesi kullanır. Bu işlem tamamlandığında şifre çözme işlemi tamamlanır.

Düğmenin Decrypt File olay işleyicisi olarak Click aşağıdaki kodu ekleyin.

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

Forma aşağıdaki DecryptFile yöntemi ekleyin.

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

Ortak anahtarı dışarı aktarma

Bu görev, düğme tarafından Create Keys oluşturulan anahtarı bir dosyaya kaydeder. Yalnızca genel parametreleri dışarı aktarır.

Bu görev, Alice'in Bob'a ortak anahtarını vermesi senaryosunun benzetimini yapıyor, böylece onun için dosyaları şifreleyebiliyor. O ve bu ortak anahtara sahip olan diğer kişiler, özel parametrelerle tam anahtar çiftine sahip olmadıklarından bunların şifresini çözemezler.

DüğmebuttonExportPublicKey_Click () için Export Public Key olay işleyicisi olarak Click aşağıdaki kodu ekleyin.

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

Ortak anahtarı içeri aktarma

Bu görev, düğme tarafından Export Public Key oluşturulduğu gibi anahtarı yalnızca ortak parametrelerle yükler ve anahtar kapsayıcı adı olarak ayarlar.

Bu görev, Bob'un Alice'in anahtarını yalnızca ortak parametrelerle yükleme senaryosunu simüle eder, böylece onun için dosyaları şifreleyebilir.

DüğmebuttonImportPublicKey_Click () için Import Public Key olay işleyicisi olarak Click aşağıdaki kodu ekleyin.

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

Özel anahtar alma

Bu görev, anahtar kapsayıcı adını düğme kullanılarak oluşturulan anahtarın Create Keys adına ayarlar. Anahtar kapsayıcısı, özel parametrelerle tam anahtar çiftini içerir.

Bu görev, Bob tarafından şifrelenen dosyaların şifresini çözmek için özel anahtarını kullanan Alice senaryosunun benzetimini oluşturur.

DüğmebuttonGetPrivateKey_Click () için Get Private Key olay işleyicisi olarak Click aşağıdaki kodu ekleyin.

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

Uygulamayı test edin

Uygulamayı derledikten sonra aşağıdaki test senaryolarını gerçekleştirin.

Anahtar oluşturmak, şifrelemek ve şifresini çözmek için

  1. Create Keys düğmesine tıklayın. Etiket, anahtar adını görüntüler ve bunun tam anahtar çifti olduğunu gösterir.
  2. Export Public Key düğmesine tıklayın. Ortak anahtar parametrelerini dışarı aktarmanın geçerli anahtarı değiştirmediğini unutmayın.
  3. Düğmeye Encrypt File tıklayın ve bir dosya seçin.
  4. Düğmeye Decrypt File tıklayın ve yalnızca şifrelenmiş dosyayı seçin.
  5. Dosyanın şifresinin çözülmüş olduğunu inceleyin.
  6. Sonraki senaryoda kalıcı anahtar kapsayıcılarını almayı test etmek için uygulamayı kapatın ve yeniden başlatın.

Ortak anahtarı kullanarak şifrelemek için

  1. Import Public Key düğmesine tıklayın. Etiket anahtar adını görüntüler ve yalnızca ortak olduğunu gösterir.
  2. Düğmeye Encrypt File tıklayın ve bir dosya seçin.
  3. Düğmeye Decrypt File tıklayın ve yalnızca şifrelenmiş dosyayı seçin. Şifresini çözmek için özel anahtara sahip olmanız gerektiğinden bu başarısız olur.

Bu senaryo, bir dosyayı başka bir kişi için şifrelemek için yalnızca ortak anahtara sahip olmayı gösterir. Genellikle bu kişi size yalnızca ortak anahtarı verir ve şifre çözme için özel anahtarı saklar.

Özel anahtarı kullanarak şifresini çözmek için

  1. Get Private Key düğmesine tıklayın. Etiket anahtar adını görüntüler ve tam anahtar çifti olup olmadığını gösterir.
  2. Düğmeye Decrypt File tıklayın ve yalnızca şifrelenmiş dosyayı seçin. Şifresi çözülecek tam anahtar çiftine sahip olduğunuzdan bu işlem başarılı olur.

Ayrıca bkz.