 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Rana Lt JG


Registrado: 02 Dic 2002Mensajes: 62
|
Publicado: Lun 26 May, 2003 5:30 pm Asunto: Como hacer un archivo encriptado |
|
|
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  _________________ Gracias de Antemano
<---------------------->
Saludos RANA
''''''''
(0)(0)
-o-o-o--(_)--0-0-0-
<----------------------> |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 27 May, 2003 12:44 pm Asunto: Rutina de encriptación |
|
|
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 |
|
 |
Rana Lt JG


Registrado: 02 Dic 2002Mensajes: 62
|
Publicado: Mar 27 May, 2003 7:49 pm Asunto: |
|
|
muchisimas gracias por explicarmelo y por ponerlo claro. _________________ Gracias de Antemano
<---------------------->
Saludos RANA
''''''''
(0)(0)
-o-o-o--(_)--0-0-0-
<----------------------> |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|