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


Автор: wofs 2.6.2011, 19:52
Доброго дня.
Распаковываю файл ZLibом:
Код

function Decompress_Zlib(const inStream, outStream :TStream; StartPos: integer):boolean;
  var
  Count: integer;
  ZStream: TDecompressionStream;
   Buffer: array [0..1024] of byte;
begin
  inStream.Seek(StartPos, soFromBeginning);
  outStream.Seek(0,soFromBeginning);
  ZStream:=TDecompressionStream.Create(InStream);
  try
   while true do
    begin
     Count:=ZStream.Read(Buffer, sizeof(buffer));
     if Count<>0
     then OutStream.WriteBuffer(Buffer, Count)
     else Break;
    end;
    Result:=True;
  Except
    Result:=False;
    ZStream.Free;
    exit;
  end;
  ZStream.Free;
end;        
//
function GenerickExtract(Filename: string; sPos: integer): boolean;
var
  f,f1: TFileStream;
begin
  result := false;
  try
    f  := TFileStream.Create(Filename, fmShareDenyRead);
    f1 := TFileStream.Create(Filename+'.unpk', fmCreate);
  except
    exit;
  end;
  try
    (* *)
    result := Decompress_Zlib(f, f1, sPos);
    (* *)
  finally
    f.Free;
    f1.Free;
  end;
end;    

подскажите, как перед распаковкой каждого блока расшифровывать его. Исходный файл зашифрован алгоритмом XOR, ключ известен. используется таблица перестановок.
--
В интернете полно информации по XOR но в основном по работе со строками...

Автор: Dik0n 2.6.2011, 20:49
Примерно так

Код

  for I := sPos to f.Size - 1 do
  begin
     Byte(PAnsiChar(f.Memory)[I]) := Byte(PAnsiChar(f.Memory)[I]) xor (Key); //Key ???
  end;
  result := Decompress_Zlib(f, f1, sPos);
    (* *)

Автор: RomanEEP 3.6.2011, 08:41
Код

function Decompress_Zlib(const inStream, outStream: TStream;
  StartPos: integer): boolean;
var
  Count, i: integer;
  ZStream: TDecompressionStream;
  Buffer: array [0 .. 1024] of byte;
begin
  inStream.Seek(StartPos, soFromBeginning);
  outStream.Seek(0, soFromBeginning);
  ZStream := TDecompressionStream.Create(inStream);
  try
    while true do
    begin
      Count := ZStream.Read(Buffer, sizeof(Buffer));
      for i := 0 to Count - 1 do
        Buffer[i] := Buffer[i] xor Key; // Key = xor code
      if Count <> 0 then
        outStream.WriteBuffer(Buffer, Count)
      else
        Break;
    end;
    Result := true;
  Except
    Result := False;
    ZStream.Free;
    exit;
  end;
  ZStream.Free;
end;

Автор: wofs 3.6.2011, 10:12
спасибо всем ответившим и этому форуму smile

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