Шифрование и дешифрование с использованием ключа Rijndael в C#

Опубликовано: 15 Февраля, 2023

Чтобы обеспечить безопасность и защиту данных, необходимо хранить данные в зашифрованном виде. Как мы знаем, в C# и в других языках тоже есть много способов шифрования данных. Стандартный метод шифрования данных, используемый для шифрования, не обещает хорошей безопасности, что привело к изобретению высокозащищенного инструмента под названием Rijndael Key Винсентом Райменом и Джоан Деймон. В этой статье мы узнаем о ключе Rijndael и выполним пошаговое шифрование и дешифрование определенных данных с помощью ключа Rijndael в C#.

Блочный шифр:

Блочный шифр — это метод шифрования данных в блоках для создания зашифрованного текста с использованием криптографического ключа и алгоритма. блочные шифры более безопасны и надежны, чем стандартное шифрование данных (DES).

Рейндал Ключ:

Rijndael основан на методе блочного шифрования, в котором используется метод шифрования с симметричным ключом. Работает с помощью обратимых и дискретных слоев

  • Линейное преобразование микса
  • Нелинейное преобразование
  • Преобразование добавления ключа

Что касается C#, ключ Rijndael поддерживает длину ключа 128, 192 и 256 бит, а также поддерживает блоки по 128 (по умолчанию), 192 и 256 бит. Ключ Rijndael очень похож на AES (Advance Encryption Standard).

Реализация шифрования строки:

Шаг 1: Первым шагом будет создание файла C# в выбранной вами среде IDE, или вы можете просто использовать IDE GeeksForGeeks. Назовите класс «GFGEncryption», чтобы все было просто и соответствовало руководству.

Шаг 2: Теперь создайте новый метод с именем encodeString(), который не принимает параметров и возвращает строку.

Шаг 3: Теперь внутри блоков метода encodeString мы напишем фактический код для кодирования нашей строки. мы будем использовать строку «GeeksForGeeks Text». Мы закодируем эту строку. Внутри метода мы должны создать несколько переменных.

Note : 
The public and private key both must have at least 8 characters.
Don"t forget to add import statements.

Пример:

C#




using System.IO;
using System.Security.Cryptography;
using System.Text;
 
public class GFGEncryption{
 
    static public void Main (){
 
    }
   
    public static string encodeString (){
        string data = "GeeksForGeeks Text";
        string answer = "";
        string publicKey = "GEEK1234";
        string privateKey = "PKEY4321";
        byte[] privatekeyBytes = Encoding.UTF8.GetBytes(privateKey);
        byte[] publicKeyBytes = Encoding.UTF8.GetBytes(publicKey);
        byte[] inputByteArray= System.Text.Encoding.UTF8.GetBytes(data);
        return answer;
    }
}

Шаг 4: После того, как мы создали все необходимые переменные, мы можем теперь выполнить фактическую операцию кодирования, используя класс под названием «DESCryptoServiceProvider». Теперь внутри блока этого класса мы создадим два новых объекта типа

  • ПамятьПоток
  • Криптострим

Мы будем использовать метод Write из класса CryptoStream и передавать в него входной массив байтов и его длину, в результате чего получится закодированный массив. Ваш код должен выглядеть так, как показано ниже.

Пример:

C#




using System.IO;
using System.Security.Cryptography;
using System.Text;
using System;
 
public class GFGEncryption{
 
    static public void Main (){
 
    }
   
    public static string encodeString (){
        string data = "GeeksForGeeks Text";
        string answer = "";
        string publicKey = "GEEK1234";
        string privateKey = "PKEY4321";
        byte[] privateKeyBytes ={};
        privateKeyBytes = Encoding.UTF8.GetBytes(privateKey);
        byte[] publicKeyBytes = {};
        publicKeyBytes = Encoding.UTF8.GetBytes(publicKey);
        byte[] inputByteArray= System.Text.Encoding.UTF8.GetBytes(data);
        using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
                {
                    var memoryStream = new MemoryStream();
                    var cryptoStream = new CryptoStream(memoryStream,
                    provider.CreateEncryptor(publicKeyBytes, privateKeyBytes),
                     CryptoStreamMode.Write);
                    cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cryptoStream.FlushFinalBlock();
                    answer = Convert.ToBase64String(memoryStream.ToArray());
                }
        return answer;
    }
}

Шаг 5: Наконец, мы успешно реализовали метод encodeString() и собираемся использовать его в нашем основном классе. Вы должны использовать метод, как показано ниже

Пример:

C#




using System.IO;
using System.Security.Cryptography;
using System.Text;
using System;
 
public class GFGEncryption{
 
    static public void Main (){
      string encryptedString = encodeString();
            Console.Write("Encoded String is: " +encryptedString);
    }
   
    public static string encodeString(){
        string data = "GeeksForGeeks Text";
        string answer = "";
        string publicKey = "GEEK1234";
        string privateKey = "PKEY4321";
        byte[] privateKeyBytes ={};
        privateKeyBytes = Encoding.UTF8.GetBytes(privateKey);
        byte[] publicKeyBytes = {};
        publicKeyBytes = Encoding.UTF8.GetBytes(publicKey);
        byte[] inputByteArray= System.Text.Encoding.UTF8.GetBytes(data);
        using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
                {
                    var memoryStream = new MemoryStream();
                    var cryptoStream = new CryptoStream(memoryStream,
                    provider.CreateEncryptor(publicKeyBytes, privateKeyBytes),
                    CryptoStreamMode.Write);
                    cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cryptoStream.FlushFinalBlock();
                    answer = Convert.ToBase64String(memoryStream.ToArray());
                }
        return answer;
    }
}

