Немного о идее

Сегодня исходники по C# скачать бесплатно практически не возможно. Но мне пришла идея разместить исходники программ, что я делал в универе, здесь на сайте. Скачать можно с файлообменника, просто нужно подождать минуту - и вуааля - скачивайте и сдавайте вашему преподавателю, или эксперементируйте с исходниками... Оставляйте комментарии или давайте идеи - буду пробовать написать и выложить исходники. Также планирую в дальнейшем выложить для скачивания исходники по C++. Вообщем пожелайте мне удачи. :)

понедельник, января 25, 2010

MyNotepad


Блокнот - очень удобный и быстрый инструмент для редактирования текста. Вот один из примеров как можно его написать.

Заметьте, в программе использовалась конструкция

#region RegionName

#endregion

для разделения методов и событий. Очено удобно и помагает какбы охватить структуру программы одним взглядом. Хорошим тоном в программировании является разделение программы на поля, методы, события, опции и т.д.

В общем Notepad был написан где-то за два часа. Везде и всюду использовались свойства TextBox'а. В частности свойство для смены шрифта - Font. А также окно выбора шрифта - fontDialog.
Кроме этого диалога использовались еще диалоги - openFileDialog и saveFileDialog. Также очень удобный и полезный элемент - menuStrip. Представляет собой простую менюшку.

Вот внешний вид блокнота:


Скачать исходники можно здесь - http://rapidgator.net/45551/MyNotepad_0.1.rar.html

пятница, января 08, 2010

TripleDES. Часть вторая

Нашел таки время на продолжение статьи. На тему кодирование TripleDES.

Итак у нас есть готовая форма с контролами, осталось только "прицепить" к кнопкам обработчики событий. Но это еще не все. В моей программе я использую отдельный файл - CryptText.cs - для методов шифрования и дешифрования.

"Шифрование"

Програмный код для обработчиков событий:

- button1

OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Txt files (*.txt)|*.txt|All files (*.*)|*.*";
ofd.ShowDialog();
if (ofd.FileName != "")
{
    tbText.Text = new FileInfo(ofd.FileName).OpenText().ReadToEnd();
}

Заметки:
Здесь мы вместо использования контрола OpenFileDialog напрямую создаем экземпляр класса OpenFileDialog. Также используем свойство Filter для открытия только текстовых файлов. Содержимое окна OpenFileDialog отфильтровывается так, что будут показаны только папки и текстовые файлы. Далее мы одной строчкой открываем текстовый файл и читаем его с начала в конец. Здесь я использовал слабую ссылку на обьект FileInfo.

- button2

SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = "C:\\";
sfd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
sfd.ShowDialog();
tbPath.Text = sfd.FileName;

Тот же код, но для сохранения.


- button3

try
            {
                // Создаем новый TripleDESCryptoServiceProvider обьект
                // для генерирования вектора инициализации (IV).
                TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

                // Для наглядности выводим значение вектора инициализации
                string temp = null;
                for (int i = 0; i < tDESalg.IV.Length; i++)
                {
                    temp += tDESalg.IV[i].ToString();
                }
                textBox4.Text = temp;
                label9.Text = temp;

                // Запоминаем вектор в локальной переменной IVector
                IVector = tDESalg.IV;

                // Строка для шифрования
                string sData = textBox1.Text;

                // Получаем ключ, преобразовываем в массив байтов и
                // дополняем до длинны 24. Не больше и не меньше.
                string strKey = textBox2.Text;
                byte[] bKey = new byte[24];
                for (int i = 0, j = 0; i < 24; i++, j++)
                {
                    if (j == strKey.Length)
                        j = 0;
                    bKey[i] = (byte)strKey[j];
                }

                // Указываем файл, куда будем шифровать
                string FileName = textBox3.Text;

                // Шифруем текст в файл.
                // При этом указываем имя файла, ключ и вектор инициализации.
                CryptText.EncryptTextToFile(sData, FileName, bKey, tDESalg.IV);

                // Сообщаем о результате
                MessageBox.Show("Текст успешно зашифрован !!!");
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }

Заметки: Для использования класса TripleDESCryptoServiceProvider нужно подключит пространство имен

using System.Security.Cryptography;

Для хранения вектора инициализации я использовал переменную IVector. Обьявляется она сразу после

protected byte[] IVector = null;

Здесь как вы видете используется метод EncryptTextToFile() из класса CryptText. Как я уже говорил, этот клас находится в отдельном модуле (или отдельном файле). Также используется конструкция try - catch для обработки исключений и их вывода на екран в виде MessageBox.

