Bagikan melalui


Mengenkripsi data

Enkripsi simetris dan enkripsi asimetris dilakukan menggunakan proses yang berbeda. Enkripsi simetris dilakukan pada aliran dan oleh karena itu berguna untuk mengenkripsi data dalam jumlah besar. Enkripsi asimetris dilakukan pada sejumlah kecil byte dan oleh karena itu hanya berguna untuk data jumlah kecil.

Enkripsi simetris

Kelas kriptografi simetris terkelola digunakan dengan kelas aliran khusus yang disebut CryptoStream yang mengenkripsi data yang dibaca ke dalam aliran. Kelas CryptoStream diinisialisasi dengan kelas aliran terkelola, kelas yang mengimplementasikan antarmuka ICryptoTransform (dibuat dari kelas yang mengimplementasikan algoritma kriptografi), dan enumerasi CryptoStreamMode yang menjelaskan jenis akses yang diizinkan ke CryptoStream. Kelas CryptoStream dapat diinisialisasi menggunakan kelas apa pun yang berasal dari kelas Stream, termasuk FileStream, MemoryStream, dan NetworkStream. Dengan menggunakan kelas-kelas ini, Anda dapat melakukan enkripsi simetris pada berbagai objek aliran.

Contoh berikut menunjukkan cara untuk membuat instans baru dari kelas implementasi default untuk algoritma Aes. Instans ini digunakan untuk melakukan enkripsi pada kelas CryptoStream. Dalam contoh ini, CryptoStream diinisialisasi dengan objek aliran yang disebut fileStream yang dapat menjadi semua jenis aliran terkelola. Metode CreateEncryptor dari kelas Aes diteruskan kunci dan IV yang digunakan untuk enkripsi. Dalam hal ini, kunci default dan IV yang dihasilkan dari aes digunakan.

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

Setelah kode ini dijalankan, data apa pun yang ditulis ke objek CryptoStream dienkripsi menggunakan algoritma AES.

Contoh berikut menunjukkan seluruh proses pembuatan aliran, mengenkripsi aliran, menulis ke aliran, dan menutup aliran. Contoh ini membuat aliran file yang dienkripsi menggunakan kelas CryptoStream dan kelas Aes. IV yang dihasilkan ditulis ke awal FileStream, sehingga dapat dibaca dan digunakan untuk dekripsi. Kemudian pesan ditulis ke aliran terenkripsi dengan kelas StreamWriter. Meskipun kunci yang sama dapat digunakan beberapa kali untuk mengenkripsi dan mendekripsi data, disarankan untuk menghasilkan IV acak baru setiap kali. Dengan cara ini data terenkripsi selalu berbeda, bahkan ketika teks polosnya sama.

using System.Security.Cryptography;

try
{
    using (FileStream fileStream = new("TestData.txt", FileMode.OpenOrCreate))
    {
        using (Aes aes = Aes.Create())
        {
            byte[] key =
            {
                0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16
            };
            aes.Key = key;

            byte[] iv = aes.IV;
            fileStream.Write(iv, 0, iv.Length);

            using (CryptoStream cryptoStream = new(
                fileStream,
                aes.CreateEncryptor(),
                CryptoStreamMode.Write))
            {
                // By default, the StreamWriter uses UTF-8 encoding.
                // To change the text encoding, pass the desired encoding as the second parameter.
                // For example, new StreamWriter(cryptoStream, Encoding.Unicode).
                using (StreamWriter encryptWriter = new(cryptoStream))
                {
                    encryptWriter.WriteLine("Hello World!");
                }
            }
        }
    }

    Console.WriteLine("The file was encrypted.");
}
catch (Exception ex)
{
    Console.WriteLine($"The encryption failed. {ex}");
}
Imports System
Imports System.IO
Imports System.Security.Cryptography

Module Module1
    Sub Main()
        Try
            ' Create a file stream
            Using fileStream As New FileStream("TestData.txt", FileMode.OpenOrCreate)

                ' Create a new instance of the default Aes implementation class  
                ' and configure encryption key.
                Using aes As Aes = Aes.Create()
                    'Encryption key used to encrypt the stream.
                    'The same value must be used to encrypt and decrypt the stream.
                    Dim key As Byte() = {
                        &H1, &H2, &H3, &H4, &H5, &H6, &H7, &H8,
                        &H9, &H10, &H11, &H12, &H13, &H14, &H15, &H16
                    }

                    aes.Key = key

                    ' Stores IV at the beginning of the file.
                    ' This information will be used for decryption.
                    Dim iv As Byte() = aes.IV
                    fileStream.Write(iv, 0, iv.Length)

                    ' Create a CryptoStream, pass it the FileStream, and encrypt
                    ' it with the Aes class.
                    Using cryptoStream As New CryptoStream(fileStream, aes.CreateEncryptor(), CryptoStreamMode.Write)

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

                            'Write to the stream.
                            sWriter.WriteLine("Hello World!")
                        End Using
                    End Using
                End Using
            End Using

            'Inform the user that the message was written  
            'to the stream.  
            Console.WriteLine("The text was encrypted.")
        Catch
            'Inform the user that an exception was raised.  
            Console.WriteLine("The encryption failed.")
            Throw
        End Try
    End Sub
End Module

