#include <iostream>
#include <ctime>
#include <string.h>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
/*By STAKEWINNER 00
You can add your name with your modifications but you can NOT delete my name
*/
//Funcion que encripta el archivo
int CR1M2 (char str[256], int argc, string pass, char str2[256]) // str -> archivo a encriptar, argc -> numero de argumentos que introducio el usuario, pass -> contraseña, str2 -> archivo de salida (opcional)
{
if (argc > 2) //Si el usuario ha introducido un nombre de un archivo y por tanto hay más de 2 argumentos no hace nada en caso contrario le pide que introduzca el nombre del archivo
{
} else
{
cout << "NOMBRE DEL ARCHIVO DE TEXTO A ENCRIPTAR: ";cin.get();cin.get (str,256);
}
if (argc > 3) //Si el usuario ha introducido una password y por tanto hay más de 3 argumentos no hace nada en caso contrario le pide que introduzca la password
{
} else
{
cout << endl<< "INTRODUZCA LA PASSWORD ";cin >> pass;
}
ifstream entrada;
entrada.open (str,ios::binary); //Archivo que se va a encriptar
if (!entrada) //Si el archivo no existe informa del error
{
cout << endl << endl << "ERROR EN EL ARCHIVO"; return 0;
}
string mens2=""; //Variable usada para almacenar los caracteres que luego se guardaran en el archivo de salida
cout << endl << endl << "PUEDE TARDAR SEGUNDOS DEPENDIENDO DE LA LONGITUD DEL TEXTO" << endl << endl;
//Este fragmento guarda en size el tamaño del archivo
entrada.seekg(0, ios::end);
long size = entrada.tellg();
entrada.seekg(0, ios::beg);
string clave; //Esta variable guardara la clave que luego pasara a CLAVE.txt, esta clave es necesaria para desencriptar el texto
char mens; //Donde se akmacenara cada caracter que se vaya a encriptar
char letra; //Variable usada para guardar la letra encriptada y hacerle los cmabios
/*Las siguientes dos variables sirven para informar del avance en %
El primero sirve para que cada 100000 repeticiones informe del % (para no consumir mucha CPU)
El segundo es simplemente el numero de repeticiones que lleva */
double long index2=0;
double long index=0;
int ii=0; //Contador para la password
int num2=1+rand()%(90-1); //Genera un segundo numero aleatorio
int num=1+rand()%(90-1);
ofstream salida;
salida.open (str2,ios::binary); //Archivo de salida
//Bucle que se encarga de leer caracter por caracter y codificarlo y guardarlo en un archivo de salida
while (index!=size)
{
if (index2==1000000) //Condicinoal que informa al usuario del avance cada 1000000 repeticiones del bucle
{
index2=0;
if (index*100/size >0)
{
cout << index*100/size << " %" << endl; // Calculo del %
}
}
//Aqui es la parte donde realmente se encripta todo
if (entrada.good())
{
letra = pass[ii] + num; //A la variable letra se le asigna el primer caracter de la password y se le suma un numero aleatorio (num)
letra = letra + pass[ii]; //A la primera letra de la password se le suma otra vez la primera
clave += letra; //Se almacena este caracter en el archivo clave
mens = entrada.get(); //Se obtiene un caracter del archivo a cifrar
letra = mens + num; //Al caracter se le suma un numero aleatorio
letra = letra + pass[ii]; //Al resultado de la operacion anterior se le suma la password
letra = letra - num2; //Al resultado anterior se le resta un numero aleatorio
num=1+rand()%(90-1); //Genera un numero aleatorio
mens2 += letra + num2; //Se almacena el caracter encriptado en mens2
num2=1+rand()%(200-1); //Genera un numero aleatorio
salida << mens2; //Se guarda la letra encriptada en el archivo
mens2=""; //Se devuelve mens2 a un valor nulo, esto es así por que si el texto es largo al final el string peta y genera un error
ii++; //Se le suma 1 a ii lo que hara que pase a operar con el segundo caracter de la password
if (pass.size()==unsigned(ii)) {ii=0;} //Si la password ya no tiene más caracteres vuelve al inicio
}
index2++;
index++;
}
entrada.close();
salida.close();
salida.open ("CLAVE.txt",ios::binary); //Se guarda la clave en el archivo
salida << clave;
salida.close();
cout << endl << endl;
cout << "TEXTO GUARDADO EN " << str2 << endl;
return 0;
}
//Esta funcion desencripta el text
int RCR1M2 (char str[256], int argc, string pass, char str2[256])
{
string clave;
char mens;
char letra;
char nu;
long i=0;
double long index=0;
int index2=0; //Variable usada para mostrar los %
int ii=0;
int num=1+rand()%(90-1);
//Si argc es mayor de 2 significa que el usuario ya inserto el nombre del archivo por lo tanto no le tenemos que volver a pedir
if (argc > 3) {} else { cout << endl<< "INTRODUZCA LA PASSWORD ";cin >> pass;}
if (argc > 2)
{
}
else
{
cout << "NOMBRE DEL ARCHIVO DE TEXTO A DESENCRIPTAR: ";cin.get();cin.get (str,256);
}
cout << endl << endl<< "PUEDE TARDAR SEGUNDOS DEPENDIENDO DE LA LONGITUD DEL ARCHIVO" << endl << endl;
ifstream entradas;
entradas.open (str,ios::binary);
if (!entradas)
{
cout << endl << endl << "ERROR EN EL ARCHIVO";return 0;
}
entradas.seekg(0, ios::end);
double long sizee= entradas.tellg();
entradas.seekg(0, ios::beg);
entradas.close();
entradas.open (str,ios::binary);
index=0;
ofstream salida;
salida.open (str2,ios::binary);
ifstream clabe;
clabe.open ("CLAVE.txt",ios::binary);
index2=0;
//Bucle encargado de desencriptar el texto
while (index<sizee*2)
{
index2++;
if (index2==500000)
{
index2=0;
if (index*100/sizee >0)
{
cout << index*100/sizee << " %" << endl;
}
}
i=0; index++;
mens = clabe.get();
letra=mens - pass[ii];
while (nu!=pass[ii])
{
i++;
nu = letra - i;
}
nu ='\0';
mens = entradas.get();
letra = mens - pass[ii];
letra = letra - i;
salida << letra;
letra = letra + mens;
index++;
ii++;
if (pass.size()==unsigned(ii)) {ii=0;}
}
salida.close();
clabe.close();
entradas.close();
cout << "ARCHIVO GUARDADO EN " << str2;
//remove( "CR1M2-temp.txt");
cout << endl <<endl;
return 0;
}
int main(int argc,char* argv[])
{
string pass;
int opcion;
char str[256], str2[256]; //Variable que guarda el nombre del archivo
if (argc>1) {if (strcmp(argv[1], "-h") == 0){
cout << endl << "cr1m2.exe [opcion ] [archivo] [password] [archivo salida(opcional)]" << endl << endl << "opcion = 1 Encriptar 2 Desencriptar" << endl ;return 0;};}
if (argc > 1 && argc < 3) {cout << "FALTAN PARAMETROS";return 0;};
if (argc > 1)
{
opcion = atoi(argv[1]);
if (opcion==1)
{
strcpy( str, argv[2]);
pass = argv[3];
if (argc<5) {
strcpy( str2, "CIFRADO-cr1m2.txt");
} else {
strcpy( str2, argv[4]);
}
CR1M2(str, argc, pass,str2);
}
if (opcion==2)
{
strcpy( str, argv[2]);
pass = argv[3];
if (argc<5) {
strcpy( str2, "DESCIFRADO-cr1m2.txt");
} else {
strcpy( str2, argv[4]);
}
RCR1M2(str, argc, pass,str2);
}
}
else
{
cout << "1.ENCRIPTAR" << endl << "2.DESENCRIPTAR"<< endl<<endl<<">>";
cin >> opcion;
switch(opcion)
{
strcpy( str, "");
case 1:strcpy( str2, "CIFRADO-cr1m2.txt");CR1M2(str, argc, pass, str2);
break;
case 2:strcpy( str2, "DESCIFRADO-cr1m2.txt");RCR1M2(str, argc, pass , str2);
}
}
}