在Delphi中加密XOR /在PHP中解密

时间:2013-09-03 23:14:47

标签: php delphi base64 xor

好的,几天前我在Delphi for PHP中翻译了我的简单XOR函数,它工作正常。今天,当我因某种未知原因再次尝试时,它已被打破。我正在做的是:首先我在字符串中执行base64编码,然后我xor它。所以我通过POST方法将它发送给PHP,在PHP中我'unxor'并解码base64。在Delphi中查看函数(我使用的是EncdDecd单元中的EncodeBase64):

function EncryptStr(Input: AnsiString; Seed: integer): AnsiString;
var
i : integer;
Output : AnsiString;
begin
    Input:= EncodeBase64(BytesOf(UTF8Encode(Input)),  Length(BytesOf(UTF8Encode(Input))));
    Output := '';
    for i := 1 to Length(Input) do
        Output := Output + AnsiChar(Ord(Input[i]) XOR (Seed));
    Result:= Output;
end;

好的,所以我通过Indy HTTP发送这种方式(不知道这是否重要,但可能有用)

procedure TForm1.DoPost;
var
  HTTP: TIdHTTP;
  lPost: TStringList;
begin
  Http:= TIDHttp.Create(nil);
  lPost:= TStringList.Create;
  Http.Request.UserAgent:='Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)';
  lPost.Add('PNAME=' + EncryptStr('test.exe', 232));
  lPost.Add('BYTETYPE=' + EncryptStr('UNICODE', 232));
  Http.Post('http://192.168.1.12/panel.php?uid=09ed-erty-as98-1498', lPost);

在PHP中,我以这种方式接收/解密:

 function DecryptStr($str)
  {
    $key = '232'; //key need to be the same as hook is using!
    $strsize = @strlen($str);   
    $j = @strlen($key);
    for($i=$strsize-1; $i >= 0; $i--)
     {
       $str[$i] = @chr(@ord($str[$i]) ^ $key);
     }
     $str = base64_decode($str);
     return $str;
    }

 if(isset($_POST['PNAME']) && isset($_POST['BYTETYPE']) && ($_POST['BYTETYPE'] != ''))
  {
    saveInfo($uid, DecryptStr($_POST['PNAME']), DecryptStr($_POST['BYTETYPE']), $con); 
  }

saveInfo函数只是在解密的变量中做了一些回声,但是我得到了一切损坏......出了什么问题?

1 个答案:

答案 0 :(得分:0)

问题是UTF8编码。在XOR我执行Base64之后,我将其更改为第一个XOR。在德尔福的Base64中,我做了:

  

输入:= EncodeBase64(BytesOf(输入),   长度(BytesOf(输入)));

而不是:

  

输入:= EncodeBase64(BytesOf(UTF8Encode(输入)),   长度(BytesOf(UTF8Encode(输入))));

删除在PHP中正确解密的UTF8Encode。