Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-09-2008
ninguno ninguno is offline
Miembro
 
Registrado: sep 2008
Posts: 45
Poder: 0
ninguno Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 11-09-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por ninguno Ver Mensaje
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)?????

Cada vez que llamas a random(256) genera un numero aleatorio del 0 al 255, entonces al desencriptar como sabes con que numero desencriptar?
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #3  
Antiguo 11-09-2008
ninguno ninguno is offline
Miembro
 
Registrado: sep 2008
Posts: 45
Poder: 0
ninguno Va por buen camino
Hola

Cita:
Empezado por donald shimoda Ver Mensaje
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)?????

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
Responder Con Cita
  #4  
Antiguo 11-09-2008
Avatar de donald shimoda
donald shimoda donald shimoda is offline
Miembro
 
Registrado: jul 2008
Ubicación: Argentino en Santa Cruz de la Sierra
Posts: 1.083
Poder: 17
donald shimoda Va por buen camino
Cita:
Empezado por ninguno Ver Mensaje
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.
__________________
Donald Shimoda [Team RO] - Blogs: Remobjects Pascal
Responder Con Cita
  #5  
Antiguo 11-09-2008
ninguno ninguno is offline
Miembro
 
Registrado: sep 2008
Posts: 45
Poder: 0
ninguno Va por buen camino
Cita:
Empezado por donald shimoda Ver Mensaje
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++??
Archivos Adjuntos
Tipo de Archivo: zip test.zip (3,9 KB, 8 visitas)
Responder Con Cita
  #6  
Antiguo 11-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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...
Responder Con Cita
  #7  
Antiguo 11-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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 ^ ?
Responder Con Cita
  #8  
Antiguo 11-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
siempre y cuando randseed funcione de la misma manera en C...creo recordar que randomize en C acepta un parametro como semilla.
Responder Con Cita
  #9  
Antiguo 11-09-2008
ninguno ninguno is offline
Miembro
 
Registrado: sep 2008
Posts: 45
Poder: 0
ninguno Va por buen camino
Hola

Cita:
Empezado por coso Ver Mensaje
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

Miraré por ahí a ver

Gracias
Responder Con Cita
  #10  
Antiguo 11-09-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #11  
Antiguo 11-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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

Última edición por coso fecha: 11-09-2008 a las 19:48:11.
Responder Con Cita
  #12  
Antiguo 11-09-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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.
Responder Con Cita
  #13  
Antiguo 11-09-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #14  
Antiguo 11-09-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #15  
Antiguo 11-09-2008
Avatar de juanelo
juanelo juanelo is offline
Miembro
 
Registrado: sep 2007
Posts: 1.084
Poder: 18
juanelo Va por buen camino
Recuerda que las cadenas en C, comienzan con 0 y terminan con Length()-1
Saludos
__________________
Ya tengo Firma!
Responder Con Cita
  #16  
Antiguo 12-09-2008
ninguno ninguno is offline
Miembro
 
Registrado: sep 2008
Posts: 45
Poder: 0
ninguno Va por buen camino
Hola

Cita:
Empezado por escafandra Ver Mensaje
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 Ver Mensaje
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

Cita:
Empezado por escafandra Ver Mensaje
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 Ver Mensaje
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
Responder Con Cita
  #17  
Antiguo 12-09-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.

Última edición por escafandra fecha: 12-09-2008 a las 12:15:32.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Uso de la funcion en delphi 7 jedinds OOP 1 19-05-2008 04:00:32
Funcion Delphi en SQL raverri SQL 10 16-07-2007 18:07:47
Traduccion de función VB a delphi !!! Jan_polero API de Windows 2 07-02-2005 12:32:54
Funcion Nz en delphi?? NuncaMas Varios 1 24-12-2003 14:51:31
funcion delphi Ramon Varios 1 13-05-2003 12:45:03


La franja horaria es GMT +2. Ahora son las 14:46:27.


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
Copyright 1996-2007 Club Delphi