Dela via


Dekryptera data

Dekryptering är den omvända krypteringsåtgärden. För kryptering med hemliga nycklar måste du känna till både nyckeln och IV som användes för att kryptera data. För kryptering med offentlig nyckel måste du känna till antingen den offentliga nyckeln (om data krypterades med den privata nyckeln) eller den privata nyckeln (om data krypterades med den offentliga nyckeln).

Symmetrisk dekryptering

Dekrypteringen av data som krypterats med symmetriska algoritmer liknar den process som används för att kryptera data med symmetriska algoritmer. Klassen CryptoStream används med symmetriska kryptografiklasser som tillhandahålls av .NET för att dekryptera data som lästs från alla hanterade dataströmsobjekt.

I följande exempel visas hur du skapar en ny instans av standardimplementeringsklassen för algoritmen Aes . Instansen används för att utföra dekryptering på ett CryptoStream objekt. Det här exemplet skapar först en ny instans av implementeringsklassen Aes . Den läser initieringsvektorvärdet (IV) från en hanterad strömvariabel, fileStream. Därefter instansierar det ett CryptoStream objekt och initierar det till instansens fileStream värde. Metoden SymmetricAlgorithm.CreateDecryptor från instansen Aes skickas IV-värdet och samma nyckel som användes för kryptering.

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

I följande exempel visas hela processen med att skapa en ström, dekryptera strömmen, läsa från strömmen och stänga strömmarna. Ett filströmsobjekt skapas som läser en fil med namnet TestData.txt. Filströmmen dekrypteras sedan med klassen CryptoStream och klassen Aes . Det här exemplet anger nyckelvärde som används i det symmetriska krypteringsexemplet för kryptering av data. Den visar inte den kod som behövs för att kryptera och överföra dessa värden.

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

I föregående exempel används samma nyckel och algoritm som används i det symmetriska krypteringsexemplet för kryptering av data. Den dekrypterar den TestData.txt fil som skapas av det exemplet och visar den ursprungliga texten i konsolen.

Asymmetrisk dekryptering

Vanligtvis genererar en part (part A) både en offentlig och privat nyckel och lagrar nyckeln antingen i minnet eller i en container med kryptografisk nyckel. Part A skickar sedan den offentliga nyckeln till en annan part (part B). Med hjälp av den offentliga nyckeln krypterar part B data och skickar tillbaka data till part A. När du har tagit emot data dekrypterar part A dem med den privata nyckel som motsvarar. Dekrypteringen lyckas endast om part A använder den privata nyckel som motsvarar den offentliga nyckel part B som används för att kryptera data.

Information om hur du lagrar en asymmetrisk nyckel i en container med säker kryptografisk nyckel och hur du senare hämtar den asymmetriska nyckeln finns i Så här lagrar du asymmetriska nycklar i en nyckelcontainer.

I följande exempel visas dekrypteringen av två bytematriser som representerar en symmetrisk nyckel och IV. Information om hur du extraherar den asymmetriska offentliga nyckeln från RSA objektet i ett format som du enkelt kan skicka till en tredje part finns i Kryptera data.

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

Se även