Выход :

Расшифровка строки:

Шаг 1: Точно так же, как мы создали метод закодированной строки, мы создадим метод decodeString(), который декодирует заданную зашифрованную строку и возвращает ее истинное значение. создайте метод decodeString(), как показано ниже.

Пример:

C#




using System.IO;
using System.Security.Cryptography;
using System.Text;
using System;
 
public class GFGEncryption{
 
    static public void Main (){
      string encryptedString = encodeString();
            Console.Write("Encoded String is: " +encryptedString);
    }
   
    public static string encodeString(){
        string data = "GeeksForGeeks Text";
        string answer = "";
        string publicKey = "GEEK1234";
        string privateKey = "PKEY4321";
        byte[] privateKeyBytes ={};
        privateKeyBytes = Encoding.UTF8.GetBytes(privateKey);
        byte[] publicKeyBytes = {};
        publicKeyBytes = Encoding.UTF8.GetBytes(publicKey);
        byte[] inputByteArray= System.Text.Encoding.UTF8.GetBytes(data);
        using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
                {
                    var memoryStream = new MemoryStream();
                    var cryptoStream = new CryptoStream(memoryStream,
                     provider.CreateEncryptor(publicKeyBytes, privateKeyBytes),
                     CryptoStreamMode.Write);
                    cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cryptoStream.FlushFinalBlock();
                    answer = Convert.ToBase64String(memoryStream.ToArray());
                }
        return answer;
    }
   
    public static string decodeString(String str) {
      string answer = "";
      return answer;
    }
}

Шаг 2: Теперь внутри метода decode добавьте все переменные точно так же, как мы создали в методе encodeString(). На этот раз вместо создания отдельной переменной «данные» мы будем напрямую использовать переменную данных, которая исходит из параметров методов. Сделайте это, как показано.

Пример:

C#




using System.IO;
using System.Security.Cryptography;
using System.Text;
using System;
 
public class GFGEncryption{
 
    static public void Main (){
      string encryptedString = encodeString();
            Console.Write("Encoded String is: " +encryptedString);
    }
   
    public static string encodeString(){
        string data = "GeeksForGeeks Text";
        string answer = "";
        string publicKey = "GEEK1234";
        string privateKey = "PKEY4321";
        byte[] privateKeyBytes ={};
        privateKeyBytes = Encoding.UTF8.GetBytes(privateKey);
        byte[] publicKeyBytes = {};
        publicKeyBytes = Encoding.UTF8.GetBytes(publicKey);
        byte[] inputByteArray= System.Text.Encoding.UTF8.GetBytes(data);
        using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
                {
                    var memoryStream = new MemoryStream();
                    var cryptoStream = new CryptoStream(memoryStream,
                    provider.CreateEncryptor(publicKeyBytes, privateKeyBytes),
                    CryptoStreamMode.Write);
                    cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cryptoStream.FlushFinalBlock();
                    answer = Convert.ToBase64String(memoryStream.ToArray());
                }
        return answer;
    }
   
    public static string decodeString(String data) {
      string answer = "";
      string publicKey = "GEEK1234";
        string privateKey = "PKEY4321";
        byte[] privateKeyBytes ={};
        privateKeyBytes = Encoding.UTF8.GetBytes(privateKey);
        byte[] publicKeyBytes = {};
        publicKeyBytes = Encoding.UTF8.GetBytes(publicKey);
        byte[] inputByteArray= new byte[data.Replace(" ", "+").Length];
        using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
                {
                    var memoryStream = new MemoryStream();
                    var cryptoStream = new CryptoStream(memoryStream,
                    provider.CreateEncryptor(publicKeyBytes, privateKeyBytes),
                    CryptoStreamMode.Write);
                    cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cryptoStream.FlushFinalBlock();
                    answer = Encoding.UTF8.GetString(memoryStream.ToArray());
                }
      return answer;
    }
}

Шаг 3: Поскольку мы успешно реализовали метод расшифровки закодированной строки, мы будем использовать метод в основной функции и посмотрим, верно ли декодированное значение. Помните, мы использовали строку «GeeksForGeeks Text». Если мы получим эту строку в результате, мы можем сделать вывод, что мы успешно выполнили шифрование и дешифрование в C#.

Пример:

C#




using System.IO;
using System.Security.Cryptography;
using System.Text;
using System;
 
public class GFGEncryption{
 
    static public void Main (){
      string encryptedString = encodeString();
      string decryptedString = decodeString(encryptedString);
      Console.Write("Encoded String is: " +encryptedString);
      Console.Write(" Decoded String is: " +decryptedString);
    }
   
    public static string encodeString(){
        string data = "GeeksForGeeks Text";
        string answer = "";
        string publicKey = "GEEK1234";
        string privateKey = "PKEY4321";
        byte[] privateKeyBytes ={};
        privateKeyBytes = Encoding.UTF8.GetBytes(privateKey);
        byte[] publicKeyBytes = {};
        publicKeyBytes = Encoding.UTF8.GetBytes(publicKey);
        byte[] inputByteArray= System.Text.Encoding.UTF8.GetBytes(data);
        using (DESCryptoServiceProvider provider = new DESCryptoServiceProvider())
                {
                    var memoryStream = new MemoryStream();
                    var cryptoStream = new CryptoStream(memoryStream,
                    provider.CreateEncryptor(publicKeyBytes, privateKeyBytes),
                    CryptoStreamMode.Write);
                    cryptoStream.Write(inputByteArray, 0, inputByteArray.Length);
                    cryptoStream.FlushFinalBlock();
                    answer = Convert.ToBase64String(memoryStream.ToArray());
                }
        return answer;