Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шифрование и дешифрование файлов 
:(
    Опции темы
artsb
  Дата 10.12.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Всем привет.
Нужна примитивная программка для шифровки и дешифровки файлов. На форме две кнопки. 
Одна - "Зашифровать файл". При нажатии на неё открывается OpenDialog1, в нём юзверь выбирает любой файл. Выбранный файл шифруется и сохраняется в ту же папку, но с другим расширением (например, если файл abc.exe, то сохранится он как abc.exe.fsh).
Другая - "Расшифровать файл". При нажатии на неё открывается OpenDialog2, в нём юзверь выбирает файл с расширение *.fsh. Выбранный файл дешифруется и сохраняется со своим прежним расширением (например, если файл abc.exe.fsh, то сохранится он как abc.exe).
Как будет шифроваться - роли не играет. Может быть самая примитивная шифровка. Просто я не знаю как её организовать. Подскажите плиз пример кода.
Спасибо.

Добавлено через 9 минут и 35 секунд
Ещё нужно, чтобы перед шифровкой программа просила ввести пароль, с использованием которого будет происходить шифрация. И при расшифровке тоже спрашивала пароль, который будет использоваться для расшифровки.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 10.12.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Прочитал, что можно с помощью CryptoAPI, но как с ним работать не нашёл.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 10.12.2007, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот настряпал:

На форме Button1, Butto2, OpenDialog1, OpenDialog2.
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include<StrUtils.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
        char ch;
        FILE *s=fopen(OpenDialog1->FileName.c_str(),"rb");
        FILE *d=fopen((OpenDialog1->FileName+".fsh").c_str(),"wb");
        while(!feof(s))
        {
                ch=fgetc(s);
                ch=ch<<1;
                fputc(ch,d);
        }
        fclose(s);
        fclose(d);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(OpenDialog2->Execute())
{
        char ch;
        FILE *s=fopen(OpenDialog2->FileName.c_str(),"rb");
        FILE *d=fopen((AnsiReplaceStr(OpenDialog2->FileName,".fsh","")).c_str(),"wb");
        while(!feof(s))
        {
                ch=fgetc(s);
                ch=ch>>1;
                fputc(ch,d);
        }
        fclose(s);
        fclose(d);
}
}
//---------------------------------------------------------------------------


Конечно, шифровкой это не назовёшь, да и дешифруется неправильно(текстовые файлы почти правильно дешифруются, а вот другие никак).
И тем более, нужно использовать пароль(перед шифровкой вводится пароль, и потом, с использованием пароля, файл шифруется. При дешифровке вводится пароль, если он неправильный, то файл расшифруется неправильно и соответственно не будет рабочим).
У кого-нибудь есть мысли по этому поводу?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Sharkfire
Дата 10.12.2007, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

void code(char* Key, char* inString)
{
    unsigned int a = 0, b = 0;
    a = 0;
    while (inString[a])
    {
        b = 0;
        while (Key[b])
        {
            inString[a] ^= (Key[b] + (a*b));
            b++;
        }
        a++;
    }
}

вот такое шифрование юзай... тока следи за спец символами (конец строки и перевод коретки) !
PM MAIL ICQ   Вверх
artsb
Дата 11.12.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Sharkfire спасибо, но я что-то не совсем понимаю как это работает, и как потом расшифровать файл. Не мог бы ты коментов написать. 


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 11.12.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