"Дешифрование"

Програмный код для обработчиков событий:

- button4

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Txt files (*.txt)|*.txt|All files (*.*)|*.*";
            ofd.ShowDialog();
            if (ofd.FileName != "")
            {
                textBox5.Text = new FileInfo(ofd.FileName).FullName;
            }


- button5


try
            {
                // Создаем новый TripleDESCryptoServiceProvider обьект
                // для генерирования вектора инициализации (IV).
                TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

                // Получаем ключ, преобразовываем в массив байтов и
                // дополняем до длинны 24. Не больше и не меньше.
                string strKey = textBox6.Text;
                byte[] bKey = new byte[24];
                for (int i = 0, j = 0; i < 24; i++, j++)
                {
                    if (j == strKey.Length)
                        j = 0;
                    bKey[i] = (byte)strKey[j];
                }

                // Указываем файл для дешифрования
                string FileName = textBox5.Text;

                // Дешифруем текст из файла.
                // При этом указываем имя файла, ключ и вектор инициализации IVector.
                textBox7.Clear();
                textBox7.Text += CryptText.DecryptTextFromFile(FileName, bKey, IVector);

                // Сообщаем о результате
                MessageBox.Show("Текст успешно дешифрован !!!");
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
            }

Теперь добавляем в проект класс таким образом: открываем SolutionExplorer, клацаем по MyTripleDES правой

кнопкой мышки и жмем добавить-класс (Add-Class). Называем его CryptText.

 


Не забываем подключить в наш только что созданный класс

using System.Security.Cryptography;
using System.IO;
using System.Windows.Forms;

Далее в класс вставляем код:

// Конструктор
        public CryptText() { }

        ///
        /// Метод шифрует текст в файл
        ///
        ///
Текст для шифрования
        ///
Полный путь к файлу
        ///
Ключ (пароль)
        ///
Вектор инициализации
        public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV)
        {
            try
            {
                // Create or open the specified file.
                FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

                // Create a CryptoStream using the FileStream
                // and the passed key and initialization vector (IV).
                CryptoStream cStream = new CryptoStream(fStream,
                    new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
                    CryptoStreamMode.Write);

                // Create a StreamWriter using the CryptoStream.
                StreamWriter sWriter = new StreamWriter(cStream);

                // Write the data to the stream
                // to encrypt it.
                sWriter.WriteLine(Data);

                // Close the streams and
                // close the file.
                sWriter.Close();
                cStream.Close();
                fStream.Close();
            }
            catch (CryptographicException e)
            {
                MessageBox.Show("A Cryptographic error occurred: {0}", e.Message);
            }
            catch (UnauthorizedAccessException e)
            {
                MessageBox.Show("A file access error occurred: {0}", e.Message);
            }

        }

        ///
        /// Метод дешифрует текст из файла
        ///
        ///
Полный путь к файлу
        ///
Ключ (пароль)
        ///
Вектор инициализации
        /// Текст в дешифрованном виде
        public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV)
        {
            try
            {
                // Create or open the specified file.
                FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

                // Create a CryptoStream using the FileStream
                // and the passed key and initialization vector (IV).
                CryptoStream cStream = new CryptoStream(fStream,
                    new TripleDESCryptoServiceProvider().CreateDecryptor(Key, IV),
                    CryptoStreamMode.Read);

                // Create a StreamReader using the CryptoStream.
                StreamReader sReader = new StreamReader(cStream);

                // Read the data from the stream
                // to decrypt it.
                string val = sReader.ReadToEnd();

                // Close the streams and
                // close the file.
                sReader.Close();
                cStream.Close();
                fStream.Close();

                // Return the string.
                return val;
            }
            catch (CryptographicException e)
            {
                MessageBox.Show("A Cryptographic error occurred: {0}", e.Message);
                return null;
            }
            catch (UnauthorizedAccessException e)
            {
                MessageBox.Show("A file access error occurred: {0}", e.Message);
                return null;
            }
        }

Осталось пару штрихов. Создаем обработчик события на загрузку формы Form1. Вставляем код:

                           textBox3.Text = @"C:\Encoded.txt";
            textBox2.Text = "key";
            textBox6.Text = "key";
Удаляем пространства имен, которые не используем. Для этого правой кнопкой мышки клацаем по коду и жмем

Organize Usings - Remove Unused Usings

