Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ассиметричное шифрование 
V
    Опции темы
GhosTer
  Дата 24.1.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



Наковырял в нете исходник по шифрованию, но консольную версию и как я понял под линух(хотя разницы нет).
Переделал его в то что мне нужно всё получилось я рад.
Но опять но!!! Половину из кода я не понял, не смотря на то что сам ковырял.
Вот и прошу рассказать что да как в нем происходи(построчно).
Частитно сам дописал инфо, а там где его нет я тупо понимаю но что именно там происходит ни ку-ку.

Код

using System;
using System.IO;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        const int READ_BUF_SIZE = 512;
        TripleDES des = TripleDES.Create();

        private void CreateOpenKeyFile()
        {
               //С диалогом все ясно
               string message = "Создать новый ключь?\n\nПри нажатии на кнопку 'Да' будет создан новый ключль.\nПри нажатии на кнопку 'Нет' будет предложено выбрать уже имеющийся ключь.";
                string caption = "Новый ключ.";
                MessageBoxButtons buttons = MessageBoxButtons.YesNo;
                DialogResult result;


                result = MessageBox.Show(this, message, caption, buttons,
                    MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

                if (result == DialogResult.Yes)
                {
                    saveFileDialog1.FileName = "*.key";
                    //Если в диалоге нажали да то создаем новый если нет, то открываем старый
                    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                    {
                        //Тут темный лес. Что то генерируется и записуется в выйл ключ.
                        des.GenerateKey();
                        des.GenerateIV();
                        BinaryWriter key_writer = new BinaryWriter(File.OpenWrite(saveFileDialog1.FileName));
                        key_writer.Write((int)(des.KeySize / 8));
                        key_writer.Write(des.Key);
                        key_writer.Write(des.IV);
                        key_writer.Close();
                        this.tbKey.Text = saveFileDialog1.FileName;
                    }

                }
                else
                {
                   //Выбираем ранее созданый ключ.
                    openFileDialog1.FileName = "*.key";
                    if (openFileDialog1.ShowDialog() == DialogResult.OK)
                    {
                        this.tbKey.Text = openFileDialog1.FileName;
                    }
                }
        }
       
        private void EncryptFileDES()
        {
            //тут только догадки
            FileStream key_stream = File.OpenRead(tbKey.Text);
            BinaryReader key_reader = new BinaryReader(key_stream);
            int key_size = key_reader.ReadInt32();
            des.Key = key_reader.ReadBytes(key_size);
            des.IV = key_reader.ReadBytes((int)(key_stream.Length - key_size));
            key_reader.Close();
            
            BinaryReader raw_reader = new BinaryReader(File.OpenRead(tbfile.Text));

            FileStream crypt_file_stream = File.OpenWrite(tbfile.Text+"x");
            crypt_file_stream.SetLength(0);

            CryptoStream crypt_stream = new CryptoStream(crypt_file_stream,
                                                         des.CreateEncryptor(),
                                                         CryptoStreamMode.Write);
            BinaryWriter crypt_writer = new BinaryWriter(crypt_stream);

            byte[] block = new byte[READ_BUF_SIZE];
            int read_count = 0;
            while ((read_count = raw_reader.Read(block, 0, READ_BUF_SIZE)) != 0)
            {
                crypt_writer.Write(block, 0, read_count);
            }
            crypt_writer.Close();
            raw_reader.Close();
            MessageBox.Show("Файл зашифрован.");


        }

        private void DeEncryptFileDES()
        {
            //те же самые догадки
            FileStream key_stream = File.OpenRead(tbKey.Text);
            BinaryReader key_reader = new BinaryReader(key_stream);
            int key_size = key_reader.ReadInt32();
            des.Key = key_reader.ReadBytes(key_size);
            des.IV = key_reader.ReadBytes((int)(key_stream.Length - key_size));
            key_reader.Close();

            CryptoStream crypt_stream = new CryptoStream(File.OpenRead(tbfilecrypt.Text),
                                                         des.CreateDecryptor(),
                                                         CryptoStreamMode.Read);
            BinaryReader crypt_reader = new BinaryReader(crypt_stream);

            FileStream raw_stream = File.OpenWrite(tbfilecrypt.Text+"c");
            raw_stream.SetLength(0);

            BinaryWriter raw_writer = new BinaryWriter(raw_stream);

            byte[] block = new byte[READ_BUF_SIZE];
            int read_count = 0;
            while ((read_count = crypt_reader.Read(block, 0, READ_BUF_SIZE)) != 0)
            {
                raw_writer.Write(block, 0, read_count);
            }

            raw_writer.Close();
            crypt_reader.Close();
            MessageBox.Show("Файл разшифрован.");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Вызываю функцию создания или открытия ключа.
            this.CreateOpenKeyFile();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Заполняю textbox в котором содежится имя файла для шифрования
            openFileDialog1.FileName = "*.*";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                this.tbfile.Text = openFileDialog1.FileName;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //Заполняю textbox в котором содежится имя файла для дешифрования
            openFileDialog1.FileName = "*.*";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                this.tbfilecrypt.Text = openFileDialog1.FileName;
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
           //Тут я тупо сделал проверку на существование файлов с которыми будем работать.
            if ((tbKey.Text != "") & (File.Exists(tbKey.Text)) & (tbfile.Text != "") & (File.Exists(tbfile.Text))) EncryptFileDES();
            else MessageBox.Show("Не указаны или не существует файл с ключем и/или кодируемый файл.");
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //тут понятно тоже что и перед этим.
            if ((tbKey.Text != "") & (File.Exists(tbKey.Text)) & (tbfilecrypt.Text != "") & (File.Exists(tbfilecrypt.Text))) DeEncryptFileDES();
            else MessageBox.Show("Не указаны или не существует файл с ключем и/или декодируемый файл.");
        }
    }
}