Kode mengenkripsi aliran menggunakan algoritma simetris AES, dan menulis IV dan kemudian mengenkripsi "Halo Dunia!" ke aliran. Jika kode berhasil, kode akan membuat file terenkripsi bernama TestData.txt dan menampilkan teks berikut ke konsol:

The file was encrypted.

Anda dapat mendekripsi file dengan menggunakan contoh dekripsi simetris dalam Mendekripsi Data. Contoh tersebut dan contoh ini menentukan kunci yang sama.

Namun, jika pengecualian dinaikkan, kode akan menampilkan teks berikut ke konsol:

The encryption failed.

Enkripsi asimetris

Algoritma asimetris biasanya digunakan untuk mengenkripsi sejumlah kecil data seperti enkripsi kunci simetris dan IV. Biasanya, individu yang melakukan enkripsi asimetris menggunakan kunci publik yang dihasilkan oleh pihak lain. Kelas RSA disediakan oleh .NET untuk tujuan ini.

Contoh berikut menggunakan informasi kunci publik untuk mengenkripsi kunci simetris dan IV. Dua array byte diinisialisasi yang mewakili kunci publik pihak ketiga. Objek RSAParameters diinisialisasi ke nilai-nilai ini. Selanjutnya, objek RSAParameters (bersama dengan kunci publik yang diwakilinya) diimpor ke dalam instans RSA menggunakan metode RSA.ImportParameters. Akhirnya, kunci privat dan IV yang dibuat oleh kelas Aes dienkripsi. Contoh ini mengharuskan sistem menginstal enkripsi 128-bit.

Imports System
Imports System.Security.Cryptography

Module Module1

    Sub Main()
        'Initialize the byte arrays to the public key information.
        Dim modulus As Byte() = {214, 46, 220, 83, 160, 73, 40, 39, 201, 155, 19, 202, 3, 11, 191, 178, 56, 74, 90, 36, 248, 103, 18, 144, 170, 163, 145, 87, 54, 61, 34, 220, 222, 207, 137, 149, 173, 14, 92, 120, 206, 222, 158, 28, 40, 24, 30, 16, 175, 108, 128, 35, 230, 118, 40, 121, 113, 125, 216, 130, 11, 24, 90, 48, 194, 240, 105, 44, 76, 34, 57, 249, 228, 125, 80, 38, 9, 136, 29, 117, 207, 139, 168, 181, 85, 137, 126, 10, 126, 242, 120, 247, 121, 8, 100, 12, 201, 171, 38, 226, 193, 180, 190, 117, 177, 87, 143, 242, 213, 11, 44, 180, 113, 93, 106, 99, 179, 68, 175, 211, 164, 116, 64, 148, 226, 254, 172, 147}

        Dim exponent As Byte() = {1, 0, 1}

        'Create values to store encrypted symmetric keys.
        Dim encryptedSymmetricKey() As Byte
        Dim encryptedSymmetricIV() As Byte

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

        'Create a new instance of the RSAParameters structure.
        Dim rsaKeyInfo As New RSAParameters()

        'Set rsaKeyInfo to the public key values.
        rsaKeyInfo.Modulus = modulus
        rsaKeyInfo.Exponent = exponent

        'Import key parameters into rsa
        rsa.ImportParameters(rsaKeyInfo)

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

        'Encrypt the symmetric key and IV.
        encryptedSymmetricKey = rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1)
        encryptedSymmetricIV = rsa.Encrypt(aes.IV, RSAEncryptionPadding.Pkcs1)
    End Sub

End Module
using System;
using System.Security.Cryptography;

class Class1
{
    static void Main()
    {
        //Initialize the byte arrays to the public key information.
        byte[] modulus =
        {
            214,46,220,83,160,73,40,39,201,155,19,202,3,11,191,178,56,
            74,90,36,248,103,18,144,170,163,145,87,54,61,34,220,222,
            207,137,149,173,14,92,120,206,222,158,28,40,24,30,16,175,
            108,128,35,230,118,40,121,113,125,216,130,11,24,90,48,194,
            240,105,44,76,34,57,249,228,125,80,38,9,136,29,117,207,139,
            168,181,85,137,126,10,126,242,120,247,121,8,100,12,201,171,
            38,226,193,180,190,117,177,87,143,242,213,11,44,180,113,93,
            106,99,179,68,175,211,164,116,64,148,226,254,172,147
        };

        byte[] exponent = { 1, 0, 1 };

        //Create values to store encrypted symmetric keys.
        byte[] encryptedSymmetricKey;
        byte[] encryptedSymmetricIV;

        //Create a new instance of the RSA class.
        RSA rsa = RSA.Create();

        //Create a new instance of the RSAParameters structure.
        RSAParameters rsaKeyInfo = new RSAParameters();

        //Set rsaKeyInfo to the public key values.
        rsaKeyInfo.Modulus = modulus;
        rsaKeyInfo.Exponent = exponent;

        //Import key parameters into rsa.
        rsa.ImportParameters(rsaKeyInfo);

        //Create a new instance of the default Aes implementation class.
        Aes aes = Aes.Create();

        //Encrypt the symmetric key and IV.
        encryptedSymmetricKey = rsa.Encrypt(aes.Key, RSAEncryptionPadding.Pkcs1);
        encryptedSymmetricIV = rsa.Encrypt(aes.IV, RSAEncryptionPadding.Pkcs1);
    }
}

Lihat juga