Вуаля. Наша программа готова !!! Можна тестировать. Отзывы и советы пишите в
комментарии.
Исходники качаем отсюдова hhttp://www.megaupload.com/?d=1SELPDBQ.

вторник, января 05, 2010

TripleDES. Часть первая


Статья по криптографии, которую я разместил немного ниже, объясняет базовые принципы сохранения конфиденциальности информации. Это конечно хорошо, но можно ли написать программу на C# так, чтобы она кодировала наш текст, и соответственно декодировала его?
Да. И достаточно просто.
Я написал программу, которая демонстрирует алгоритм шифрования TripleDES. Немного об алгоритме: алгоритм симметричный, то есть шифруем и дешифруем текст, при помощи одного и того же пароля (ключа). Если верить Википедии, то –
Triple DES (3DES) — симметричный блочный шифр, созданный Уитфилдом Диффи, Мартином Хеллманом и Уолтом Тачманном в 1978 году на основе алгоритма DES, с целью устранения главного недостатка последнего — малой длины ключа (56 бит), который может быть взломан методом полного перебора ключа. Скорость работы 3DES в 3 раза ниже, чем у DES, но криптостойкость намного выше — время, требуемое для криптоанализа 3DES, может быть в миллиард раз больше, чем время, нужное для вскрытия DES. (c)Wikipedia
В нашей программе мы будем использовать класс TripleDESCryptoServiceProvider. Он определяет объект-оболочку для доступа к реализации алгоритма TripleDES, предоставляемой поставщиком служб шифрования (CSP). Для использования этого класса нужно использовать пространство имен System.Security.Cryptography.
using System.Security.Cryptography;
Поставщик служб шифрования (Cryptography Service Provider, CSP) - это посредник между операционной системой, которая может управлять им с помощью стандартных функций CryptoAPI, и исполнителем криптографических операций(это может быть как программа, так и аппаратный комплекс). программа, так и аппаратный комплекс).
Итак, создаем пустой проект WindowsFormsApplication и называем его TripleDES. На форме Form1 размещаем такие контролы:
- TabControl (находим в ToolBox-Containers)
- Button – на первой закладке – 3, на второй – 2 шт.
-TextBox – на первой закладке – 4, на второй – 3 шт.
-Label – на первой закладке – 4, на второй – 5 шт.
Смотрим на рисунки:



После этого каждому элементу задаем свойство текст такие:


Теперь немного объясню, что зачем.
Вкладка «Шифрование»
Здесь мы можем выбрать текст из файла, или же напечатать текст в TextBox для текста (большой такой). Если вы открываете текст из текстового файла (*.doc не поддерживаются), тогда текст из файла автоматически отобразится в TextBox для текста.
Пароль – нужен фиксированной длинны, которая равна 24 буквам. На одну букву приходится 8 байт памяти, и в итоге пароль получается длинной в 24 * 8 = 192 байта. В нашем случае может использоваться пароль любой длинны, если только он меньше 24 символов. В моей программе короткий пароль дублируется и дописывается к уже существующему несколько раз. То есть вы ввели «ключ», а программа сделает «ключключключключключ».
Вектор инициализации (IV) – нужен для задания параметров блочного шифрования. Он генерируется при шифровании, а также генерируется совершенно другим при дешифровании. Поэтому мы запоминаем его в локальной переменной IVector.
protected byte[] IVector = null;
Путь куда шифруем – путь, куда сохраняем текстовый файл.
Вкладка «Дешифрование»
Путь к файлу – путь к файлу для дешифровки. Вектор (IV) – берем с переменной IVector. Для наглядности отображает его через метку label9.

// Создаем новый TripleDESCryptoServiceProvider обьект
// для генерирования вектора инициализации (IV).
TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();

// Для наглядности выводим значение вектора инициализации
string temp = null;

for (int i = 0; i < tDESalg.IV.Length; i++)
{
    temp += tDESalg.IV[i].ToString();
}

tbVector.Text = temp;
lVector.Text = temp;

// Запоминаем вектор в локальной переменной
IVector IVector = tDESalg.IV;

Дешифрованная инф. – наш текст после дешифровки.
Подведем итоги – чтобы зашифровать информацию алгоритмом TripleDES, нужен пароль (ключ) и вектор инициализации. Чтобы расшифровать информацию, нужны тот же пароль и вектор инициализации.
На этом первая часть разработки программы закончена. Вторую допечатаю немного позже. Там уже будет код для обработчиков событий, код методов для кодирования, декодирования. Как говорится в фильмах – продолжение следует.