На всяки случай прикреплю и сам "проект".

И еще один вопросик. Я сделал так что бы зашифрованный фал в расширении получал дополнительный символ X
А расшифрованный получал дополнительно C. Так и получается у меня. Пример: Изночально 1.jpg, шифруем и он уже 1.jpgx, дешифруем и он становиться 1.jpgxc. Тупо не правда ли. Как сделать что бы при дешифровки убирался X?

Это сообщение отредактировал(а) GhosTer - 24.1.2009, 20:31

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  DES.rar 52,41 Kb
PM MAIL   Вверх
Gaudi
Дата 24.1.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 18.3.2007

Репутация: нет
Всего: нет



Цитата(GhosTer @ 24.1.2009,  18:29)
Как сделать что бы при дешифровки убирался X?

Для шифрования и расшифрования 1 ключ => алгоритм симметричный.
Вместо x - c.
Код

FileStream raw_stream = File.OpenWrite(tbfilecrypt.Text.Remove(tbfilecrypt.Text.Length-1)+"c" );

По коду: что конкретно не понятно?
PM MAIL   Вверх
GhosTer
Дата 25.1.2009, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



Общий смысл понятен. Сам покапывал
Конкретно интересует построчно что происходит тут:

Код

                        des.GenerateKey();
                        des.GenerateIV();


Код

BinaryReader raw_reader = new BinaryReader(File.OpenRead(tbfile.Text));
            FileStream crypt_file_stream = File.OpenWrite(tbfile.Text+"x");
            crypt_file_stream.SetLength(0);
            CryptoStream crypt_stream = new CryptoStream(crypt_file_stream,
                                                         des.CreateEncryptor(),
                                                         CryptoStreamMode.Write);
            BinaryWriter crypt_writer = new BinaryWriter(crypt_stream);
            byte[] block = new byte[READ_BUF_SIZE];
            int read_count = 0;
            while ((read_count = raw_reader.Read(block, 0, READ_BUF_SIZE)) != 0)
            {
                crypt_writer.Write(block, 0, read_count);
            }


Код

