1

我有一个用 XOR 加密的在线 TXT 文件。我正在使用 Indy HTTP 来读取这个文件。当我这样做时:

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

Buff 中的内容已损坏,我无法正确解密。如何解决这个问题?下面我将粘贴我正在使用的函数来异或 txt 文件:

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()填充 a的重载版本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 回答