Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Delphi para la web (https://www.clubdelphi.com/foros/forumdisplay.php?f=51)
-   -   Problema con encriptación php <-> Delphi (https://www.clubdelphi.com/foros/showthread.php?t=89623)

Reasen 29-12-2015 10:47:14

Problema con encriptación php <-> Delphi
 
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:

Código 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:
Código 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 (
$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

Cita:

Empezado por Reasen (Mensaje 500869)
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:
Código 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 (
$key_length){$p=1;}

}
 return 
$result;
}

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

Parte Delphi:

Código 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

Código Delphi [-]
result := EncodeBase64(BytesOf(result), length(BytesOf(result)));

sustituyela por esta otra

Código Delphi [-]
  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
Código PHP:

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

Cita:

Empezado por bucanero (Mensaje 500876)
Hola,

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

Código Delphi [-]result := EncodeBase64(BytesOf(result), length(BytesOf(result)));


sustituyela por esta otra

Código Delphi [-] 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
Código PHP:

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


La franja horaria es GMT +2. Ahora son las 11:11:18.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi