Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.02.05;
Скачать: CL | DM;

Вниз

Помогите перевести на Delphi   Найти похожие ветки 

 
Очень Злой   (2011-10-14 13:52) [0]

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

Помогите понять что тут делается (или переведите на Дельфи):

void encrypt( unsigned char *data, unsigned int len, unsigned char *Key )
{
       int temp = 0;

       for( unsigned int i = 0; i < len; i++) {
              int temp2 = data[i] & 0xff;
              data[i] = (temp2 ^ (Key[i & 15] & 0xff) ^ temp);
              temp = data[i];
       };

       int old = Key[8] & 0xff;
       old |= (Key[9] << 0x08) & 0xff00;
       old |= (Key[10] << 0x10) & 0xff0000;
       old |= (Key[11] << 0x18) & 0xff000000;

       old += len;

       Key[8] = old &0xff;
       Key[9] = (old >> 0x08) & 0xff;
       Key[10] = (old >> 0x10) & 0xff;
       Key[11] = (old >> 0x18) & 0xff;
};


 
Inovet ©   (2011-10-14 14:09) [1]

old |= ...
old := old or ...

old += ...
old := old + ...

<<
shl

>>
shr

&
and

^
xor


 
icWasya ©   (2011-10-14 14:17) [2]

с помощью ключа Key длиной в 16 байт шифруется строка data,
затем на основе длины строки формируется новый ключ.

как то так

procedure encrypt( data: pAnsiChar; len: cardinal;  key: pByteArray);
var
 temp, temp2 :Byte;
 i:cardinal;
 old : integer; // а вот точно знаковое ?
begin
 temp := 0;

 for i = 0 to Len-1 do
 begin
   temp2 := ord(data[i]) and $ff;
   data[i] := chr((temp2 xor (Key[i and $0f] and $ff) xor temp));
   temp := ord(data[i]);
 end;

 old := Key[8] and $ff;
 old := old or (Key[9] shl $08) & $ff00;
 old := old or (Key[10] shl $10) & $ff0000;
 old := old or (Key[11] shl $18) & $ff000000;

 old += len; // а что делать с переполнением ?

 Key[8] := old and $ff;
 Key[9] := (old shr $08) and $ff;
 Key[10] := (old shr $10) and $ff;
 Key[11] := (old shr $18) and $ff;
end;


не компилировал, может не пройти  data[i]
тогда внутренний цикл заменить на

 for i = 0 to Len-1 do
 begin
   data^ := chr((ord(data^) xor (Key[i and $0f] and $ff) xor temp));
   temp := ord(data^);
   inc(data);
 end;


 
Очень Злой   (2011-10-14 14:20) [3]

Спасибо, так хоть намного понятнее стало...


 
Inovet ©   (2011-10-14 14:48) [4]

> [2] icWasya ©   (14.10.11 14:17)
> а что делать с переполнением ?

А пофиг, вернее так и надо.


 
Очень Злой   (2011-10-14 14:53) [5]


> А пофиг, вернее так и надо.


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


 
Inovet ©   (2011-10-14 15:04) [6]

> [5] Очень Злой   (14.10.11 14:53)
> Судя по всему переполнение тут не учитывается..

В исходнике так. Наверное в расшиврощике назад отнимается.


 
Rouse_ ©   (2011-10-14 15:15) [7]

Переполнение при крипте/декрипте, штатное и обратимое действие.


 
Очень Злой   (2011-10-14 15:20) [8]

Немного ошибся, мне нужен вот этот алгоритм с 8-байтным ключем.

   char key_sc[8];
   char key_cs[8];

   void Encrypt(char *raw, int size)
   {
       int temp = 0;
       for (int i=0; i<size; i++)
       {
           int temp2 = raw[i] &0xff;
           raw[i] = (char)(temp2 ^ (key_cs[i&7] &0xff) ^ temp);
           temp = raw[i];
       }
       int old = key_cs[0] &0xff;
       old |= key_cs[1] << 8 &0xff00;
       old |= key_cs[2] << 0x10 &0xff0000;
       old |= key_cs[3] << 0x18 &0xff000000;
       old += size;
       key_cs[0] = (char)(old &0xff);
       key_cs[1] = (char)(old >> 0x08 &0xff);
       key_cs[2] = (char)(old >> 0x10 &0xff);
       key_cs[3] = (char)(old >> 0x18 &0xff);
   }



С учетом вышеприведенного, я перевел это на Дельфи так:

TXorKeyData=packed array[1..8] of byte;

type TXorKey=packed record
   case boolean of
   true: (KeyArray:TXorKeyData;);
   false: (First_Key:cardinal;
           SecondKey:cardinal;);
   end;

...

procedure XOREncrypt(var data;len:integer;var key:TXorKey);
var
i:integer;
S:Pchar;
temp,temp2:char;
old:Cardinal;
begin
 S:=Pchar(@data);
 temp:=Char(0);
 for i:=0 to len-1 do
   begin
     temp2:=S[i];
     s[i]:=char(ord(temp2) xor key.KeyArray[i and 7] xor ord(temp));
     temp:=s[i];
   end;
   key.First_Key:=Key.First_Key+len;
end;


Правильно?


 
b z   (2011-10-14 15:54) [9]

нет


 
Очень Злой   (2011-10-14 16:00) [10]

Немного ошибся.


TXorKeyData=packed array[0..7] of byte;

type TXorKey=packed record
  case boolean of
  true: (KeyArray:TXorKeyData;);
  false: (First_Key:cardinal;
          SecondKey:cardinal;);
  end;

...

procedure XOREncrypt(var data;len:integer;var key:TXorKey);
var
 i:integer;
 S:Pchar;
 temp,temp2:char;
begin
 S:=Pchar(@data);
 temp:=Char(0);
 for i:=0 to len-1 do
   begin
     temp2:=S[i];
     s[i]:=char(ord(temp2) xor key.KeyArray[i and 7] xor ord(temp));
     temp:=s[i];
   end;
 key.First_Key:=Key.First_Key+len;
end;



> b z   (14.10.11 15:54) [9]
>
> нет


В чем еще ошибка?


 
han_malign   (2011-10-14 17:41) [11]


>      temp2:=S[i];
>      s[i]:=char(ord(temp2) xor key.KeyArray[i and 7] xor ord(temp));
>      temp:=s[i];

ох уж этот gnuc-ный код...
temp:= temp xor byte(s[i]) xor  key.KeyArray[i and 7];
s[i]:= char(temp);


 
Очень Злой   (2011-10-14 18:21) [12]


> temp:= temp xor byte(s[i]) xor  key.KeyArray[i and 7];
> s[i]:= char(temp);


да. это я уже заметил.



Страницы: 1 вся ветка

Текущий архив: 2012.02.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
2-1319991854
Gu
2011-10-30 19:24
2012.02.05
system.pas


2-1319724771
Очень Злой
2011-10-27 18:12
2012.02.05
property default и поля


15-1318859876
lextasy
2011-10-17 17:57
2012.02.05
Посоветуйте учебник по Delphi для школьника


15-1319020883
Kerk
2011-10-19 14:41
2012.02.05
WinXP: User Permissions


3-1271399949
Виктор
2010-04-16 10:39
2012.02.05
вывод содержимого формы на печать