[c++] Cifrar y descifrar archivos

Iniciado por Beakman, 22 Noviembre 2010, 00:53 AM

0 Miembros y 1 Visitante están viendo este tema.

Beakman

Buenas, les dejo un codigo que hice en c++.
Es bastante simple pero a alguno que esta empezando le puede servir.
Sirve para ponerle contraseñas a los archivos, suma el codigo ascii del archivo con el de la clave. Y para descifrarlo los resta.

http://www.mediafire.com/?di5q9018ti4t0eb


Código (cpp) [Seleccionar]
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;

void limpiarPantalla()
{
system("clear"); //en windows seria system("cls");
}

//se define una clase
class cifrado
{
private:
char *cadena; //cadena en la que se carga el archivo
long tam; //tamaño del archivo
public:
~cifrado(); //destructor
void leer_de_disco( const char* );
void cifrar( const char* );
void descifrar( const char* );
void grabar_en_disco( const char* );
};

// leer_de_disco:
// abre la direccion del archivo que es pasado por parametro
// y guarda su contenido en la cadena
void cifrado::leer_de_disco(const char* nombre_archivo)
{
FILE *ar1;

//abre el archivo
ar1 = fopen( nombre_archivo,"rb" );
if( !ar1 )exit(1); //si no puede sale

fseek( ar1,0,2 ); //se posiciona al final
tam = ftell( ar1 ); //guarda el numero
fseek( ar1,0,0 ); //se posiciona al principio

//crea un vector del tamaño conseguido
cadena = new char[tam];

//intenta leer los datos, si no puede sale
if( !fread(cadena,tam,1,ar1) )exit(1);

fclose( ar1 ); //cierra el archivo
}

// cifrar:
// suma el codigo ASCII de la cadena con una
// clave que es pasada por parametro
void cifrado::cifrar(const char *clave)
{
int x=0,y=0; //indices de las cadenas

//mientras no sea el fin de la cadena
while( cadena[x]!=0 )
{
cadena[x]+=clave[y]; //suma el codigo ASCII
x++; //pasa a la siguiente posicion

if( clave[y+1]==0 ) //si se llega al final de la cadena
y=0; //comienza de nuevo
else //si no
y++; //sigue incrementando el indice
}
}

// descifrar:
// resta al codigo ASCII de la cadena
// la clave que es pasada por parametro
void cifrado::descifrar(const char *clave)
{
int x=0,y=0; //indices de las cadenas

//mientras no sea el fin de la cadena
while( cadena[x]!=0 )
{
cadena[x]-=clave[y]; //resta el codigo ASCII
x++; //pasa a la siguiente posicion

if( clave[y+1]==0 ) //si se llega al final de la cadena
y=0; //comienza de nuevo
else //si no
y++; //sigue incrementando el indice
}
}

// grabar_en_disco
// abre la direccion que es pasada por parametro
// y guarda el contenio de la cadena
void cifrado::grabar_en_disco( const char *nombre_archivo )
{
FILE *ar1;

//abre el archivo
ar1 = fopen( nombre_archivo,"rb+" );
if( !ar1 )exit(1); //si no puede sale

//intenta escribir los datos, si no puede sale
if( !fwrite(cadena,tam,1,ar1) )exit(1);

fclose( ar1 ); //cierra el archivo
}

cifrado::~cifrado()
{
delete[] cadena; //libera la memoria
}

int main()
{
cifrado archivo; //objeto para manejar el proceso

int opcion; //opcion del menu
char nombre_archivo[30]; //direccion del archivo
char clave_archivo[30]; //clave

do
{
limpiarPantalla(); //limpia pantalla y muestra menu
cout << "1. Seleccionar Archivo" << endl;
cout << "2. Cifrar" << endl;
cout << "3. Descifrar" << endl;
cout << "4. Cerrar programa" << endl;
cout << "Opcion: ";

cin >> opcion; //pide el ingreso de una opcion

clave_archivo[0] = 0; //pone en cero la clave

switch( opcion )
{
case 1:
cout << "Nombre del archivo: ";
cin.ignore();
//se ingresa la direccion del archivo
cin.getline( nombre_archivo,30 );

//si la cadena esta vacia no hace nada
if( nombre_archivo[0]==0 )break;
archivo.leer_de_disco( nombre_archivo );
break;

case 2:
//si la cadena esta vacia no hace nada
if( nombre_archivo[0]==0 )break;
cout << "Ingrese la clave: ";
cin.ignore();
//se ingresa la cable para cifrar
cin.getline( clave_archivo,30 );

//si la clave esta vacia no hace nada
if( clave_archivo[0]==0 )break;
archivo.cifrar( clave_archivo ); //cifra
archivo.grabar_en_disco( nombre_archivo ); //guarda
break;

case 3:
//si la cadena esta vacia no hace nada
if( nombre_archivo[0]==0 )break;
cout << "Ingrese la clave: ";
cin.ignore();
//se ingresa la clave para descifrar
cin.getline( clave_archivo,30 );

//si la clave esta vacia no hace nada
if( clave_archivo[0]==0 )break;
archivo.descifrar( clave_archivo ); //descifra
archivo.grabar_en_disco( nombre_archivo ); //guarda
break;

case 4:
return 0; //sale del programa
break;
}
}while(1);
}



josemario1606

Buenas,

Sé que este tema está más que anciano, pero quería saber cómo utiliza el programa, ya que a la hora de ingresar el nombre del archivo, simplemente se cierra. Si por casualidad aún tienes el programa, ¿crees que podrías resubirlo o explicarme cómo utilizarlo?

engel lex

esto no es un programa profesional de cifrado ni mucho menos, es un experimentos simple de un usuario... debes pasar al ruta absoluta del archivo
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.