суббота, января 02, 2010

Интересные видео-доклады на techdays.ru


На днях заинтересовалься ASP.NET. Сделал поиск по видео-урокам, и наткнулся на techdays.ru.
Сайт представляет собой сборник видео-семинаров на тему современных технологий. Если вы уверены в своих знаниях, можете попробовать себя в роли учителя, и сделать доклад. Далее просто выложить его на techdays.ru. techdays.ru своего рода википедия, но болше ВИДЕОпедия.
Там я нашел видео-семинар по теме ASP.NET. Изложено простым языком. Только практика. Если чесно, я такого не ожидал. Все понятно. Если посмотреть видео несколько раз, то можно по памяти написать простой Web-application.
Это видео я решил выложить на своем блоге. Вот, наслаждайтесь: http://www.data-stock.com/16153/200-ASP.NET_ASP.NET_dlja_PHP_razrabotchika_webcast640.wmv.html

Простой блокнот (только чтение из файла)

Рассмотрим пример простой программы на C#.

Что вообще необходимо сделать, чтобы начать программировать? Раздобыть комп и установить туда среду разработки. В нашем случае – это Visual Studio 2008 Team System. Ищем на торрентах или смотрим по ссылкам.

Программа использует такие контролы:

- MenuStrip

- OpenFileDiag

- TextBox

Для начала создадим пустой проект в Visual Studio 2008 (File-New-Project). В окне New project проходимся по пунктам 1-4, смотрите на рисунок.



У нас теперь отображается форма на которую перетягиваем контрол MenuStrip, который находится в Toolbox. Контрол MenuStrip является стандартным меню для всех программ. Если вы не видете Toolbox'а, тогда откройте его через меню: View-Toolbox.



После называем один раздел меню “File”. В нем – два подраздела – “Open” и “Exit”.



Теперь перетаскиваем на нашу форму OpenFileDiag. Этот элемент не отобразится на форме, но его будет видно в нижнем левом углу Студии.



Теперь добавим контрол в котором будем отображать текст из файла – TextBox. В свойствах контрола ставим галочку напротив MultiLine. Далее правой кнопкой мышки клацаем по нашему TextBoxу и выбираем Properties (Свойства). В свойствах ищем ScrollBars и устанавливаем Vertical. Теперь ищем свойство Dock и устанавливаем в Fill.



Теперь у нас есть все контролы и нам осталость дописать пару сточек кода. Начнем с того, что зададим действие для клика по элементу меню File – Open. Для этого достаточно клацнуть по нему два раза мышкой. Студия автоматически сгенирирует для нас обработчик события и назвет его openToolStripMenuItem_Click.



Здесь между двух кавычек
{

}

вставляем код:

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(openFileDialog1.FileName);
textBox1.Text = sr.ReadToEnd();
sr.Close();
}

Что значит: если была нажата кнопка ОК на контроле openFileDialog1, тогда делаем то, что заключено в кавычки. А в кавычках мы создаем экземпляр (или обьект) класса StreamReader. Называем его коротко – “sr”. Класс StreamReader представляет нам базовый функционал для чтения текстовых файлов, что нам и нужно. Инициализируем этот обьект класса полным путем к файлу, который получаем из контрола openFileDialog1 через свойство FileName.

Теперь на экземпляре обьекта “sr” вызываем метод ReadToEnd(). Метод возвращает нам текст в формате string. Этот текст мы присваиваем левому операнду textBox1.Text:

textBox1.Text = sr.ReadToEnd();

Далее закрываем поток sr методом Close().

sr.Close();

Второй шаг – создание обработчика события для элемента меню File-Exit. Как и в предыдущем случае, клацаем по нему два раза мышкокой. Теперь вставляем код:

this.Close();

И последний штрих – чтобы наша программа работала – добавляем сверху в файле Form1.cs строчку кода:

using System.IO;



Теперь мы готовы запустить нашу прграмму на выполнение – для этого нажимаем на клавиатуре F6, Ctrl+F5. Или жмем на

зеленую стрелочку Run.



Исходник кода рассмотреной только-что прграммы -
http://www.megaupload.com/?d=GR6YL6D6 или - http://upload.com.ua/get/901643971/.

пятница, января 01, 2010

Шифрование с открытым ключом

