Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование данных 
:(
    Опции темы
MrDmitry
Дата 19.10.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



парни помогите зашифровать/дешифровать файл

не давно создавал тему, там мне подскощали как создовать/загрузить файл

сохранение:
Код

std::auto_ptr<TStringList>list(new TStringList);
     list->Add(loginEdit->Text);
     list->Add(passEdit->Text);
     list->SaveToFile("user.dat")


Загрузка
Код

std::auto_ptr<TStringList>list(new TStringList);
     list->LoadFromFile("user.dat");
     String login = list->Strings[0];
         String pass = list->Strings[1];

     if(login == ""){
      Label3->Visible = true;
      CheckBox1->Visible = false;
     }
    else
    {
     loginEdit->Text = login;
     passEdit->Text = pass;


а как все это шифровать/дешифровать? метод не важен главное результат smile
PM MAIL   Вверх
mrbrooks
Дата 20.10.2009, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



MrDmitry, совершенно верно - в данном случае ты работаешь просто с текстовым файлом. Но если ты посмотришь свою тему я тебе там выложил работу уже с бинарным файлом. Защита не ахти какая, но уже текстовым редактором не прочитаешь.
PM MAIL   Вверх
mrbrooks
Дата 20.10.2009, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Собственно в самом VCL есть шифрование, правда несколько банальное но в твоем случае этого достаточно имхо.

Код

#include <memory>
#include <encddecd.hpp>
//---------------------------------------------------------------------------
void __fastcall TMainForm::BtnSaveClick(TObject *Sender)
{
     std::auto_ptr<TStringList>list(new TStringList);
     list->Add("user: "+ loginEdit->Text);
     list->Add("password: " + passEdit->Text);
     list->Text = EncodeString(list->Text);
     std::auto_ptr<TFileStream>file(new TFileStream("user.dat",fmCreate));
     file->Write(list->Text.c_str(),list->Text.Length()*2);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::BtnLoadClick(TObject *Sender)
{
     std::auto_ptr<TFileStream>file(new TFileStream("user.dat",fmOpenRead));
     wchar_t *buf = new wchar_t[file->Size];
     file->Read(buf,file->Size);
     std::auto_ptr<TStringList>list(new TStringList);
     list->Text = String(buf);
     list->Text = DecodeString(list->Text);
     String user = list->Strings[0];
     String pass = list->Strings[1];
}
//---------------------------------------------------------------------------


Если хочешь более кошерного решения - то придется юзать сторонние библиотеки. К примеру CryptoAPI.
PM MAIL   Вверх
vikaz
Дата 20.10.2009, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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





--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
MrDmitry
Дата 20.10.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrbrooks @ 20.10.2009,  07:43)
MrDmitry, совершенно верно - в данном случае ты работаешь просто с текстовым файлом. Но если ты посмотришь свою тему я тебе там выложил работу уже с бинарным файлом. Защита не ахти какая, но уже текстовым редактором не прочитаешь.

я видел твой вариант с бинарным файлом, заказчика он не устроил (
PM MAIL   Вверх
xvr
Дата 20.10.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Пароли обычно не шифруют, а хранят однонаправленные криптографические хэши от них (например MD5 или SHA1). Хэш можно прогнать через вышеупомянутый EncodeString, получишь некий текст. 
Еще рекомендуется перед хэшированием пароля добавить к нему несколько случайных символов, и их же добавить к результирующему хэшу, что бы можно было позже проверить правильность пароля

PM MAIL   Вверх
MrDmitry
Дата 20.10.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrbrooks @ 20.10.2009,  08:00)
Собственно в самом VCL есть шифрование, правда несколько банальное но в твоем случае этого достаточно имхо.

Код

#include <memory>
#include <encddecd.hpp>
//---------------------------------------------------------------------------
void __fastcall TMainForm::BtnSaveClick(TObject *Sender)
{
     std::auto_ptr<TStringList>list(new TStringList);
     list->Add("user: "+ loginEdit->Text);
     list->Add("password: " + passEdit->Text);
     list->Text = EncodeString(list->Text);
     std::auto_ptr<TFileStream>file(new TFileStream("user.dat",fmCreate));
     file->Write(list->Text.c_str(),list->Text.Length()*2);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::BtnLoadClick(TObject *Sender)
{
     std::auto_ptr<TFileStream>file(new TFileStream("user.dat",fmOpenRead));
     wchar_t *buf = new wchar_t[file->Size];
     file->Read(buf,file->Size);
     std::auto_ptr<TStringList>list(new TStringList);
     list->Text = String(buf);
     list->Text = DecodeString(list->Text);
     String user = list->Strings[0];
     String pass = list->Strings[1];
}
//---------------------------------------------------------------------------


Если хочешь более кошерного решения - то придется юзать сторонние библиотеки. К примеру CryptoAPI.

код работает но при каждом запуске выдает ошибку

Project iFlyCards.exe raised exeption class EStringListError with message "list index out of bounds (1)"

Добавлено через 2 минуты и 23 секунды
Цитата(xvr @ 20.10.2009,  11:49)
Пароли обычно не шифруют, а хранят однонаправленные криптографические хэши от них (например MD5 или SHA1). Хэш можно прогнать через вышеупомянутый EncodeString, получишь некий текст. 
Еще рекомендуется перед хэшированием пароля добавить к нему несколько случайных символов, и их же добавить к результирующему хэшу, что бы можно было позже проверить правильность пароля

честно говоря в c++ вообще пока не шарю, это мой 1 проект smile
можно для выше написаного пример? )
PM MAIL   Вверх
mrbrooks
Дата 20.10.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(MrDmitry @  20.10.2009,  11:52 Найти цитируемый пост)
Project iFlyCards.exe raised exeption class EStringListError with message "list index out of bounds (1)"

у меня все ок. скорее всего ты что то не докопировал или добавил своего. Ошибка обращения к TStringList по индексу.

Цитата(MrDmitry @  20.10.2009,  11:52 Найти цитируемый пост)
честно говоря в c++ вообще пока не шарю, это мой 1 проект

это заметно.  smile 

Цитата(xvr @  20.10.2009,  11:49 Найти цитируемый пост)
Пароли обычно не шифруют, а хранят однонаправленные криптографические хэши от них (например MD5 или SHA1). 

Это да. Парню есть куда развиваться - но имхо - еще рановато. Пусть хотя бы вкурит функционал из <encddecd.hpp> smile 
PM MAIL   Вверх
MrDmitry
Дата 20.10.2009, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrbrooks @ 20.10.2009,  12:04)
Цитата(MrDmitry @  20.10.2009,  11:52 Найти цитируемый пост)
Project iFlyCards.exe raised exeption class EStringListError with message "list index out of bounds (1)"

у меня все ок. скорее всего ты что то не докопировал или добавил своего. Ошибка обращения к TStringList по индексу.

Цитата(MrDmitry @  20.10.2009,  11:52 Найти цитируемый пост)
честно говоря в c++ вообще пока не шарю, это мой 1 проект

это заметно.  smile 

Цитата(xvr @  20.10.2009,  11:49 Найти цитируемый пост)
Пароли обычно не шифруют, а хранят однонаправленные криптографические хэши от них (например MD5 или SHA1). 

Это да. Парню есть куда развиваться - но имхо - еще рановато. Пусть хотя бы вкурит функционал из <encddecd.hpp> smile

вот сделал так


Код

//Загрузка
void __fastcall TAuthForm::FormShow(TObject *Sender)
{
std::auto_ptr<TFileStream>file(new TFileStream("user.dat",fmOpenRead));
     wchar_t *buf = new wchar_t[file->Size];
     file->Read(buf,file->Size);
     std::auto_ptr<TStringList>list(new TStringList);
     list->Text = String(buf);
     list->Text = DecodeString(list->Text);
     String login = list->Strings[0];
     String pass = list->Strings[1];

     if(login == ""){
      Label3->Visible = true;
      CheckBox1->Visible = false;
     }
    else
    {
     loginEdit->Text = login;
     passEdit->Text = pass;

      Label3->Visible = false;
      CheckBox1->Visible = true;
      CheckBox1->Checked = true;
    }
}

//Сохранение
void __fastcall TAuthForm::Label3Click(TObject *Sender)
{
  std::auto_ptr<TStringList>list(new TStringList);
     list->Add("user: "+ loginEdit->Text);
     list->Add("password: " + passEdit->Text);
     list->Text = EncodeString(list->Text);
     std::auto_ptr<TFileStream>file(new TFileStream("user.dat",fmCreate));
     file->Write(list->Text.c_str(),list->Text.Length()*2);

 Label3->Visible = false;
 CheckBox1->Checked = true;
 CheckBox1->Visible = true;

}


И вылазиет эта ошибка ((

Это сообщение отредактировал(а) MrDmitry - 20.10.2009, 12:17
PM MAIL   Вверх
xvr
Дата 20.10.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MrDmitry @ 20.10.2009,  11:52)
Цитата(xvr @ 20.10.2009,  11:49)
Пароли обычно не шифруют, а хранят однонаправленные криптографические хэши от них (например MD5 или SHA1). Хэш можно прогнать через вышеупомянутый EncodeString, получишь некий текст. 
Еще рекомендуется перед хэшированием пароля добавить к нему несколько случайных символов, и их же добавить к результирующему хэшу, что бы можно было позже проверить правильность пароля

честно говоря в c++ вообще пока не шарю, это мой 1 проект smile
можно для выше написаного пример? )

Можно:
Код

#include <encddecd.hpp>
#include "Md5.h"

static AnsiString encode_password_aux(AnsiString passwd, int r1, int r2)
{
 char b[16];
 AnsiString h("  ");
 h[1]=r1;
 h[2]=r2;
 h+=passwd;
 
 MD5 md5;
 md5.update(h.c_str(),h.Length());
 md5.final(b);

 return h.SubString(1,2)+AnsiString(b,16);
}

AnsiString encode_password(AnsiString passwd)
{
 return EncodeString(encode_password_aux(passwd,rand(),rand()));
}

bool check_password(AnsiString user_passwd, AnsiString password_from_file)
{
 password_from_file = DecodeString(password_from_file);
 return password_from_file==encode_password_aux(user_passwd,password_from_file[1],password_from_file[2]);
}

Функция encode_password зашифровывает пароль для записи в текстовый файл, функция check_password проверяет, что пароль из текстового файла и введенный пользователем совпадают

PS. Для BCB 6.0 конструкцию AnsiString(b,16) надо заменить на явное создание строки из 16ти символов и копирования в нее b, там в VCL ошибка  smile 

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  md5.zip 3,88 Kb
PM MAIL   Вверх
mrbrooks
Дата 20.10.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(MrDmitry @  20.10.2009,  12:16 Найти цитируемый пост)
И вылазиет эта ошибка ((

ты написал загрузку файла при появление формы. не факт что файл заполнен, и по этому TStringList пуст. А ты между тем обращаешься к его элементам, которых собственно и существует. Прежде чем загружать файл - проверь его длину.
PM MAIL   Вверх
MrDmitry
Дата 20.10.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrbrooks @ 20.10.2009,  12:34)
Цитата(MrDmitry @  20.10.2009,  12:16 Найти цитируемый пост)
И вылазиет эта ошибка ((

ты написал загрузку файла при появление формы. не факт что файл заполнен, и по этому TStringList пуст. А ты между тем обращаешься к его элементам, которых собственно и существует. Прежде чем загружать файл - проверь его длину.

а что мне даст проверка его длины? ))

файл физически создается (я его вижу) и шефруется

проблема только в загрузки которую я не могу решить не как (((

пробовал вытаскивать функцию загрузки из FormShow и вставлять на клик button. тоже самое ((
PM MAIL   Вверх
mrbrooks
Дата 20.10.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(MrDmitry @  20.10.2009,  13:14 Найти цитируемый пост)
а что мне даст проверка его длины? ))

есть ли в нем информация или нет, при условии что он создан. что тут не понятного?
PM MAIL   Вверх
MrDmitry
Дата 20.10.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А как проверить его длину smile 
PM MAIL   Вверх
mrbrooks
Дата 20.10.2009, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

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



Цитата(MrDmitry @  20.10.2009,  13:30 Найти цитируемый пост)
А как проверить его длину

если брать твой код за основу то примерно так:
Код

void __fastcall TAuthForm::FormShow(TObject *Sender)
{
     std::auto_ptr<TFileStream>file(new TFileStream("user.dat",fmOpenRead));
if(!file->Size)
{      
     wchar_t *buf = new wchar_t[file->Size];
     file->Read(buf,file->Size);
     std::auto_ptr<TStringList>list(new TStringList);
     list->Text = String(buf);
     list->Text = DecodeString(list->Text);
     String login = list->Strings[0];
     String pass = list->Strings[1];
     if(login == ""){
      Label3->Visible = true;
      CheckBox1->Visible = false;
     }
    else
    {
     loginEdit->Text = login;
     passEdit->Text = pass;
      Label3->Visible = false;
      CheckBox1->Visible = true;
      CheckBox1->Checked = true;
    }
}
else ShowMessage("Файл пуст!");
}





PM MAIL   Вверх
MrDmitry
Дата 20.10.2009, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mrbrooks @ 20.10.2009,  13:34)
Цитата(MrDmitry @  20.10.2009,  13:30 Найти цитируемый пост)
А как проверить его длину

если брать твой код за основу то примерно так:
Код

void __fastcall TAuthForm::FormShow(TObject *Sender)
{
     std::auto_ptr<TFileStream>file(new TFileStream("user.dat",fmOpenRead));
if(!file->Size)
{      
     wchar_t *buf = new wchar_t[file->Size];
     file->Read(buf,file->Size);
     std::auto_ptr<TStringList>list(new TStringList);
     list->Text = String(buf);
     list->Text = DecodeString(list->Text);
     String login = list->Strings[0];
     String pass = list->Strings[1];
     if(login == ""){
      Label3->Visible = true;
      CheckBox1->Visible = false;
     }
    else
    {
     loginEdit->Text = login;
     passEdit->Text = pass;
      Label3->Visible = false;
      CheckBox1->Visible = true;
      CheckBox1->Checked = true;
    }
}
else ShowMessage("Файл пуст!");
}

пишет файл пуст (((
хотя опять же визуально я его вижу

содержимое

YW50b24NCnBhc3N3b3JkDQo=


ниже пустая строка

PM MAIL   Вверх
MrDmitry
Дата 21.10.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Парни раз уж поднимал такую тему, не подскажите а как шифровать xor?? гуглил, но ни чего путевого там не нашол,  или не понел smile
PM MAIL   Вверх
xvr
Дата 22.10.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MrDmitry @ 21.10.2009,  22:40)
Парни раз уж поднимал такую тему, не подскажите а как шифровать xor?? гуглил, но ни чего путевого там не нашол,  или не понел smile

Берешь генератор случайных чисел (лучше криптографически стойкий, например RC4), генеришь им столько байтов, сколько символов тебе надо зашифровать. Потом применяешь операцию '^' между каждым байтом с генератора и исходными символами. Получаешь БИНАРНУЮ зашифрованную последовательность

Код

class RndStreamFast {
 unsigned char S[256];
 unsigned char ci, cj;

public:

 RndStreamFast(const void* passwd, size_t length);
 int get_byte();
};


int RndStreamFast::get_byte()
{
 ci++; cj+=S[ci];
 std::swap(S[ci],S[cj]);
 return S[(S[ci]+S[cj])&255];
}

RndStreamFast::RndStreamFast(const void* passwd, size_t length)
{
 int i,k;
 unsigned char K[256];
 const char* rnd_bits = (const char*)passwd;

 for(i=0;i<255;++i) S[i]=i;
 ci=cj=0;

 // Fill array K by 256 bytes key (you can use any algorithm, as you wish)
 for(i=0;i<16;++i)
  {
   MD5 md5;
   int sh=i;
   for(k=0;k<64;++k)
    {
     md5.update(rnd_bits+sh,1);
     sh+=237; sh%=length;
    }
   md5.final(K+i*16);
  }

 unsigned char j=0;
 for(i=0;i<256;++i)
  {
   j+=S[i]+K[i];
   std::swap(S[i],S[j]);
  }
}

AnsiString crypt(AnsiString data, RndStreamFast& rgen)
{
 for(size_t i=1;i<=data.Length();++i)
  data[i]^=rgen.get_byte();
 return data;
}



Добавлено через 1 минуту и 36 секунд
Да, кстати. Простой EncodeString не дает НИКАКОЙ защиты. base64 кодировку видно даже невооруженным глазом  smile 
Это поможет только от пользователей, которые панически боятся компьютера  smile 
PM MAIL   Вверх
Нитонисе
Дата 11.1.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что это за ошибка?
Код

[Linker Error] Unresolved external 'MD5::MD5()' referenced from D:\ÏÐÎÃÐÀÌÈÐÎÂÀÍÈÅ\ÇÀÙÈÒÀ\ÃÅÍÅÐÀÒÎÐ ÊÎÄÀ\UNIT1.OBJ

Md5 подключен инструкцией #include "Md5.h"
PM MAIL   Вверх
xvr
Дата 11.1.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Нитонисе @ 11.1.2010,  12:38)
Что это за ошибка?
Код

[Linker Error] Unresolved external 'MD5::MD5()' referenced from D:\ÏÐÎÃÐÀÌÈÐÎÂÀÍÈÅ\ÇÀÙÈÒÀ\ÃÅÍÅÐÀÒÎÐ ÊÎÄÀ\UNIT1.OBJ

Md5 подключен инструкцией #include "Md5.h"

Нужно в проект подключить модуль md5 (он не только из md5.h состоит, там еще md5.cpp есть)

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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