Форум: "Прочее";
Текущий архив: 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