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
vBulletin v3.6.8, Derechos ©2000-2024, Jelsoft Enterprises Ltd.