2013-09-03 4 views
-2

Хорошо, ребята, несколько дней назад Я перевел мою простую функцию XOR в Delphi для PHP, и она отлично работала. Сегодня, когда я попробовал снова по неизвестной причине, он сломан. То, что я делаю, это: сначала я делаю кодировку base64 в строке, а затем я это делаю. Поэтому я отправляю его для PHP по методу POST, а в PHP я «unxor» и расшифровываю base64. Посмотрите функцию в Delphi (я использую EncodeBase64 из блока EncdDecd):Шифрование XOR в Delphi/Расшифровка в PHP

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; 

Ok, поэтому я посылаю этот путь через 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 просто делает некоторый отклик в переменных расшифрованы, но я получаю все испорченный ... Что случилось?

+0

Должен ли XOR в Delphi создавать дружественные http-символы, «us-ascii», которые будут использоваться в списке параметров lPost? Является ли http post charset UTF8 или ISO *, а получающий конец PHP-скриптом использует те же символы кодировки кодировки для отправки envvars? – Whome

+0

Да, он должен base64 ПОСЛЕ xoring – Rahly

+0

Я не думаю, что проблема в Http.Post или TStringList ... Даже когда я делаю в PHP: '$ decrypt = 'œš ‰ <ƒ'; (передать зашифрованное значение xor напрямую) DecryptStr ($ decrypt); ' Я все еще получаю поврежденное значение. Не знаю, почему, я проверил эти дни назад и работал, теперь только испорчен ... И я попытался base64 после xor, но поскольку xor поврежден, не работал. – user1526124

ответ

0

Проблема заключалась в кодировании UTF8. Я изменил его на первый XOR после XOR, я делаю Base64. И в Base64 в Дельфах я сделал:

Входной сигнал: = EncodeBase64 (BytesOf (вход), Длина (BytesOf (вход)));

Вместо того, чтобы:

Входной сигнал: = EncodeBase64 (BytesOf (UTF8Encode (вход)), Длина (BytesOf (UTF8Encode (вход))));

Извлечение UTF8Encode было правильно расшифровано в PHP.

Смежные вопросы