Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Помогите отладить  (Прочитано 33155 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 12-05-2010 20:41 » 

Цитата: CrazyBanja
жаль только работает неправильно((

Да это уже мелочи  Улыбаюсь
Записан
CrazyBanja
Интересующийся

ua
Offline Offline

« Ответ #31 : 12-05-2010 20:45 » 

Не глянешь на код? Может найдешь ошибки. А то я запутался совсем...
Код:
//---------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
//---------------------------------------------------------------------------
// взято из хелпа, определяем размер файла
long filesize(FILE *stream)
{
 long curpos, length;
 curpos = ftell(stream);
 fseek(stream, 0L, SEEK_END);
 length = ftell(stream);
 fseek(stream, curpos, SEEK_SET);
 return length;
}
// функция, реализующая работу ГОСТ 28147-89 в режиме простой замены
void rpz(int rezh, char* opener, char* saver)
{
 FILE *f_begin, *f_end; // потоки для исходного и конечного файлов
 // таблица замен
 unsigned char Tab_Z[8][16] =
 {
  0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
  0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
  0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
  0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
  0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
  0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
  0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
  0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9,0xA,0xB,0xC,0xD,0xE,0xF,
 };
// ключик
 unsigned long key[8] =
 {
  0x0123,
  0x4567,
  0x89AB,
  0xCDEF,
  0x0123,
  0x4567,
  0x89AB,
  0xCDEF,
 };

 char N[4]; // 32-разрядный накопитель,
 unsigned long n1=0, n2=0, SUM232=0; // накопители N1, N2, и сумматор
 // открываем файлы
 f_begin = fopen (opener,"rb");
 f_end = fopen (saver,"wb");
 // определим количество блоков
 float blokoff;
 blokoff=8*filesize(f_begin);
 blokoff = blokoff/64;
 int block = blokoff;
 if (blokoff-block>0) block++;
 int sh;
 if (filesize(f_begin)>=4) sh = 4; else sh = filesize(f_begin);
 int sh1 = 0;
 int flag=0;
 // начнем считывание и преобразование блоков
 // присутствуют проверки на полноту блоков, чтобы считать только нужное количество бит
 for (int i=0; i<block; i++)
 {
  // записываем в накопитель N1
  for (int q1=0; q1<4; q1++) *((unsigned char *)&N+q1) = 0x00;

  if ((sh1+sh)<filesize(f_begin))
  {
   fread (N,sh,1,f_begin);
   sh1+=sh;
  }
  else
  {
   sh=filesize(f_begin)-sh1;
   fread (N,sh,1,f_begin);
   flag=1;
  }
  n1 = *((unsigned long *)&N);

  // записываем в накопитель N2
  for (int q2=0; q2<4; q2++) *((unsigned char *)&N+q2) = 0x00;
 // memset(N,0,sizeof(N));
  if ((sh1+sh)<filesize(f_begin))
  {
   fread (N,sh,1,f_begin);
   sh1+=sh;
  }
  else
  {
   if (flag==0)
   {
    sh=filesize(f_begin)-sh1;
    fread (N,sh,1,f_begin);
   }
  }
  n2 = *((unsigned long *)&N);

  // 32 цикла простой замены
  // ключ считываем в требуемом ГОСТом порядке
  int c = 0;
  for (int k=0; k<32; k++)
  {
   if (rezh==1) { if (k==24) c = 7; }
    else { if (k==8) c = 7; }

   // суммируем в сумматоре СМ1
   SUM232 = key[c] + n1;

   // заменяем по таблице замен
   unsigned char first_byte=0,second_byte=0,zam_symbol=0;
   int n = 7;
   for (int a=3; a>=0; a--)
   {
    zam_symbol = *((unsigned char *)&SUM232+a);
    first_byte = (zam_symbol & 0xF0) >> 4;
    second_byte = (zam_symbol & 0x0F);
    first_byte = Tab_Z[n][first_byte];
    n--;
    second_byte = Tab_Z[n][second_byte];
    n--;
    zam_symbol = (first_byte << 4) | second_byte;
    *((unsigned char *)&SUM232+a) = zam_symbol;
   }
   
   SUM232 = (SUM232<<11)|(SUM232>>21); // циклический сдвиг на 11
   SUM232 = n2^SUM232; // складываем в сумматоре СМ2

   if (k<31)
   {
    n2 = n1;
    n1 = SUM232;
   }
   if (rezh==1)
   {
    if (k<24)
    {
     c++;
     if (c>7) c = 0;
    }
    else
    {
     c--;
     if (c<0) c = 7;
    }
   }
   else
   {
    if (k<8)
    {
     c++;
     if (c>7) c = 0;
    }
   else
   {
    c--;
    if (c<0) c = 7;
   }
  }
 }
 n2 = SUM232;

 // вывод результата в файл
  char sym_rez;
  for (int q3=0; q3<=3; q3++)
  {
   sym_rez = *((unsigned char *)&n1+q3);
   fprintf(f_end, "%c", sym_rez);
  }
  for (int q4=0; q4<=3; q4++)
  {
   sym_rez = *((unsigned char *)&n2+q4);
   fprintf(f_end, "%c", sym_rez);
  }
 }
 fclose (f_begin);
 fclose (f_end);
}
//---------------------------------------------------------------------------
int main()
{
 // выбираем шифрование или расшифрование
 int rezhim = 0;
 do
 {
  printf("Vuberite rejum rabotu:\nShufrovanie - 1\nRasshufrovanie - 2\n");
   scanf("%d", &rezhim);
 } while ((rezhim!=1)&&(rezhim!=2)); // повторяем до тех пор, пока не будет введено 1 или

 // выбираем исходный и конечный файлы (слэш '\' в пути писать как '\\')
 char open_str[50], save_str[50];
 printf("\nVvedite adres faila\n");
 scanf("%s", &open_str);
 printf("\nVvedite imja zashufrovanogo faila\n");
 scanf("%s", &save_str);

 rpz(rezhim, open_str, save_str); // запускаем РПЗ
 return 0;
}
//------------------------------------------------------------------------

Записан
CrazyBanja
Интересующийся

ua
Offline Offline

« Ответ #32 : 12-05-2010 20:47 » 

Я нашел что там только один блок обрабатываеться. И сама функция шифрования тоже не правильна((


Ребят, помогите решить проблему. Надо что б после окончания шифрования 1 блока переходила к шифрованию второго. Где этот цикл впаять? (Заранее прошу прощения за свою безграмотность!)
« Последнее редактирование: 13-05-2010 16:06 от RXL » Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #33 : 13-05-2010 13:05 » 

CrazyBanja, в самом начале впаяй.
Записан
CrazyBanja
Интересующийся

ua
Offline Offline

« Ответ #34 : 13-05-2010 13:07 » 

RXL, ты мне вчера очень сильно помог, спасибо. Прога теперь работает, чудесно. Но берет только 8 символов. А надо увеличить до всего файла. Всю ж прогу циклить глупо, а сделать правильно не шарю. Подскажи пожалуста


В смысле в main() или при определении блоков?
« Последнее редактирование: 13-05-2010 16:05 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #35 : 13-05-2010 13:12 » 

CrazyBanja, я нифига не понял... В таких случаях говорят, что телепаты в отпуске. Постарайся выражаться чтобы тебя понимали.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
CrazyBanja
Интересующийся

ua
Offline Offline

« Ответ #36 : 13-05-2010 13:16 » 

Прога шифрует только первых 8 символов. Остальное теряется. А мне надо сделать так что б она могла зашифровать полностью файлы. Например страницу текста. Как это грамотно можно сделать и чем ограничить? Ограничивать надо размером файла, а циклить заполнение блоков. Как это сделать я не доганяю
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 13-05-2010 13:53 » 

Ну, читай текст по 8 символов из файла. Для каждых 8 символов запускай шифрование в цикле. Результат записывай в файл. И так, пока первый файл не закончится.
У тебя там такая каша намешана, что я бы на твоём месте отделил для начала чтение из файла от вызова собственно шифрование.
Записан
CrazyBanja
Интересующийся

ua
Offline Offline

« Ответ #38 : 13-05-2010 14:21 » new

Так вот же этот цикл, чего он не работает?
Код:
 for (int i=0; i<block; i++)


Может неправильно определяет размер?


Гляньте что там не так, где ошибка?
« Последнее редактирование: 13-05-2010 16:05 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #39 : 13-05-2010 19:58 » 

CrazyBanja, форум и чат - вещи разные. Имей терпение.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 14-05-2010 08:19 » 

CrazyBanja, тебе мягко намекают, что можно индексы использовать:

Код:
  // вывод результата в файл

  for (int q=0; q<=3; q++)
  {
   fprintf(f_end, "%c", n1[q]);
  }

  for (int q=0; q<=3; q++)
  {
   fprintf(f_end, "%c", n2[q]);
  }
 }
 fclose (f_begin);
 fclose (f_end);

или попроще
Код:
//char n1[4]={'1','2','3','4'};
//char n2[4]={'5','6','7','8'};
fprintf(f_end, "%.*s%.*s",sizeof(n1),n1,sizeof(n2),n2);
fclose (f_begin);
fclose (f_end);
« Последнее редактирование: 14-05-2010 08:23 от Алексей1153++ » Записан

Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines