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
#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); }