-2

わかりました、数日前、単純な XOR 関数を Delphi で PHP 用に翻訳したところ、問題なく動作していました。今日、なんらかの理由で再試行したところ、壊れていました。私がやっていることは、最初に文字列で base64 エンコードを行い、次にそれを xor します。だから私はそれを POST メソッド経由で PHP に送信し、PHP では base64 を「unxor」してデコードします。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 関数は、復号化された変数でエコーを行っているだけですが、すべてが破損しています...何が問題なのですか?

4

1 に答える 1

0

問題は UTF8 エンコーディングでした。Base64をXORした後、最初のXORに変更しました。そして、デルファイのBase64で私がした:

入力:= EncodeBase64(BytesOf(入力), Length(BytesOf(入力)));

それ以外の:

入力:= EncodeBase64(BytesOf(UTF8Encode(入力)), Length(BytesOf(UTF8Encode(入力))));

UTF8Encode を削除すると、PHP で正しく復号化されました。

于 2013-09-05T01:50:13.943 に答える