Bagikan melalui


Mendekripsi data

Mendekripsi adalah operasi terbalik enkripsi. Untuk enkripsi kunci rahasia, Anda harus mengetahui kunci dan IV yang digunakan untuk mengenkripsi data. Untuk enkripsi kunci publik, Anda harus mengetahui kunci publik (jika data dienkripsi menggunakan kunci privat) atau kunci privat (jika data dienkripsi menggunakan kunci publik).

Dekripsi simetris

Dekripsi data yang dienkripsi dengan algoritma simetris mirip dengan proses yang digunakan untuk mengenkripsi data dengan algoritma simetris. Kelas CryptoStream ini digunakan dengan kelas kriptografi simetris yang disediakan oleh .NET untuk mendekripsi data yang dibaca dari objek aliran terkelola apa pun.

Contoh berikut menunjukkan cara untuk membuat instans baru dari kelas implementasi default untuk algoritma Aes. Instans digunakan untuk melakukan dekripsi pada CryptoStream objek. Contoh ini pertama-tama membuat instans baru dari Aes kelas implementasi. Ini membaca nilai vektor inisialisasi (IV) dari variabel aliran terkelola, fileStream. Selanjutnya membuat instans CryptoStream objek dan menginisialisasinya ke nilai fileStream instans. SymmetricAlgorithm.CreateDecryptor Metode dari Aes instans diteruskan nilai IV dan kunci yang sama yang digunakan untuk enkripsi.

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

Contoh berikut menunjukkan seluruh proses pembuatan aliran, mendekripsi aliran, membaca dari aliran, dan menutup aliran. Objek aliran file dibuat yang membaca file bernama TestData.txt. Aliran file kemudian didekripsi menggunakan kelas CryptoStream dan kelas Aes. Contoh ini menentukan nilai kunci yang digunakan dalam contoh enkripsi simetris untuk Mengenkripsi Data. Ini tidak menunjukkan kode yang diperlukan untuk mengenkripsi dan mentransfer nilai-nilai ini.

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

Contoh sebelumnya menggunakan kunci yang sama, dan algoritma yang digunakan dalam contoh enkripsi simetris untuk Mengenkripsi Data. Ini mendekripsi file TestData.txt yang dibuat oleh contoh tersebut dan menampilkan teks asli di konsol.

Dekripsi simetris

Biasanya, pihak (pihak A) menghasilkan kunci publik dan privat dan menyimpan kunci baik dalam memori atau dalam kontainer kunci kriptografi. Pihak A kemudian mengirimkan kunci umum ke pihak lain (pihak B). Dengan menggunakan kunci umum, pihak B mengenkripsi data dan mengirim data kembali ke pihak A. Setelah menerima data, pihak A mendekripsinya menggunakan kunci privat yang sesuai. Dekripsi akan berhasil hanya jika pihak A menggunakan kunci privat yang sesuai dengan kunci publik Pihak B yang digunakan untuk mengenkripsi data.

Untuk informasi tentang cara menyimpan kunci asimetris dalam kontainer kunci kriptografi yang aman dan cara mengambil kunci asimetris nanti, lihat Cara: Store Kunci Asimetris dalam Kontainer Kunci.

Contoh berikut mengilustrasikan dekripsi dua array byte yang mewakili kunci simetris dan IV. Untuk informasi tentang cara mengekstrak kunci umum asimetris dari RSA objek dalam format yang dapat Anda kirim dengan mudah ke pihak ketiga, lihat Mengenkripsi 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);

Lihat juga