Cifrar y descifrar archivos

Actualizado el domingo, 19 junio, 2016

Código C++. Con el podrás cifrar archivos mediante contraseñas. Esta realizado para un estudio, por lo que no es recomendable usarlo en producción que requiera gran fortaleza. El funcionamiento es muy simple: suma el código ascii del archivo con el de la clave, para descifrarlo los resta.

#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 chartam;
 
 //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( cadenax!=0 )
 {
 cadenax+=clavey; //suma el codigo ASCII
 x++; //pasa a la siguiente posicion
 
 if( clavey+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( cadenax!=0 )
 {
 cadenax-=clavey; //resta el codigo ASCII
 x++; //pasa a la siguiente posicion
 
 if( clavey+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_archivo30; //direccion del archivo
 char clave_archivo30; //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_archivo0 = 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_archivo0==0 )break;
 archivo.leer_de_disco( nombre_archivo );
 break;
  case 2:
 //si la cadena esta vacia no hace nada
 if( nombre_archivo0==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_archivo0==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_archivo0==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_archivo0==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);
}

 

Agregar comentario