PDA

Ver la Versión Completa : Problema con encriptación php <-> Delphi


Reasen
29-12-2015, 10:47:14
Buenas, tengo el siguiente problema: hice un algoritmo apartir de XOR en delphi y php pero por alguna razon los datos me llegan corruptos y no veo ninguna falla, soy un poco nuevo en PHP, cualquier ayuda me serviria.

Aqui el codigo delphi:

Function xorPHP(Text: AnsiString; Pass: AnsiString): AnsiString;
var
i, p: integer;
Res: AnsiString;
begin
p := 1;

for i := 1 to length(Text) do
begin
Res := Res + ansichar(ord(Text[i]) XOR ord(Pass[p]));
Inc(p);
if p > length(Pass) then
p := 1;
end;
setlength(result, length(Res));
result := EncodeBase64(BytesOf(result), length(BytesOf(result)));
end;
PHP:

function DecryptStr2($str,$key)
{
$p=1;

$key_length = strlen($key);
$encoded_data = base64_decode($str);

$length = strlen($encoded_data);
for ($i = 0; $i < $length; $i++) {

$result .= chr(ord($encoded_data[i]) ^ ord($key[$p]));
$p++;
if (p > $key_length){$p=1;}

}
return $result;
}

}

Ñuño Martínez
29-12-2015, 11:30:33
Creo haber encontrado el problema:

Has olvidado que PHP empieza a contar las listas y cadenas desde 0 (cero), no desde 1 (uno) como hace Pascal. Además, si te fijas, $i empieza en cero mientras que $p lo hace en uno.

Reasen
29-12-2015, 12:39:44
Bastante extraño la verdad hice los cambios que me digiste y sigo teniendo problemas similares,
los datos se devuelven corruptos o se devuelven parcialmente,
solo ando buscando un sistema de encriptacion basico con clave para delphi <-> php,
si alguien me puede dar un ejemplo me seria de ayuda ya que no encuentro nada en la red que sirva correctamente

Casimiro Notevi
29-12-2015, 12:43:12
Bastante extraño la verdad hice los cambios que me digiste y sigo teniendo problemas similares,
los datos se devuelven corruptos o se devuelven parcialmente,

Copia el código para que veamos qué has hecho exactamente.

Reasen
29-12-2015, 12:59:03
Este es basicamente

Parte PHP:

function DecryptStr2($str,$key)
{
$p=1;

$key_length = strlen($key);
$encoded_data = base64_decode($str);

$length = strlen($encoded_data);
for ($i = 1; $i < $length; $i++) {

$result .= chr(ord($encoded_data[i]) ^ ord($key[$p]));
$p++;
if (p > $key_length){$p=1;}

}
return $result;
}

$input=$_POST['input'];
echo DecryptStr2($input,'ClavePrivada');
Parte Delphi:



uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, httpsend, Synacode,
Vcl.StdCtrls,IdHash,EncdDecd;

Function xorPHP(Text: AnsiString; Pass: AnsiString): AnsiString;
var
i, p: integer;
Res: AnsiString;
begin
p := 1;

for i := 1 to length(Text) do
begin
Res := Res + ansichar(ord(Text[i]) XOR ord(Pass[p]));
Inc(p);
if p > length(Pass) then
p := 1;
end;
setlength(result, length(Res));
result := EncodeBase64(BytesOf(result), length(BytesOf(result)));
end;

function StreamToString(const Stream: TStream): string;
var
StringBytes: TBytes;
Encoding: TEncoding;
begin
Stream.Position := 0;
SetLength(StringBytes, Stream.Size);
Stream.ReadBuffer(StringBytes, Stream.Size);
Result := Encoding.UTF8.GetString(StringBytes);
end;


procedure TForm2.Button1Click(Sender: TObject);
var
Response: TMemoryStream;
Key: ansistring;
begin

Response := TMemoryStream.Create;


if HttpPostURL('127.0.0.1/test2.php', 'input='+xorPHP('Texto de prueba','ClavePrivada'), Response) then
showmessage(StreamToString(response));


end;

bucanero
29-12-2015, 14:06:44
Hola,

basicamente en la función DELPHI esta linea asigna el valor de result, cuando no tiene aun nada guardado

result := EncodeBase64(BytesOf(result), length(BytesOf(result)));

sustituyela por esta otra

result := EncodeBase64(BytesOf(Res), length(BytesOf(Res)));

y la funcion PHP en algunas variables no estaba el $ de variable, y los indices en PHP empiezan en 0. Te dejo la función completa ya corregida

function DecryptStr2($str,$key) {
$p=0;
$result = '';

$key_length = strlen($key);
$encoded_data = base64_decode($str);

$length = strlen($encoded_data);
for ($i = 0; $i < $length; $i++) {

$result .= chr(ord($encoded_data[$i]) ^ ord($key[$p]));
$p++;
if ($p >= $key_length) {
$p=0;
}
}
return $result;
}

con esto ya creo que funciona bien,

Un saludo

Reasen
29-12-2015, 18:10:47
Hola,

basicamente en la función DELPHI esta linea asigna el valor de result, cuando no tiene aun nada guardado

Código Delphi [-] (http://www.clubdelphi.com/foros/#)result := EncodeBase64(BytesOf(result), length(BytesOf(result)));


sustituyela por esta otra

Código Delphi [-] (http://www.clubdelphi.com/foros/#) result := EncodeBase64(BytesOf(Res), length(BytesOf(Res)));


y la funcion PHP en algunas variables no estaba el $ de variable, y los indices en PHP empiezan en 0. Te dejo la función completa ya corregida

function DecryptStr2($str,$key) {
$p=0;
$result = '';

$key_length = strlen($key);
$encoded_data = base64_decode($str);

$length = strlen($encoded_data);
for ($i = 0; $i < $length; $i++) {

$result .= chr(ord($encoded_data[$i]) ^ ord($key[$p]));
$p++;
if ($p >= $key_length) {
$p=0;
}
}
return $result;
}con esto ya creo que funciona bien,

Un saludo

Me solucionaste el dia! Aparte ya me quedo claro que con PHP tengo que empezar por 0 a contar envez de 1, gracias!
en delphi me hice el lio con setlength ya que no sabia ya ni de donde venia el fallo cambie esa funcion que anteriormente estaba bien jajaja