1

XOR で暗号化されたオンライン TXT ファイルが 1 つあります。そして、Indy HTTP を使用してこのファイルを読み取ります。私がこれを行うとき:

Buff.Text:= HTTP.Get('http://www.blabla.com/xor.txt');

Buff のコンテンツが破損していて、正しく復号化できません。これを解決するには?以下に、txt ファイルの XOR に使用している関数を貼り付けます。

function TForm1.XorStr(Input: AnsiString; Seed: integer): AnsiString;
var
i : integer;
Output : AnsiString;
begin
    Output := '';
    for i := 1 to Length(Input) do
        Output := Output + AnsiChar(Ord(Input[i]) XOR (Seed));
    Result:= Output;
end;

誰かが私を助けてくれることを願っています。君たちありがとう!

4

1 に答える 1

10

TIdHTTP.Get()を返すのオーバーロードされたバージョンを使用してデータをダウンロードしていますUnicodeStringContent-Typeそのバージョンは、サーバーの応答ヘッダーで指定されている (または欠落している) 文字セットに基づいて、生データを Unicode にデコードします。あなたがやろうとしていることは、あなたのデータを破壊します。TIdHTTP.Get()代わりに、生データで埋める他のオーバーロードされたバージョンを使用する必要がありますTStream。次に、それをデコードできます。

var
  Strm: TMemoryStream;
  Output: AnsiString;
begin
  ...
  Strm := TMemoryStream.Create;
  try
    HTTP.Get('http://www.blabla.com/xor.txt', Strm);
    Output := XorStr(Strm.Memory, Strm.Size, Seed);
  finally
    Strm.Free;
  end;
  ...
end;

function TForm1.XorStr(Input: Pointer; InputSize: NativeInt; Seed: Integer): AnsiString;
var
  i : integer;
begin
  SetString(Result, PAnsiChar(Input), InputSize);
  for i := 1 to Length(Result) do
    Result[i] := AnsiChar(Ord(Result[i]) XOR Seed);
end;
于 2012-11-01T18:25:15.197 に答える