На Исходниках нашёл пример простого шифрования по паролю.
Меня устраивает.
Шифрование вроде бы получается, а вот дешифруется, почему-то, только первая строка. :(
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include <string.h>

#include<StrUtils.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
AnsiString XOR_Crypt(AnsiString in, AnsiString pass)
{
AnsiString out;
for (int x=1;x<in.Length()+1;x++)
        {

        out += (char)(in[x] ^ pass[x%pass.Length()+1]);
        }
return out;
}
//--------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
Form1->Enabled=0;
        char chh[1024];
        AnsiString ch;
        FILE *s=fopen(OpenDialog1->FileName.c_str(),"rb");
        FILE *d=fopen((OpenDialog1->FileName+".fsh").c_str(),"wb");

        while(!feof(s)){
                fgets(chh,1024,s);
                ch=chh;
                fputs((XOR_Crypt(ch,Edit1->Text)).c_str(),d);
        }
        fclose(s);
        fclose(d);
Form1->Enabled=1;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(OpenDialog2->Execute())
{
Form1->Enabled=0;
        char chh[1024];
        AnsiString ch;
        FILE *s=fopen(OpenDialog2->FileName.c_str(),"rb");
        FILE *d=fopen((AnsiReplaceStr(OpenDialog2->FileName,".fsh","")).c_str(),"wb");

        while(!feof(s)){
                fgets(chh,1024,s);
                ch=chh;
                fputs((XOR_Crypt(ch,Edit1->Text)).c_str(),d);
        }
        fclose(s);
        fclose(d);
Form1->Enabled=1;
}
}
//---------------------------------------------------------------------------



Это сообщение отредактировал(а) artsb - 11.12.2007, 16:46


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Sharkfire
Дата 11.12.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(artsb @  11.12.2007,  16:44 Найти цитируемый пост)
 out += (char)(in[x] ^ pass[x%pass.Length()+1]);

ну это и есть XOR шиврование )))

в моём примере так :
Код

inString[a] ^= (Key[b] + (a*b));


Это сообщение отредактировал(а) Sharkfire - 11.12.2007, 17:33
PM MAIL ICQ   Вверх
artsb
Дата 11.12.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну хорошо, а почему тогда расшифровка не полностью происходит.

Пример:
Содержимое файла proba.txt:
--------------------------------------
привет.
как у тебя дела?

