Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Написал алгоритм Blowfish (помогите найти ошибку) 
:(
    Опции темы
Crash512
Дата 4.12.2007, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите найти ошибку! Исходник прикрепил...

Вроде всё шифрует и дешифрует... Но в зависимости от введённого пароля он не всегда шифрует текст полностью... Ума не приложу, в чём может быть ошибка...

Вот код (лучше посмотрите по исходнику):

Код

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"

#define F(x) (((SB[0][x.byte.b1] + SB[1][x.byte.b2]) ^ SB[2][x.byte.b3]) + SB[3][x.byte.b4])

TForm1 *Form1;

TStringList  *Inp = new TStringList;
String text;
String txt;
unsigned int PA[18];
unsigned int SB[4][256];

struct BlockByte {
    unsigned int b1:8;
    unsigned int b2:8;
    unsigned int b3:8;
    unsigned int b4:8;
};

union Block {
    unsigned int word;
    BlockByte byte;
};

struct DblBlock {
    Block word1;
    Block word2;
};

inline void BF_En(Block *x1, Block *x2);
inline void BF_De(Block *x1, Block *x2);
char Check_Inp_Sym(int i);
char Check_Out_Sym(int i);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
char Check_Sym(int i) {
 if (i <= text.Length()) {
        return text[i];
 } else {
        return NULL;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Encrypt() {

  DblBlock words;

  txt = "";

  for (int i=1; i<=text.Length(); i += 8)
  {
   words.word1.byte.b1 = Check_Sym(i);
   words.word1.byte.b2 = Check_Sym(i+1);
   words.word1.byte.b3 = Check_Sym(i+2);
   words.word1.byte.b4 = Check_Sym(i+3);

   words.word2.byte.b1 = Check_Sym(i+4);
   words.word2.byte.b2 = Check_Sym(i+5);
   words.word2.byte.b3 = Check_Sym(i+6);
   words.word2.byte.b4 = Check_Sym(i+7);

   BF_En(&words.word1, &words.word2);

   txt += (char)words.word1.byte.b1;
   txt += (char)words.word1.byte.b2;
   txt += (char)words.word1.byte.b3;
   txt += (char)words.word1.byte.b4;
   txt += (char)words.word2.byte.b1;
   txt += (char)words.word2.byte.b2;
   txt += (char)words.word2.byte.b3;
   txt += (char)words.word2.byte.b4;
   }
txt_out->Text = txt;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Decrypt() {

  DblBlock words;

  txt = "";

  for (int i=1; i<=text.Length(); i += 8)
  {
   words.word1.byte.b1 = Check_Sym(i);
   words.word1.byte.b2 = Check_Sym(i+1);
   words.word1.byte.b3 = Check_Sym(i+2);
   words.word1.byte.b4 = Check_Sym(i+3);

   words.word2.byte.b1 = Check_Sym(i+4);
   words.word2.byte.b2 = Check_Sym(i+5);
   words.word2.byte.b3 = Check_Sym(i+6);
   words.word2.byte.b4 = Check_Sym(i+7);

   BF_De(&words.word1, &words.word2);

   txt += (char)words.word1.byte.b1;
   txt += (char)words.word1.byte.b2;
   txt += (char)words.word1.byte.b3;
   txt += (char)words.word1.byte.b4;
   txt += (char)words.word2.byte.b1;
   txt += (char)words.word2.byte.b2;
   txt += (char)words.word2.byte.b3;
   txt += (char)words.word2.byte.b4;
  }
txt_blow->Text = txt;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Gen_Subkey(char * Pass) {
  unsigned int pas_len = strlen(Pass), j;
  Block pas_block, null_block1, null_block2;

  j = 0;

    for (int i=0; i<18; i++)
    {
    pas_block.byte.b1 = Pass[(j++)%pas_len];
    pas_block.byte.b2 = Pass[(j++)%pas_len];
    pas_block.byte.b3 = Pass[(j++)%pas_len];
    pas_block.byte.b4 = Pass[(j++)%pas_len];
    PA[i] ^= pas_block.word;
    }

    null_block1.word = null_block2.word = 0;

    for (int i=0; i<18; i+=2)
    {
    BF_En(&null_block1, &null_block2);
    PA[i] = null_block1.word;
    PA[i+1] = null_block2.word;
    }

    for (int j=0; j<4; j++)
    {
    for (int i=0; i<256; i+=2)
    {
      BF_En(&null_block1, &null_block2);
      SB[j][i] = null_block1.word;
      SB[j][i+1] = null_block2.word;
    }
    }

   pas_block.word = null_block1.word = null_block2.word = 0;
   Pass = NULL;
   pas_len = 0;
   j = 0;
}
//---------------------------------------------------------------------------
void BF_En(Block *x1, Block *x2) {
  Block w1 = *x1, w2 = *x2;

  w1.word ^= PA[0];             w2.word ^= F(w1)^PA[1];
  w1.word ^= F(w2)^PA[2];       w2.word ^= F(w1)^PA[3];
  w1.word ^= F(w2)^PA[4];       w2.word ^= F(w1)^PA[5];
  w1.word ^= F(w2)^PA[6];       w2.word ^= F(w1)^PA[7];
  w1.word ^= F(w2)^PA[8];       w2.word ^= F(w1)^PA[9];
  w1.word ^= F(w2)^PA[10];      w2.word ^= F(w1)^PA[11];
  w1.word ^= F(w2)^PA[12];      w2.word ^= F(w1)^PA[13];
  w1.word ^= F(w2)^PA[14];      w2.word ^= F(w1)^PA[15];
  w1.word ^= F(w2)^PA[16];      w2.word ^= PA[17];

  *x1 = w2;
  *x2 = w1;
}
//---------------------------------------------------------------------------
void BF_De(Block *x1, Block *x2) {
  Block w1 = *x1, w2 = *x2;

  w1.word ^= PA[17];            w2.word ^= F(w1)^PA[16];
  w1.word ^= F(w2)^PA[15];      w2.word ^= F(w1)^PA[14];
  w1.word ^= F(w2)^PA[13];      w2.word ^= F(w1)^PA[12];
  w1.word ^= F(w2)^PA[11];      w2.word ^= F(w1)^PA[10];
  w1.word ^= F(w2)^PA[9];       w2.word ^= F(w1)^PA[8];
  w1.word ^= F(w2)^PA[7];       w2.word ^= F(w1)^PA[6];
  w1.word ^= F(w2)^PA[5];       w2.word ^= F(w1)^PA[4];
  w1.word ^= F(w2)^PA[3];       w2.word ^= F(w1)^PA[2];
  w1.word ^= F(w2)^PA[1];       w2.word ^= PA[0];

  *x1 = w2;
  *x2 = w1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Reset() {

  unsigned int i,j;

  unsigned int PA_Init[18] =  {
    0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
    0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
    0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
    0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
    0x9216d5d9, 0x8979fb1b
  };

  unsigned int SB_Init[4][256] =  {
    0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
    0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
    0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
    0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
    ...И так далее... Там 1024 строчки, поэтому все сюда не стал писать=)
  };

  for (i=0; i<18; i++) {
    PA[i] = PA_Init[i];
  }

  for (j=0; j<4; j++) {
    for (i=0; i<256; i++) {
      SB[j][i] = SB_Init[j][i];
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
OpenD->Execute();
Inp->LoadFromFile(OpenD->FileName);
txt_inp->Text = Inp->Text;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Inp->LoadFromFile("text.txt");
txt_inp->Text = Inp->Text;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
text = txt_inp->Text;
char * Passwd = Pass->Text.c_str();
Reset();
Gen_Subkey(Passwd);
Encrypt();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
text = txt_out->Text;
char * Passwd = Pass->Text.c_str();
Reset();
Gen_Subkey(Passwd);
Decrypt();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)
{
   for (int i=0; i<18; i++) {
        P_Arr->Cells[0][i] = (char)PA[i];
   }
   Edit1->Text = txt_inp->Text.Length();
   Edit2->Text = txt_out->Text.Length();
   Edit3->Text = txt_blow->Text.Length();
}
//---------------------------------------------------------------------------


Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Blowfish.zip 43,90 Kb
PM MAIL ICQ   Вверх
orthrus
Дата 4.12.2007, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

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



В свое время тоже реализовывал этот алгоритм и наткнулся на ту же проблему! Проблема решается просто! Работай  с файлом напрямую. Ты работаешь с AnsiString и в этом вся проблема, когда шифруешь данные появляются последовательности вида "\0" для строки это обозначает конец!!

Цитата(Crash512 @  4.12.2007,  01:56 Найти цитируемый пост)
 он не всегда шифрует текст полностью


шифруется всё полностью, не всё выводится в TMemo, т.е. выводится все до первого "\0", в этом и заключается проблема smile 

Это сообщение отредактировал(а) orthrus - 4.12.2007, 10:43


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
Crash512
Дата 4.12.2007, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А можешь на примере показать?.. А то что-то никак не разбирусь...
PM MAIL ICQ   Вверх
Crash512
Дата 5.12.2007, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если считывать с файла на прямую, ничего не меняется.. Я понял в чём фигня... Просто чтобы передать инфу в TMemo, нужно использовать string... Вот этот момент нужно обойти... Как это сделать?.. Нужно шифрованный текст записать в файл?.. Как его напрямую записать?.. Напишите какой-нибудь примерчик...
PM MAIL ICQ   Вверх
orthrus
Дата 5.12.2007, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

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



При шифровании и дешифровке ты работаешь со строкой (String txt;). Она тебя ограничивает изначально, т.к. operator+= не пишет после символа конца строки"\0", если даже пишет то этого все равно не видно. Надо переделать функции Encrypt() и Decrypt() так что бы они работали с перемеными типа unsigned long, т.е. примерно так: 

Код

Encrypt(unsigned long* left_block, unsigned long* right_block) 

так же 
Код

Decrypt(unsigned long* left_block, unsigned long* right_block)


Циклы из этих функций я бы убрал совсем. Эти функции должны вызываться внутри цикла и обрабатывать один блок в 8-м байт, т.е. 2-а блока по 4-ре байта считаные из файла. 

Т.е. в этом случае, следует вообще отказаться от текстового представления информации smile В TMemo шыфрованый файл вывести все равно не получится, он выведет все до первого "\0". Т.е. эту прогу еще дорабатывать и дорабатывать smile 

Это сообщение отредактировал(а) orthrus - 5.12.2007, 07:29


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
orthrus
Дата 5.12.2007, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

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



вот немного переделал твой код, теперь прога работает с файлами напрямую

Это сообщение отредактировал(а) orthrus - 5.12.2007, 09:50

Присоединённый файл ( Кол-во скачиваний: 37 )
Присоединённый файл  Blowfish.rar 10,43 Kb


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
Crash512
Дата 5.12.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, так понятней!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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