При шифровании с открытым ключом используются закрытый ключ, который должен храниться в секрете от неправомочных пользователей, а также открытый ключ, который может предоставляться кому угодно. Открытый и закрытый ключи математически взаимосвязаны; данные, зашифрованные с помощью открытого ключа, можно расшифровать исключительно с помощью соответствующего закрытого ключа, а цифровая подпись данных, подписанных с помощью закрытого ключа, может быть проверена только с помощью соответствующего открытого ключа. Открытый ключ может быть предоставлен любому лицу; он используется для шифрования данных, которые должны быть отправлены хранителю закрытого ключа. Алгоритмы шифрования с открытым ключом также известны как асимметричные алгоритмы, потому что для шифрования данных требуется один ключ, а для расшифровки — другой ключ. Оба ключа должны быть уникальными для сеанса связи. Однако хотя это требование распространяется на симметричные алгоритмы, на практике асимметричные ключи обычно используются в течение длительного срока. Шифрование с открытым ключом имеет намного большее пространство ключей, т. е. диапазон возможных значений ключа, и поэтому является менее восприимчивым к атакам методом полного перебора, когда проверяется каждое возможное значение ключа. Открытые ключи можно легко распространять, поскольку они не требуют особой защиты при условии, что существует некий способ установления подлинности источника. Некоторые алгоритмы шифрования с открытым ключом (такие как RSA и DSA, но не Diffie-Hellman) могут быть использованы для создания цифровых подписей, служащих для подтверждения идентичности лица, от которого исходят данные. Однако алгоритмы шифрования с открытым ключом являются весьма медленными (по сравнению с алгоритмами шифрования с закрытым ключом) и не предназначены для шифрования больших объемов данных. Использование шифрования с открытым ключом имеет смысл только при передаче очень малых массивов данных. Обычно шифрование с открытым ключом применяется для того, чтобы зашифровать ключ и вектор инициализации, которые будут использоваться при шифровании с закрытым ключом. После передачи ключа и вектора инициализации используется уже шифрование с закрытым ключом. (c)MSDN

Безопасность информации - основные понятия

Для начала – несколько слов о понятии «криптография»… Начнем издалека.
Допустим, вы написали сложную, дорогую программу, или же сделали какие-нибудь заметки вашей личной жизни, и не хотите, чтобы кто-либо все это прочитал (скопипастил). В этом деле вам как раз пригодится «криптография», а точнее то, что она делает.
Или же нужно вам чтобы автором статьи признавали вас, а не, допустим, Сидорова Вовочку. Здесь вам также пригодится криптография. Ее заданием есть сохранение авторства и целостности напечатанного вами текста (информации). Но если уже использовали криптографию, но отказаться от авторства своего текста не сможете.
Если сказать упрощенно, то криптография – это наука, как защитить информацию от «левых» глаз.
Идем дальше. Информация передается в основном двумя способами. Онлайн или офлайн. Онлайн – это когда через интернет. Офлайн - это когда через флешку. Но эти каналы передачи информации не защищены. Текст в основном передается в открытом виде. Так вот криптография позволяет создать защищенный канал для передачи информации в любых других каналах (интеренете, через флеху, диск, телефон и т.д.).
Сам процесс происходит так – берем информацию (ваш текст), кодируем, передаем. На другом конце провода – принимаем, декодируем и читаем. Все просто.
Но для того чтобы закодировать информацию нужно указать
  • каким методом будем кодировать
  • ввести пароль для кодирования (ключ)
А вот методы бывают разные. Одни надежны, другие - не очень. Каким методом лучше шифровать – зависит от обстоятельств. Когда нужно очень быстро – получите. Вот только не очень надежно. Хотите шифровать надежно – тоже можно. Но нужно будет подождать. Вот несколько из методов:
  • симметричные DES, ГОСТ 28147-89, AES, Camellia, Twofish, Blowfish, IDEA, RC4,
  • асимметричные RSA, Elgamal,
  • хэш-функций MD4, MD5, SHA-1, ГОСТ Р 34.11-94
Вообще слово «методы» правильней было бы заменить на «алгоритмы». Итак мы имеем симметричные алгоритмы (методы), асимметричные алгоритмы и алгоритмы хеш-функций. Что есть что сейчас и рассмотрим.
Симметричные алгоритмы.
Когда один и тот же пароль используется при кодировке и при декодировке – это симметричный алгоритм кодирования. По другому – шифрование с закрытым ключом (паролем). Пароль же секретный. Поэтому и способ называется с закрытым ключом. На рисунке показан симметричный алгоритм кодирования.