Megosztás a következőn keresztül:


Adatok visszafejtése

A visszafejtés a titkosítás fordított művelete. Titkos kulcs titkosításához ismernie kell az adatok titkosításához használt kulcsot és IV-et is. A nyilvános kulcsos titkosításhoz ismernie kell a nyilvános kulcsot (ha az adatokat titkos kulcs használatával titkosították) vagy a titkos kulcsot (ha az adatokat a nyilvános kulccsal titkosították).

Szimmetrikus visszafejtés

A szimmetrikus algoritmusokkal titkosított adatok visszafejtése hasonló az adatok szimmetrikus algoritmusokkal történő titkosításához használt folyamathoz. Az CryptoStream osztályt a .NET által biztosított szimmetrikus titkosítási osztályok használják a felügyelt streamobjektumokból beolvasott adatok visszafejtéséhez.

Az alábbi példa bemutatja, hogyan hozható létre az algoritmus alapértelmezett implementációs osztályának új példánya Aes . A példány egy objektum visszafejtésére CryptoStream szolgál. Ez a példa először létrehozza a implementálási osztály új példányát Aes . Beolvassa az inicializálási vektor (IV) értékét egy felügyelt streamváltozóból. fileStream Ezután létrehoz egy CryptoStream objektumot, és inicializálja azt a fileStream példány értékére. A SymmetricAlgorithm.CreateDecryptor példány metódusa Aes a IV értéket és a titkosításhoz használt kulcsot adja át.

Dim aes As Aes = Aes.Create()
Dim cryptStream As New CryptoStream(
    fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read)
Aes aes = Aes.Create();
CryptoStream cryptStream = new CryptoStream(
    fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read);

Az alábbi példa egy stream létrehozásának, a stream visszafejtésének, a streamből való olvasásnak és a streamek bezárásának teljes folyamatát mutatja be. Létrejön egy fájlstream objektum, amely beolvassa a TestData.txt nevű fájlt. A fájlstream ezután visszafejthető a CryptoStream és az Aes osztály használatával. Ez a példa az adatok titkosítására szolgáló szimmetrikus titkosítási példában használt kulcsértéket határozza meg. Nem jeleníti meg az értékek titkosításához és átviteléhez szükséges kódot.

using System.Security.Cryptography;

try
{
    using (FileStream fileStream = new("TestData.txt", FileMode.Open))
    {
        using (Aes aes = Aes.Create())
        {
            byte[] iv = new byte[aes.IV.Length];
            int numBytesToRead = aes.IV.Length;
            int numBytesRead = 0;
            while (numBytesToRead > 0)
            {
                int n = fileStream.Read(iv, numBytesRead, numBytesToRead);
                if (n == 0) break;

                numBytesRead += n;
                numBytesToRead -= n;
            }

            byte[] key =
            {
                0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16
            };

            using (CryptoStream cryptoStream = new(
               fileStream,
               aes.CreateDecryptor(key, iv),
               CryptoStreamMode.Read))
            {
                // By default, the StreamReader uses UTF-8 encoding.
                // To change the text encoding, pass the desired encoding as the second parameter.
                // For example, new StreamReader(cryptoStream, Encoding.Unicode).
                using (StreamReader decryptReader = new(cryptoStream))
                {
                    string decryptedMessage = await decryptReader.ReadToEndAsync();
                    Console.WriteLine($"The decrypted original message: {decryptedMessage}");
                }
            }
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine($"The decryption failed. {ex}");
}
Imports System
Imports System.IO
Imports System.Security.Cryptography

Module Module1
    Sub Main()
        ' Decryption key must be the same value that was used
        ' to encrypt the stream.
        Dim key As Byte() = {&H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8, &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16}

        Try
            ' Create a file stream.
            Using fileStream As New FileStream("TestData.txt", FileMode.Open)

                ' Create a new instance of the default Aes implementation class
                Using aes As Aes = Aes.Create()

                    ' Reads IV value from beginning of the file.
                    Dim iv As Byte() = New Byte(aes.IV.Length - 1) {}
                    Dim numBytesToRead As Integer = CType(aes.IV.Length, Integer)
                    Dim numBytesRead As Integer = 0

                    While (numBytesToRead > 0)
                        Dim n As Integer = fileStream.Read(iv, numBytesRead, numBytesToRead)
                        If n = 0 Then
                            Exit While
                        End If
                        numBytesRead += n
                        numBytesToRead -= n
                    End While

                    Using cryptoStream As New CryptoStream(fileStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read)

                        ' By default, the StreamReader uses UTF-8 encoding.
                        ' To change the text encoding, pass the desired encoding as the second parameter.
                        ' For example, New StreamReader(cryptoStream, Encoding.Unicode).
                        Using decryptReader As New StreamReader(cryptoStream)

                            ' Display the message.
                            Console.WriteLine($"The decrypted original message: {decryptReader.ReadToEnd()}")
                        End Using
                    End Using
                End Using
            End Using
        Catch
            Console.WriteLine("The decryption Failed.")
            Throw
        End Try
    End Sub
End Module

Az előző példa ugyanazt a kulcsot és az adatok titkosítására szolgáló szimmetrikus titkosítási példában használt algoritmust használja. Visszafejti a példában létrehozott TestData.txt fájlt, és megjeleníti az eredeti szöveget a konzolon.

Aszimmetrikus visszafejtés

Egy fél (A fél) általában nyilvános és privát kulcsot is létrehoz, és a kulcsot a memóriában vagy egy titkosítási kulcstárolóban tárolja. Az A fél ezután elküldi a nyilvános kulcsot egy másik félnek (B fél). A nyilvános kulcs használatával a B fél titkosítja az adatokat, és visszaküldi az adatokat az A félnek. Az adatok fogadása után az A fél visszafejti azokat a megfelelő titkos kulccsal. A visszafejtés csak akkor lesz sikeres, ha az A fél az adatok titkosításához használt B nyilvános kulcsnak megfelelő titkos kulcsot használja.

Az aszimmetrikus kulcs biztonságos titkosítási kulcstárolóban való tárolásával és az aszimmetrikus kulcs későbbi lekérésével kapcsolatos információkért tekintse meg az aszimmetrikus kulcsok kulcstárolóban való tárolását ismertető témakört.

Az alábbi példa két bájttömb visszafejtést mutat be, amelyek szimmetrikus kulcsot és IV-et jelölnek. Az aszimmetrikus nyilvános kulcsnak az RSA objektumból egy harmadik félnek könnyen elküldhető formátumban történő kinyerésével kapcsolatos információkért lásd az Adatok titkosítása című témakört.

'Create a new instance of the RSA class.
Dim rsa As RSA = RSA.Create()

' Export the public key information and send it to a third party.
' Wait for the third party to encrypt some data and send it back.

'Decrypt the symmetric key and IV.
symmetricKey = rsa.Decrypt(encryptedSymmetricKey, RSAEncryptionPadding.Pkcs1)
symmetricIV = rsa.Decrypt(encryptedSymmetricIV, RSAEncryptionPadding.Pkcs1)
//Create a new instance of the RSA class.
RSA rsa = RSA.Create();

// Export the public key information and send it to a third party.
// Wait for the third party to encrypt some data and send it back.

//Decrypt the symmetric key and IV.
symmetricKey = rsa.Decrypt(encryptedSymmetricKey, RSAEncryptionPadding.Pkcs1);
symmetricIV = rsa.Decrypt(encryptedSymmetricIV , RSAEncryptionPadding.Pkcs1);

Lásd még