Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2012.02.05;
Скачать: [xml.tar.bz2];

Вниз

Помогите перевести на 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.003 c
15-1319142235
777fender777
2011-10-21 00:23
2012.02.05
Delphi и Windows 7


2-1319706575
Faceless
2011-10-27 13:09
2012.02.05
Вывод в командную строку (cmd.exe)


15-1318710605
Юрий
2011-10-16 00:30
2012.02.05
С днем рождения ! 16 октября 2011 воскресенье


8-1221845751
leonidus
2008-09-19 21:35
2012.02.05
Проблема с jpg.CompressionQuality


2-1319733277
tcjkjl
2011-10-27 20:34
2012.02.05
деление окружности





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский