Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Función de Delphi a C++ (https://www.clubdelphi.com/foros/showthread.php?t=59873)

ninguno 11-09-2008 15:55:16

Función de Delphi a C++
 
Buenas,

Resulta que tengo una aplicación en Delphi que me genera un fichero con una serie de cadenas con una simple encriptación XOR mediante esta función:

Código Delphi [-]
function DecryptString(const ToDecript: string; Key: Word): string;
var
  I: byte;
begin
  Result := '';
   RandSeed := Key;
   for i := 1 to Length(ToDecript) do
    Result := Result + Chr(Ord(ToDecript[i]) xor Random(256));
end;

El fichero encriptado lo voy a leer desde C++ y estoy intentando traducir esta función a C++ pero sin demasiada suerte

Código:

AnsiString __fastcall DecryptString(AnsiString ToDecript, unsigned int Key)
{
    AnsiString Result = "";

    RandSeed = Key;
    for (int i=1; i<=ToDecript.Length(); i++)
  {
        Result = Result + (((unsigned _int8)ToDecript[i]) ^ random(256));
  }

    return Result;
}

La cuestión es que al intentar desencriptar los datos, no me devuelve la cadena esperada.

Alguien puede hacerme la luz diciéndome dónde tengo el error? Gracias

donald shimoda 11-09-2008 16:03:43

Cita:

Empezado por ninguno (Mensaje 313471)
Código Delphi [-]
function DecryptString(const ToDecript: string; Key: Word): string;
var
  I: byte;
begin
  Result := '';
   RandSeed := Key;
   for i := 1 to Length(ToDecript) do
    Result := Result + Chr(Ord(ToDecript[i]) xor Random(256));
end;

La cuestión es que al intentar desencriptar los datos, no me devuelve la cadena esperada.

O estoy dormido o no hay manera de que nunca te devuelva la cadena esperada. Como cuernos sabe la función de desencriptado que valor asigno en una posición el random(256)?????:confused:

Cada vez que llamas a random(256) genera un numero aleatorio del 0 al 255, entonces al desencriptar como sabes con que numero desencriptar?

ninguno 11-09-2008 16:58:33

Hola

Cita:

Empezado por donald shimoda (Mensaje 313480)
O estoy dormido o no hay manera de que nunca te devuelva la cadena esperada. Como cuernos sabe la función de desencriptado que valor asigno en una posición el random(256)?????:confused:

Cada vez que llamas a random(256) genera un numero aleatorio del 0 al 255, entonces al desencriptar como sabes con que numero desencriptar?

Sinceramente no sabría decirte del cierto, pero imagino que es gracias a RandSeed y que se le tiene que pasar la misma Key. Es un código que he encontrado por la web (y en varias páginas), no es mío.

Probado en Delphi la encriptación de una frase y la posterior desencriptación y funciona a las mil maravillas.

El problema lo sigo teniendo al pasarlo a C++, que no hay manera de que me funcione :(

Alguna sugerencia?

Gracias

donald shimoda 11-09-2008 17:32:11

Cita:

Empezado por ninguno (Mensaje 313522)
Hola

Sinceramente no sabría decirte del cierto, pero imagino que es gracias a RandSeed y que se le tiene que pasar la misma Key. Es un código que he encontrado por la web (y en varias páginas), no es mío.

Probado en Delphi la encriptación de una frase y la posterior desencriptación y funciona a las mil maravillas.

Gracias

Me llama mucho la atención como funciona, tienes un proyecto simple para probarlo en Delphi?

Saludos.

ninguno 11-09-2008 17:50:41

1 Archivos Adjunto(s)
Cita:

Empezado por donald shimoda (Mensaje 313549)
Me llama mucho la atención como funciona, tienes un proyecto simple para probarlo en Delphi?

Sí, claro, no hay problema, es tan sencillo como copiar esa función, poner 3 edits y 2 buttons y llamar a esa función desde los buttons.....

Pero alguien puede ayudarme a pasar esa función a C++?? :D :D

coso 11-09-2008 19:08:13

Código:


Result = Result + (((unsigned _int8)ToDecript[i]) ^ random(256);

no deberia ser

Código:

Result = Result + (((unsigned_int8)ToDecript[i]) ^ random(256));
?

suponiendo que los tipos sean correctos (unsigned_int8, AnsiString).Quizas deberias probarlo con unsigned char * directamente, y i = 0; i<Length...

coso 11-09-2008 19:11:33

nada, perdon me hice un lio con los parentesis, parecen correctos...eso si, no deberias sumar al ansistring como char, una vez vuelto hecho el ^ ?

coso 11-09-2008 19:12:40

siempre y cuando randseed funcione de la misma manera en C...creo recordar que randomize en C acepta un parametro como semilla.

ninguno 11-09-2008 19:39:27

Hola

Cita:

Empezado por coso (Mensaje 313599)
no deberias sumar al ansistring como char, una vez vuelto hecho el ^ ?

También lo he probado y nada, sigue dándome un valor erróneo (o que yo no espero).

Referente al randsee, pues no sabría decirte si funciona igual en ambos lenguajes :confused:

Miraré por ahí a ver

Gracias

escafandra 11-09-2008 19:39:42

Respondo rápido y sin probar. randomize en C no tiene semilla.
random debería ser sustituida por Random que no es ansi C pero si viene en el Builder. C es sensible al "Case".

Espero estar en lo cierto.

Saludos.

coso 11-09-2008 19:41:15

no, random va en minusculas, como printf o getc o atoi, atof...casi todas las funciones de estandar c estan en minusculas.

Cita:

por Random que no es ansi C pero si viene en el Builder
ahhhh vale

coso 11-09-2008 19:43:29

me da que el error es por los tipos...yo de ti probaria hacerlo todo en tipos nativos puros (char * para string, unsigned int o unsigned long int, etc...) y usar strlen etc tambien, ya q el xor es a nivel de bits y quizas cambie su tratamiento segun el tipo.

escafandra 11-09-2008 22:07:14

Estoy de acuerdo con coso.
En mi Builder 5 no puedo probar, Random no está implamentada y la función random del C no es adecuada. En delphi 6 si está implementada y supongo que en Builder 6.

Yo probaría con esto:
Código:

Result = Result +(char) (((BYTE)ToDecript[i]) ^ Random(256));
Saludos.

escafandra 11-09-2008 22:33:30

Me pregunto el porqué de la necesidad de la traducción, es decir Random(256) debe generar siempre el mismo número del 0 al 256 (un Byte) para que el algoritmo funcione, y ese valor depende de Key (RandSeed = Key) luego es posible realizar la función prescindiendo de Random si conocemos como convertir el valor.

Por otro lado es un sistema excesivamente simple pues el xor se hace con 8 bits....

Solamente si estás obligado a seguir ese tipo de codificación pues no te queda otro remedio.

Una opcion que site va a funcionar es realizar una unit con esa funcion en delphi y compliarla talcual con el Builder, puesto que compila pascal...

Saludos.

juanelo 11-09-2008 23:02:25

Recuerda que las cadenas en C, comienzan con 0 y terminan con Length()-1
Saludos

ninguno 12-09-2008 07:18:12

Hola

Cita:

Empezado por escafandra (Mensaje 313673)
Estoy de acuerdo con coso.
En mi Builder 5 no puedo probar, Random no está implamentada y la función random del C no es adecuada. En delphi 6 si está implementada y supongo que en Builder 6.

Pues o no se en que librería o Random no existe en Builder 6 :(

Cita:

Empezado por escafandra (Mensaje 313686)
Me pregunto el porqué de la necesidad de la traducción, es decir Random(256) debe generar siempre el mismo número del 0 al 256 (un Byte) para que el algoritmo funcione, y ese valor depende de Key (RandSeed = Key) luego es posible realizar la función prescindiendo de Random si conocemos como convertir el valor.

jejeje, pues dime cómo, que yo ni idea :D

Cita:

Empezado por escafandra (Mensaje 313686)
Por otro lado es un sistema excesivamente simple pues el xor se hace con 8 bits....

Solamente si estás obligado a seguir ese tipo de codificación pues no te queda otro remedio.

No, no estoy obligado, sólo es para que lleve "algo" de protección ese dato, que ya se tengan que molestar en hacer la desencriptación aunque sea un proceso sencillo. Además, necesito una que sea "reversible" como esta.

Cita:

Empezado por escafandra (Mensaje 313686)
Una opcion que site va a funcionar es realizar una unit con esa funcion en delphi y compliarla talcual con el Builder, puesto que compila pascal...

Si entiendo bien lo que me comentas..... ¿puedo coger la unit donde tengo esta función y añadirla al proyecto de Builder y compilar tal cual? Eso sería genial y me ahorraría cantidad de trabajo ;)

Gracias por todos los aportes

escafandra 12-09-2008 07:29:03

Esta función te puede servir:

Código:

void Crypt(void *Source, int Size, char* Clave, int Mod=0);
Código:

#include "windows.h"
#include <stdlib.h>

// CopyRight escafandra
// Rutina de encriptación Xor.
// La misma rutina encripta y desencripta.
// Clave clave en modo texto que se tratará como de 8 caracteres, 64 bits
// Mod es el módulo restante para encriptaciones parciales
// Si se encripta un buffer por partes, Mod es Size_encriptado%8
// donde Size_encriptado es el tamaño total de lo encriptado hasta ese momento.
// Mod corrige el punto de comienzo del nuevo bloque a encriptar.

void
Crypt(void *Source, int Size, char* Clave, int Mod)
{
  BYTE *source = (BYTE*)Source;
  BYTE clave[8];
  int lClave = strlen(Clave);
  for(int n=0; n<8; n++)
    clave[n] = Clave[n%lClave];

  for(int n=0; n<Size; n++, Mod++){
    source[n] ^= clave[Mod%8];
  }
}

Saludos.


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

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