CryptoStream crypt_stream = new CryptoStream(File.OpenRead(tbfilecrypt.Text),
                                                         des.CreateDecryptor(),
                                                         CryptoStreamMode.Read);
            BinaryReader crypt_reader = new BinaryReader(crypt_stream);
            FileStream raw_stream = File.OpenWrite(tbfilecrypt.Text+"c");
            raw_stream.SetLength(0);
            BinaryWriter raw_writer = new BinaryWriter(raw_stream);
            byte[] block = new byte[READ_BUF_SIZE];
            int read_count = 0;
            while ((read_count = crypt_reader.Read(block, 0, READ_BUF_SIZE)) != 0)
            {
                raw_writer.Write(block, 0, read_count);
            }


Это сообщение отредактировал(а) GhosTer - 25.1.2009, 00:53
PM MAIL   Вверх
GhosTer
  Дата 25.1.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.5.2007

Репутация: нет
Всего: нет



Судя по всему ответить некому.
Попытаюсь ответить сам. Может кому нить пригодится!

Общий смысл понятен. Сам покапывал
Конкретно интересует построчно что происходит тут:

Код

                        des.GenerateKey(); //генерирует случайный ключ (Key) для использования алгоритмом шифрования
                        des.GenerateIV();   //Генерирует случайный вектор инициализации (IV) для использования алгоритмом шифрования



Код

BinaryReader raw_reader = new BinaryReader(File.OpenRead(tbfile.Text));//Записывает наш файл в поток как двоичные значения и поддерживает запись строк в определенной кодировке
            FileStream crypt_file_stream = File.OpenWrite(tbfile.Text+"x");//открываем файл для дальнейшего кодирования
            crypt_file_stream.SetLength(0);//хз - задаем длину потока
            CryptoStream crypt_stream = new CryptoStream(crypt_file_stream,
                                                         des.CreateEncryptor(),
                                                         CryptoStreamMode.Write);// Определяет поток, который связывает потоки данных с криптографическими преобразованиями
            BinaryWriter crypt_writer = new BinaryWriter(crypt_stream);//Создаем поток как двоичные значения для нового, зашифрованного файла.
            //Дальше сам не пойму как и что, но в общем поблочно записываем зашифрованный файл
            byte[] block = new byte[READ_BUF_SIZE];
            int read_count = 0;
            while ((read_count = raw_reader.Read(block, 0, READ_BUF_SIZE)) != 0)
            {
                crypt_writer.Write(block, 0, read_count);
            }



Код

CryptoStream crypt_stream = new CryptoStream(File.OpenRead(tbfilecrypt.Text),
                                                         des.CreateDecryptor(),
                                                         CryptoStreamMode.Read);// Определяет поток, который связывает потоки данных с криптографическими преобразованиями
            BinaryReader crypt_reader = new BinaryReader(crypt_stream);//Создаем поток как двоичные значения для  зашифрованного файла.
            FileStream raw_stream = File.OpenWrite(tbfilecrypt.Text+"c");//открываем/создаем наш расшифрованный файл.
            raw_stream.SetLength(0);//хз - задаем длину потока
            BinaryWriter raw_writer = new BinaryWriter(raw_stream);//Создаем поток как двоичные значения для  нового, расшифрованного файла.
            //Дальше сам не пойму как и что, но в общем поблочно записываем расшифрованный файл
            byte[] block = new byte[READ_BUF_SIZE];
            int read_count = 0;
            while ((read_count = crypt_reader.Read(block, 0, READ_BUF_SIZE)) != 0)
            {
                raw_writer.Write(block, 0, read_count);
            }

PM MAIL   Вверх
Gaudi
Дата 25.1.2009, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 18.3.2007

Репутация: нет
Всего: нет



9: Массив байт
10: Число прочтенных символов
11: Читаем в block из исх. файла
13: Шифруем block и записываем в вых. файл
PM MAIL   Вверх
q12357
Дата 9.2.2009, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 18.1.2009

Репутация: нет
Всего: нет



у меня слово  partial подчеркивается красными волнами и такая ошибка
Expected class, delegate, enum, interface, or struct
студия 2003. в чем проблема?

Это сообщение отредактировал(а) q12357 - 9.2.2009, 06:37
PM MAIL   Вверх
nikitao
Дата 9.2.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



q12357, C# 1.1 ( который постановляется вместе с VS 2003) не поддерживает частичные классы.


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1334 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.