Шифрование строки с помощью C# и SHA-1


Люди шифровали свои тексты во все времена. В последнее время это стало еще удобней делать, так как разработано множество алгоритмов шифрования. Ниже в статье рассмотрим, как с помощью одного такого алгоритма (SHA-1) и языка C# зашифровать и дешифровать строку. Большого практического применения программа ниже не имеет, но на её основе уже можно создавать другие, более сложные и применяемые в реальности.

Итак, сначала приведем текст программы целиком, а потом рассмотрим его построчно подробно.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace Shifr
{
    class Program
    {
        //метод шифрования строки
        public static string Shifrovka(string ishText, string pass,
               string sol = "doberman", string cryptographicAlgorithm = "SHA1",
               int passIter = 2, string initVec = "a8doSuDitOz1hZe#",
               int keySize = 256)
        {
            if (string.IsNullOrEmpty(ishText))
                return "";

            byte[] initVecB = Encoding.ASCII.GetBytes(initVec);
            byte[] solB = Encoding.ASCII.GetBytes(sol);
            byte[] ishTextB = Encoding.UTF8.GetBytes(ishText);

            PasswordDeriveBytes derivPass = new PasswordDeriveBytes(pass, solB, cryptographicAlgorithm, passIter);
            byte[] keyBytes = derivPass.GetBytes(keySize / 8);
            RijndaelManaged symmK = new RijndaelManaged();
            symmK.Mode = CipherMode.CBC;

            byte[] cipherTextBytes = null;

            using (ICryptoTransform encryptor = symmK.CreateEncryptor(keyBytes, initVecB))
            {
                using (MemoryStream memStream = new MemoryStream())
                {
                    using (CryptoStream cryptoStream = new CryptoStream(memStream, encryptor, CryptoStreamMode.Write))
                    {
                        cryptoStream.Write(ishTextB, 0, ishTextB.Length);
                        cryptoStream.FlushFinalBlock();
                        cipherTextBytes = memStream.ToArray();
                        memStream.Close();
                        cryptoStream.Close();
                    }
                }
            }

            symmK.Clear();
            return Convert.ToBase64String(cipherTextBytes);
        }

        //метод дешифрования строки
        public static string DeShifrovka(string ciphText, string pass,
               string sol = "doberman", string cryptographicAlgorithm = "SHA1",
               int passIter = 2, string initVec = "a8doSuDitOz1hZe#",
               int keySize = 256)
        {
            if (string.IsNullOrEmpty(ciphText))
                return "";

            byte[] initVecB = Encoding.ASCII.GetBytes(initVec);
            byte[] solB = Encoding.ASCII.GetBytes(sol);
            byte[] cipherTextBytes = Convert.FromBase64String(ciphText);

            PasswordDeriveBytes derivPass = new PasswordDeriveBytes(pass, solB, cryptographicAlgorithm, passIter);
            byte[] keyBytes = derivPass.GetBytes(keySize / 8);

            RijndaelManaged symmK = new RijndaelManaged();
            symmK.Mode = CipherMode.CBC;

            byte[] plainTextBytes = new byte[cipherTextBytes.Length];
            int byteCount = 0;

            using (ICryptoTransform decryptor = symmK.CreateDecryptor(keyBytes, initVecB))
            {
                using (MemoryStream mSt = new MemoryStream(cipherTextBytes))
                {
                    using (CryptoStream cryptoStream = new CryptoStream(mSt, decryptor, CryptoStreamMode.Read))
                    {
                        byteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
                        mSt.Close();
                        cryptoStream.Close();
                    }
                }
            }

            symmK.Clear();
            return Encoding.UTF8.GetString(plainTextBytes, 0, byteCount);
        }

        static void Main(string[] args)
        {

            String gg = Shifrovka("Маша, я тебя люблю!", "пароль");
            String gg2 = DeShifrovka(gg, "пароль");
            Console.WriteLine(gg);
            Console.WriteLine(gg2);
            Console.ReadKey();

        }
    }
}
Наша программа шифровки/дешифровки строки состоит из трех частей: два метода (шифр и расшифр) и основной метод, демонстрирующий их работу. Метод Shifrovka принимает 7 значений, а возвращает одно - зашифрованнуюю строку. В строках 18-19 мы проверяем есть ли вообще с чем работать - противном случае возвращаем пустой результат. Что интересно, однако даже для пустой строки SHA-1 возвратит некоторое значение, равное da39a3ee 5e6b4b0d 3255bfef 95601890 afd80709.

В строках 21-23 кодируем все символы в байты. В строке 25 создаем экземпляр класса PasswordDeriveBytes. В следующей - переводим в байты размер ключа. Строки 27-28 создают экземпляр класса RijndaelManaged, инициализируют его и задают режим блочного шифра. Далее создаем объект-шифратор для алгоритма симметричного шифрования с заданным ключом. В строке 34 создаем поток, резервным хранилищем которого яляется память. Строка 36 определяет поток, связывающий потоки данных с криптографическими преобразованиями. На выходе в строке имеем строковое представление кодировке Base64.

Метод DeShifrovka практически аналогичен предыдущему рассмотренному. Для примера возьмем и зашифруем строку "Маша, я тебя люблю!", паролем будет просто слово "пароль". На экран консоли в процессе выполнения выводится эквивалентное строковое представление и расшифрованная строка.



Вот так просто можно зашифровать строку с помощью C# и алгоритма шифрования SHA-1. Программа создавалась в среде разработки Microsoft Visual C# 2010 Express, но код должен работать и других средах. Проект - консольное приложение.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, си шарп, шифрование




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Визуальный редактор и простой файловый менеджер Laravel 9
Уроки по JavaScript
Преимущество развития – как выиграть игру?