Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Como hacer un archivo encriptado

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Como hacer un archivo encriptado Responder citando

Hola a todos,
A ver si me explico, quiero hacer un archivo en el que ponga por ejemplo:

Hola que tal estas?

Pero dicho archivo quiero encriptarlo para que no se pueda abrir con programas como el notepad, wordpad, y demas procesadores de texto.
Ademas quiero q el archivo tenga de extension .vft.

Espero q puedan ayudarme

Un saludo al foro Razz
_________________
Gracias de Antemano
<---------------------->
Saludos RANA

''''''''
(0)(0)
-o-o-o--(_)--0-0-0-
<---------------------->
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Rutina de encriptación Responder citando

Yo uso este código para encriptar datos (¿no lo he puesto ya por ahí?). Voy a explicar como funciona, artiendo de la base que es una adaptación de un rutina en Clipper que tenía yo hecha hace tiempo.

Se basa en un XOR binario y vale lo mismo para encriptar que para desencriptar. En C++ sólo me he encontrado con un problema, que es mínimo. Mientras en Clipper podía usar el conjunto de caracteres ASCII completo, en C++ (seguramente por el entorno Windows) sólo puedo usar los caracteres significativos (me parece recordar que los códigos ASCII del 32 al 127).
Código:
AnsiString Encriptar(char *cVariable)
{
     char aClave[6][6] = {"10000\0", "10101\0", "10010\0", "10011\0", "10001\0", "10001\0"};
     AnsiString cCambio, cBin1, cBin2, cClave;
     int nChar, nDato, nValor;

     cCambio = "";
     nDato = 0;
     nChar = 0;
     while (cVariable[nChar] ¡= NULL)
     {
          if (nDato > 5)
               nDato = 0;

          nValor = cVariable[nChar];
          cBin1  = "";
          cBin2  = "";
          cClave = aClave[nDato];

          while (nValor > 1)
          {
               cBin1  = IntToStr(nValor % 2) + cBin1;
               nValor = INT(nValor / 2);
          }
          cBin1 = IntToStr(nValor) + cBin1;

          if (cBin1.Length() > cClave.Length())
               while (cClave.Length() < cBin1.Length())
                    cClave = "0" + cClave;
          else
               while (cBin1.Length() < cClave.Length())
                    cBin1 = "0" + cBin1;

          for (int j = cClave.Length(); j > 0; j--)
               cBin2 += cClave.SubString(j,1) ^ cBin1.SubString(j,1);

          nValor = 0;
          for (int j = cBin2.Length(); j > 0; j--)
               nValor += StrToInt(cBin2.SubString(j,1)) * pow(2, (j - 1));

          cCambio += CHAR(nValor);
          nDato ++;
          nChar ++;
     }
     return (cCambio);
}

Explicandolo por partes.

Declaración de la función AnsiString Encriptar(char *cVariable)
La función devuelve un AnsiString; se le pasa el dato a encriptar en forma de un char.

Variables
char aClave[m][n] = {[...]};
AnsiString cCambio, cBin1, cBin2, cClave;
int nDato, nValor;

En aClave tenemos en formato binario la clave de encriptación, con una limitación: no pueden tener más de cinco bits (desde 00000 hasta 11111); con más bits me da resultados absurdos. Supongamos una clave como esta:

aClave[7][6] = {"10010\0","10011\0","10110\0", "11010\0","11011\0","10111\0","10101\0"};

cCambio es donde se va a guardar la cadena convertida. El resto de variables son campos de trabajo de la rutina.

nDato contiene la dimensión de aClave: cuantos elementos diferentes tiene el array; en este caso 7, y por lo tanto va desde 0 a 6.

El bucle principal (while) se controla con la longitud de la cadena a convertir, y trata la cadena letra por letra.

El primer paso del bucle es obtener el valor binario del código ASCII del carácter tratado ? while (nValor > 1) -. Previamente hemos asignado la clave que corresponda para trabajar (cClave). Una vez que tenemos el valor binario del carácter (cBin1), igualamos la longitud de este y la de cClave, añadiendo ceros a la izquierda hasta donde haga falta ( if (cBin1.Length() > cClave.Length())...).

Luego se hace la evaluacion XOR entre cBin1 y cClave y se guarda en cBin2. Sólo queda obtener el valor decimal de cBin2 y sacar el carácter que corresponde. Por ejemplo: si se convierte TOLEDO con estas definiciones (sólo la primera letra T):

cVariable = "TOLEDO\0" (Imprescindible que termine con NULL, por seguridad)
cCambio = "";
nDato = 0;
nChar = 0;

Cita:
INICIO
while (cVariable[nChar] ¡= NULL)

nValor = cVariable[0] » 84 (valor ASCII de T)
cClave = "10010" » Primer índice del array aClave
cBin1 = "1010100" » Después de ejecutar el bucle while (nValor > 1)

cClave = "0010010" » Después de if (cBin1.Length() > cClave.Length())

cBin2 = "0110001" » Después del bucle for (int j = cClave.Length(); j > 0; j--)

nValor = 70 » Después del bucle for (int j = cBin2.Length(); j > 0; j--)
cCambio = "F" » Carácter ASCII 70

Al terminar de ejecutarse la función, en la variable cCambio tendremos que TOLEDO vale F\\Z__X. La ventaja de esta función es que es ilimitada:

- Vale de ?recomponer? el valorm original sin más; si entra F\\Z__X, devuelve TOLEDO.
- Es infinita porque basta con poner más valores en el array aClave.
- Es muy difícil de reventar porque sólo el programador sabe los valroes que pone en aClave, y cua to más grande sea ese valor más complicado reventarla.

Sólo te queda meter la variable cCambio en donde te haga falta y ya está.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

muchisimas gracias por explicarmelo y por ponerlo claro.
_________________
Gracias de Antemano
<---------------------->
Saludos RANA

''''''''
(0)(0)
-o-o-o--(_)--0-0-0-
<---------------------->
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.