Aracılığıyla paylaş


Verileri şifreleme

Simetrik şifreleme ve asimetrik şifreleme farklı işlemler kullanılarak gerçekleştirilir. Simetrik şifreleme akışlarda gerçekleştirilir ve bu nedenle büyük miktarda veriyi şifrelemek için yararlıdır. Asimetrik şifreleme az sayıda bayt üzerinde gerçekleştirilir ve bu nedenle yalnızca az miktarda veri için yararlıdır.

Simetrik şifreleme

Yönetilen simetrik şifreleme sınıfları, akışa okunan verileri şifreleyen adlı özel bir CryptoStream akış sınıfıyla kullanılır. CryptoStream sınıfı yönetilen bir akış sınıfı, arabirimi uygulayan ICryptoTransform bir sınıf (şifreleme algoritması uygulayan bir sınıftan oluşturulur) ve CryptoStream'e izin verilen erişim türünü açıklayan bir CryptoStreamMode numaralandırma ile başlatılır. CryptoStream sınıfı, , MemoryStreamve NetworkStreamdahil olmak üzere FileStreamsınıfından Stream türetilen herhangi bir sınıf kullanılarak başlatılabilir. Bu sınıfları kullanarak çeşitli akış nesnelerinde simetrik şifreleme gerçekleştirebilirsiniz.

Aşağıdaki örnekte algoritma için varsayılan uygulama sınıfının yeni bir örneğinin nasıl oluşturulacağı gösterilmektedir Aes . Örneği bir CryptoStream sınıfında şifreleme gerçekleştirmek için kullanılır. Bu örnekte CryptoStream, herhangi bir yönetilen akış türü olabilecek adlı fileStream bir akış nesnesiyle başlatılır. Aes sınıfından CreateEncryptor yöntemine şifreleme için kullanılan anahtar ve IV geçirilir. Bu durumda, öğesinden aes oluşturulan varsayılan anahtar ve IV kullanılır.

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

Bu kod yürütüldükten sonra CryptoStream nesnesine yazılan tüm veriler AES algoritması kullanılarak şifrelenir.

Aşağıdaki örnekte akış oluşturma, akışı şifreleme, akışa yazma ve akışı kapatma işlemlerinin tamamı gösterilmektedir. Bu örnek CryptoStream sınıfı ve Aes sınıfı kullanılarak şifrelenmiş bir dosya akışı oluşturur. Oluşturulan IV, başlangıcına FileStreamyazılır, böylece şifre çözme için okunabilir ve kullanılabilir. Ardından, sınıfıyla StreamWriter şifrelenmiş akışa bir ileti yazılır. Verileri şifrelemek ve şifresini çözmek için aynı anahtar birden çok kez kullanılabilir ancak her seferinde yeni bir rastgele IV oluşturulması önerilir. Bu şekilde, düz metin aynı olsa bile şifrelenmiş veriler her zaman farklıdır.

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

Kod, AES simetrik algoritmasını kullanarak akışı şifreler ve IV yazar ve ardından akışa "Merhaba Dünya!" kodunu şifreler. Kod başarılı olursa, TestData.txt adlı şifrelenmiş bir dosya oluşturur ve konsolda aşağıdaki metni görüntüler:

The file was encrypted.

Verilerin Şifresini Çözme'deki simetrik şifre çözme örneğini kullanarak dosyanın şifresini çözebilirsiniz. Bu örnek ve bu örnek aynı anahtarı belirtir.

Ancak özel durum oluşursa kod konsolda aşağıdaki metni görüntüler:

The encryption failed.

Asimetrik şifreleme

Asimetrik algoritmalar genellikle simetrik anahtarın şifrelenmesi ve IV gibi az miktarda veriyi şifrelemek için kullanılır. Genellikle asimetrik şifreleme gerçekleştiren bir kişi, başka bir taraf tarafından oluşturulan ortak anahtarı kullanır. sınıfı RSA bu amaçla .NET tarafından sağlanır.

Aşağıdaki örnek, simetrik anahtarı ve IV'yi şifrelemek için ortak anahtar bilgilerini kullanır. Üçüncü bir tarafın ortak anahtarını temsil eden iki bayt dizisi başlatılır. Bir RSAParameters nesne bu değerlere başlatılır. Ardından, RSAParameters nesnesi (temsil ettiği ortak anahtarla birlikte) yöntemi kullanılarak bir RSA örneğine RSA.ImportParameters içeri aktarılır. Son olarak, bir Aes sınıf tarafından oluşturulan özel anahtar ve IV şifrelenir. Bu örnek, sistemlerin 128 bit şifreleme yüklü olmasını gerektirir.

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

Ayrıca bkz.