Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > алгоритм дешифровки надо сделать


Автор: eNecro 2.2.2010, 20:16
Вот задание: имеется текстовый файл закодированный по следующему алгоритму

1. Циклический сдвиг влево на два. (b = a << 2)*
2. Сумма с числом, образованным как остаток от деления номера позиции байта на 256. Номер позиции считается с нуля. (b = a + (i mod 256))
3. Сумма младших 4-х разрядов ключа со старшими и младшими 4-я разрядами байта. Перенос из младшей части в старшую не осуществляется. (Hi(b) = Lo(k)+Hi(a), Lo(b) = Lo(k)+ Lo(a))


Ключик неизвестен, надо расшифровать этот файл путем выполнения вышеприведенных действий в обратном порядке.

делаю так:

Код


var
  Form1: TForm1;
  b,key,hi_a,low_a,a,hi_b,low_b,bit1,bit2: byte;
  f,f1,f2: file of byte;
  i,k:integer;

procedure encrypt(key:integer);
begin
   ///key:=1;
   assignfile(f,'5.x');
   reset(f);
   assignfile(f1,'6.x');
   rewrite(f1);
    while not eof(f) do                                                           {1}
     begin
       read(f,b);
       a:=0; hi_a:=0;low_a:=0;i:=0;

       ///  hi_b:=not key;
       {hi_a:=(b shr 4)and(00001111)+ ( not(key))and(00001111);
       hi_a:=(hi_a shl 4)and (11110000);
       low_a:=(b)and(00001111)+(not (key))and(00001111);
       low_a:=(low_a)and(00001111);
        }
        hi_a:=(b shr 4)and(00001111)-(key)and(00001111);
        hi_a:=(hi_a shl 4)and (11110000);
        low_a:=(b)and(00001111)- (key)and(00001111);
        low_a:=(low_a)and(00001111);


       a:=hi_a+low_a;
       write(f1,a);
     end;
   closefile(f);
   closefile(f1);

     {2}

   assignfile(f,'6.x');
   reset(f);
   assignfile(f1,'7.x');
   rewrite(f1);
   i:=0;
    while not eof(f) do
    begin
      read(f,b);
      a:=0;
      a:=b-trunc(i/256);///(i mod 256);
      inc(i);
      write(f1,b);
    ///  if i>256 then i:=0;
    end;
   close(f1);
   closefile(f);



   {3}

   assignfile(f,'7.x');
   reset(f);
   assignfile(f1,'8.x');
   rewrite(f1);

    while not eof(f) do
    begin
      a:=0;
      read(f,b);
      bit1:=(00000011)and(b);
      a:= b shr 2;
      bit1:=bit1 shl 6;
      a:=bit1+a;
      write(f1,a);
    end;


   closefile(f1);
   closefile(f);

end;



но нифига не работает. Грешу на третью часть кодировки. Не пойму, если перенос из младшей часть в старшую не осуществляется, тогда должна инфа потеряться в некоторых случаях. Как это учесть и обратно декодировать?

еще по первой части, где сдвиг влево: в декодировке сделал сначала с сохранением младших битов, а они там нужны? Сомнения меня пробрали...

Подскажите что неверно делаю...

сам файлик в аттаче

Автор: eNecro 3.2.2010, 09:39
все таки действительно 3-я часть кодировки (здесь 1-й блок) не работает. В бинарном вычитании косяк.

но, что больше всего меня сегодня убило - не работает mod!
например:

(i=0) mod 256   = 0
(i=1) mod 256   = 1
(i=2) mod 256   = 2

Это понять я не в состоянии...

Автор: ksili 3.2.2010, 10:26
Цитата(eNecro @  3.2.2010,  13:39 Найти цитируемый пост)
но, что больше всего меня сегодня убило - не работает mod!например:
(i=0) mod 256   = 0
(i=1) mod 256   = 1
(i=2) mod 256   = 2

Это понять я не в состоянии...

А как по-твоему должно было быть?

Автор: eNecro 3.2.2010, 10:43
а почему когда делимое меньше делителя, mod выдает делимое.
Например,
2 mod 5 даст два, почему это правильно с математической точки зрения?
2/5=0,4 -  mod для подобных чисел вообще применим?

Автор: kogemrka 3.2.2010, 11:14
mod - операция получения остатка от деления
2 mod 5 = 2. Всё логично. 
Раздели 2 на пять. Результат деления - ноль. Остаток от деления: 2

Автор: eNecro 4.2.2010, 10:33
блин, то ли в школе плохо учился, то ли что smile
буду знать, спасибо.

алгоритм собрал, тему можно закрыть

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)