что ты делаешь?
--------------------------------------
После шифровки в файле proba.txt.fsh:
--------------------------------------
ќ„ЌЏ€“\yo˜”ЏMћAЂ‘„’M…—џ…R`k~…†‹MџљRђЂ†Ќ„Љ€Z
--------------------------------------
После дешифровки в файле proba.txt:
--------------------------------------
привет.
хщо?к$ньеа9аътд дфя(тч3вфгайлъ.
--------------------------------------

Почему так?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Sharkfire
Дата 11.12.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вот тут проблемный кусок "out += (char)(in[x] ^ pass[x%pass.Length()+1]);"
во первых char. желательно приводить оба аргумента к byte
кстати, второй не приводится даже к char

потом, попробуй вместо pass[x%pass.Length()+1]  взять просто pass - что получим
PM MAIL ICQ   Вверх
artsb
Дата 11.12.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Sharkfire так ведь тут "out += (char)(in[x] ^ pass[x%pass.Length()+1]);" в большие скобки взято.
Тем более без сохранения шифрация и дешифрация проходят хорошо. Скорее всего я неправильно работаю с файлами:
Я считываю из файла proba.txt построково и записываю в файл proba.txt.fsh построково, а врезультате в файле proba.txt.fsh одна строка! smile 


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 12.12.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Люди добрые, ну помогите найти ошибку. Или предложите свой вариант. Любой.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 12.12.2007, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Интересно, что при использовании, приведённого мною, кода, всё отлично работает, если в качестве пароля ввести 1 символ. Но меня это не устраивает. :(


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 12.12.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот, переделал:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include <string.h>

#include<StrUtils.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
Form1->Enabled=0;
        char chh, *pass;
        pass = new char [Edit1->Text.Length()];
        pass=Edit1->Text.c_str();
        FILE *s=fopen(OpenDialog1->FileName.c_str(),"rb");
        FILE *d=fopen((OpenDialog1->FileName+".fsh").c_str(),"wb");
        pass=Edit1->Text.c_str();
        while(!feof(s)){
                chh=fgetc(s);
                for (int x=1;x<(Edit1->Text.Length()+1);x++)
                {
                chh = (char)(chh ^ pass[x]);
                 }
                fputc(chh,d);
        }
        fclose(s);
        fclose(d);
Form1->Enabled=1;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(OpenDialog2->Execute())
{
Form1->Enabled=0;
        char chh, *pass;
        pass = new char [Edit1->Text.Length()];
        pass=Edit1->Text.c_str();
        FILE *s=fopen(OpenDialog2->FileName.c_str(),"rb");
        FILE *d=fopen((AnsiReplaceStr(OpenDialog2->FileName,".fsh","")).c_str(),"wb");

        while(!feof(s)){
                chh=fgetc(s);
                for (int x=(Edit1->Text.Length());x>0;x--)
                {
                chh = (char)(chh ^ pass[x]);
                 }
                fputc(chh,d);
        }
        fclose(s);
        fclose(d);
Form1->Enabled=1;
}
}
//---------------------------------------------------------------------------

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

Это сообщение отредактировал(а) artsb - 12.12.2007, 10:33


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Sharkfire
Дата 12.12.2007, 13:09 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



artsb, сделай отладку.. проверяй каждое действие на каждом шаге цыкла... 
я думаю ты так быстро найдёшь ответы на свои вопросы  smile 
PM MAIL ICQ   Вверх
artsb
Дата 12.12.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот. Настряпал. Помогли. Может кому пригодится.
Пробовал с *.txt, *.exe, *.mp3 файлами. Пока всё работает.
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<stdio.h>
#include <string.h>

#include<StrUtils.hpp>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//--------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(OpenDialog1->Execute())
{
Form1->Enabled=0;
        char *pass;  
        int chh=0;
        pass = new char [Edit1->Text.Length()+1];  
        strcpy(pass,Edit1->Text.c_str());     
        FILE *s=fopen(OpenDialog1->FileName.c_str(),"rb");
        if(s==NULL) 
        {
       delete[] pass;
       Form1->Enabled=true;
       MessageBox(NULL,"Произошла ошибка при открытии файла!","Внимание!",MB_OK|MB_ICONERROR|MB_TASKMODAL);
       }
        FILE *d=fopen((OpenDialog1->FileName+".fsh").c_str(),"wb");
        if(d==NULL) 
        {
        delete[] pass;
        fclose(s);
        Form1->Enabled=true;
       MessageBox(NULL,"Произошла ошибка при открытии файла!","Внимание!",MB_OK|MB_ICONERROR|MB_TASKMODAL);
        } 
        unsigned int index=0;  
        while(!feof(s)){
                chh=fgetc(s);
                if(chh==EOF) break;         
                fputc(chh^(int)pass[index],d);  
                index++;
                if(index >=strlen(pass)) index=0;
        }
        delete[] pass;
        fclose(s);
        fclose(d);
Form1->Enabled=1;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(OpenDialog2->Execute())
{
Form1->Enabled=0;
        char *pass; 
        int chh=0;
        pass = new char [Edit1->Text.Length()+1];  
        strcpy(pass,Edit1->Text.c_str());     
        FILE *s=fopen(OpenDialog2->FileName.c_str(),"rb");
        if(s==NULL) 
       {
        delete[] pass;
        Form1->Enabled=true;
        MessageBox(NULL,"Произошла ошибка при открытии файла!","Внимание!",MB_OK|MB_ICONERROR|MB_TASKMODAL);
       }
        FILE *d=fopen((AnsiReplaceStr(OpenDialog2->FileName,".fsh","")).c_str(),"wb");
       if(d==NULL) 
       {
        delete[] pass;
        fclose(s);
        Form1->Enabled=true;
        MessageBox(NULL,"Произошла ошибка при открытии файла!","Внимание!",MB_OK|MB_ICONERROR|MB_TASKMODAL);
        }
        unsigned int index=0;  
        while(!feof(s)){
                chh=fgetc(s);
                if(chh==EOF) break;         
                fputc(chh^(int)pass[index],d);  
                index++;
                if(index >=strlen(pass)) index=0;
        }
        delete[] pass;
        fclose(s);
        fclose(d);
Form1->Enabled=1;
}
}
//---------------------------------------------------------------------------


Спецы посмотрите плиз. Может ошибки заметите какие-нибудь.

Это сообщение отредактировал(а) artsb - 12.12.2007, 16:29


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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