На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Шифрование строки с помощью 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, но код должен работать и других средах. Проект - консольное приложение.




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

Читайте также:




Работа с Java Date и Time API: введение
Как написать макрос для CorelDRAW на VBA: введение


© upread.ru 2013-2019
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.