Dela via


Kryptera data

Symmetrisk kryptering och asymmetrisk kryptering utförs med olika processer. Symmetrisk kryptering utförs på strömmar och är därför användbar för att kryptera stora mängder data. Asymmetrisk kryptering utförs på ett litet antal byte och är därför endast användbart för små mängder data.

Symmetrisk kryptering

De hanterade symmetriska kryptografiklasserna används med en särskild strömklass som kallas för en CryptoStream som krypterar data som läse in i dataströmmen. Klassen CryptoStream initieras med en hanterad strömklass, en klass som implementerar ICryptoTransform gränssnittet (skapat från en klass som implementerar en kryptografisk algoritm) och en CryptoStreamMode uppräkning som beskriver vilken typ av åtkomst som tillåts till CryptoStream. Klassen CryptoStream kan initieras med vilken klass som helst som härleds från Stream klassen, inklusive FileStream, MemoryStreamoch NetworkStream. Med hjälp av dessa klasser kan du utföra symmetrisk kryptering på en mängd olika strömobjekt.

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 kryptering i en CryptoStream-klass . I det här exemplet initieras CryptoStream med ett stream-objekt som heter fileStream som kan vara vilken typ av hanterad ström som helst. Metoden CreateEncryptor från klassen Aes skickas den nyckel och IV som används för kryptering. I det här fallet används standardnyckeln och IV som genereras från aes .

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

När den här koden har körts krypteras alla data som skrivs till CryptoStream-objektet med hjälp av AES-algoritmen.

I följande exempel visas hela processen med att skapa en ström, kryptera strömmen, skriva till strömmen och stänga strömmen. Det här exemplet skapar en filström som krypteras med klassen CryptoStream och klassen Aes . Genererad IV skrivs till början av FileStream, så att den kan läsas och användas för dekryptering. Sedan skrivs ett meddelande till den krypterade strömmen med StreamWriter klassen . Samma nyckel kan användas flera gånger för att kryptera och dekryptera data, men vi rekommenderar att du genererar en ny slumpmässig IV varje gång. På så sätt skiljer sig krypterade data alltid åt, även om oformaterad text är densamma.

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

Koden krypterar strömmen med hjälp av den symmetriska AES-algoritmen och skriver IV och krypterar sedan "Hello World!" till strömmen. Om koden lyckas skapar den en krypterad fil med namnet TestData.txt och visar följande text i konsolen:

The file was encrypted.

Du kan dekryptera filen med hjälp av det symmetriska dekrypteringsexemplet i Dekryptera data. Det exemplet och det här exemplet anger samma nyckel.

Men om ett undantag utlöses visas följande text i konsolen i koden:

The encryption failed.

Asymmetrisk kryptering

Asymmetriska algoritmer används vanligtvis för att kryptera små mängder data, till exempel kryptering av en symmetrisk nyckel och IV. Vanligtvis använder en person som utför asymmetrisk kryptering den offentliga nyckeln som genereras av en annan part. Klassen RSA tillhandahålls av .NET för detta ändamål.

I följande exempel används information om offentlig nyckel för att kryptera en symmetrisk nyckel och IV. Två bytematriser initieras som representerar den offentliga nyckeln för en tredje part. Ett RSAParameters objekt initieras till dessa värden. Därefter importeras RSAParameters-objektet (tillsammans med den offentliga nyckel som det representerar) till en RSA-instans med hjälp av RSA.ImportParameters metoden. Slutligen krypteras den privata nyckeln och IV som skapats av en Aes klass. Det här exemplet kräver att system har 128-bitars kryptering installerat.

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

Se även