Показать сообщение отдельно
Старый 28.04.2008, 13:49   #9
Местный
 
Аватар для PanAm
 
Регистрация: 18.01.2008
Сообщений: 286
Сказал Спасибо: 24
Имеет 133 спасибок в 80 сообщенях
PanAm
По умолчанию

нет, в newxor.dpr
я что-то в таком духе можно попробывать
delphi Код:
type   TXorCoding = class(TCodingClass)   private     keyLen: Byte;     CryptoInit: Boolean; //Добавил новый флаг   public     constructor Create;     procedure InitKey(const XorKey; Interlude: Boolean = False);override;     procedure DecryptGP(var Data; const Size: Word);override;     procedure EncryptGP(var Data; const Size: Word);override;   end; constructor TXorCoding.Create(); begin   FillChar(GKeyS[0],SizeOf(GKeyS),0);   FillChar(GKeyR[0],SizeOf(GKeyR),0);   keyLen := 0;   CryptoInit := false; End; procedure TXorCoding.DecryptGP(var Data; const Size: Word); var   k:integer;   pck:array[0..$4FFF] of Byte absolute Data; begin   if pck[0] := 0 then begin //вставил проверку     CryptoInit := true; //поднял флаг     InitKey(pck[2]); //устанавил новый ключ шифрования, InitKey(pck[2], true); для интрерлюда     exit; //дальнейшая обработка не нужна, выхел   end;   for k:=size-1 downto 1 do     pck[k]:=pck[k] xor GKeyR[k and keyLen] xor pck[k-1];   if size<>0 then pck[0]:=pck[0] xor GKeyR[0];   Inc(PLongWord(@GKeyR[keyLen-7])^,size); end; procedure TXorCoding.EncryptGP(var Data; const Size: Word); var   i:integer;   pck:array[0..$4FFF] of Byte absolute Data; begin   if CryptoInit then begin  //это был CryptoInit     CryptoInit := false; //сбосил флаг     exit; //шифрация не требуется - вышел   end;   if size<>0 then pck[0]:=pck[0] xor GKeyS[0];   for i:=1 to size-1 do     pck[i]:=pck[i] xor GKeyS[i and keyLen] xor pck[i-1];   Inc(PLongWord(@GKeyS[keyLen-7])^,size); end; procedure TXorCoding.InitKey(const XorKey; Interlude: Boolean = False); const   KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);   KeyIntrl: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97); var key2:array[0..15] of Byte; begin   if Interlude then begin     keyLen:=15;     Move(XorKey,key2,8);     Move(KeyIntrl,key2[8],8);   end else begin     keyLen:=7;     Move(XorKey,key2,4);     Move(KeyConst,key2[4],4);   end;   Move(key2,GKeyS,16);   Move(key2,GKeyR,16); end;
код не проверял, даже синтаксис...
просто пример, как обойти смену ключа.
PanAm вне форума   Ответить с цитированием