Example #1
0
int main() {
		// Creates the named pipe if it doesn't exist yet
	int i;
	int idpai=getpid();
	pid_t pid[N_PROCESSOS-1];
	char frase[50];
	char frase2[50];
  	if ((mkfifo(PIPE_NAME, O_CREAT|O_EXCL|0600)<0) && (errno!= EEXIST)) {
    	perror("Cannot create pipe: ");
		exit(0);
	}	
	if ((mkfifo(PIPE_D_C, O_CREAT|O_EXCL|0600)<0) && (errno!= EEXIST)) {
        perror("Cannot create pipe: ");
                exit(0);
        } 
	for(i=0;i<N_PROCESSOS-1;i++){
		if((pid[i]=fork())==0){
			if(pid[i]<0){
				printf("erro ao fazer fork");
				exit(0);
				}
			
			if(i==0)//dispacher processo dedicado
				dispacher();	
			if(i==1){
				pipe(fd[0]); //processo dedicado a descodificacao de passes
				close(fd[0][1]);
				while(1){	
                	read(fd[0][0],frase,50);   //Leitura de uma pipe que contem a frase que conterá o mail e a password
                	desencriptar(frase);
				}
			}
			if(i==2){
				pipe(fd[1]);
				close(fd[1][1]); // o mesmo que em cima
				while(1){
	            	close(fd[1][1]);
        	    	read(fd[1][0],frase2,50);
                	desencriptar(frase2);
				}
			}
			if(i==3)
				controler(); // processo dedicado ao controler
		}
		else {
			menu(pid);// a funcao menu e chamada pelo pai
			kill( pid[0],SIGKILL);// mata os restantes processos
			kill( pid[1],SIGKILL);
			kill( pid[2],SIGKILL);
			kill(pid[3],SIGKILL);
			wait(NULL); //pai espera pelos processo filhos
			wait(NULL);
			wait(NULL);
			wait(NULL);
			}
	}
	return 0;
}
Example #2
0
int sockets()
{	
	char Usuario [30];	
	printf("Digite el usuario \n");          // Se le solicita al usuario el username del contacto con el que desea cominicarse
	scanf("%s",Usuario);			
		
	lee(Usuario);                            // Se llama a la función leer para validar que el usuario existe y a su vez nos devuelva la ip
											 // y el puerto asociado
	
	int socket1, nuevoSocket, numPuerto, mensaje,pid;   // Se declaran las variables necesarias para el socket
	socklen_t clilen;
	char buffer[1024];                                  // Tamaño del mensaje
	
	numPuerto = atoi(puerto);                           // Se convierte el numero de puerto a entero
	
	pid = fork();                                       // Se guarda el id de proceso
	
	if (pid < 0){										// Error si el fork devuelve un -1 
		error("El fork no se realizo de forma correcta\n");
	}
	
	//Si el id es igual a 0 se cierra el socket y se abre una nueva comunicacion
	if (pid == 0)                                       // La parte del sockect que envía
	{
				
		struct sockaddr_in dir_servidor;                // Se declaran las estructuras donde se 
		struct hostent *servidor;                       // guarda la ip del servidor
		
		while (1){                                      // Se crea un while infinito
			
			sleep (1);
			//Se crea el socket
			socket1 = socket(AF_INET, SOCK_STREAM, 0);
			
			//Muestra error en caso de no poder crear el socket
			if (socket1 < 0) error("El socket no se ha podido crear\n");
			
			//Obtiene la direccion ip del servidor
			if (existe == 1) {     // Si el usuario se encontraba en el archivo se llama a copiar para que elimine el \0
				copiar (ip, IP);
				servidor = gethostbyname(IP);
				}
			else servidor = gethostbyname(ip);
			
			//Si el servidor es nulo ,muestra el error 
			if (servidor == NULL)
			{
				fprintf(stderr,"Error, no se encuentra con quien conectar \n");
				exit(0);
			}
			
			//Rellena con 0
			bzero((char *) &dir_servidor, sizeof(dir_servidor));
			
			dir_servidor.sin_family = AF_INET;                  //Protocolo TCP
			
			//Copia la direccion
			bcopy((char *)servidor->h_addr,(char*)&dir_servidor.sin_addr.s_addr,servidor->h_length);
			
			dir_servidor.sin_port = htons(numPuerto);           //Representa el numero de puerto
			
			//Verifica que pueda establecer la conexion
			if (connect(socket1,(struct sockaddr *)&dir_servidor,sizeof(dir_servidor)) < 0) 
				error("Error, en crear la conexión");
			
			printf("\033[34m \n Yo: ");  // Es el printf que va indicar que le corresponde escribir
			
			//Relleno con ceros
			bzero(buffer,1024);
			
			//Lee el mensaje desde la entrada estandar
			fgets(buffer,1023,stdin);
						
			//Solicita escribir un mensaje
			mensaje = write(socket1,buffer,strlen(buffer));
			//Si se produce un error al escribir el msj, se muestra el error
			if (mensaje < 0)
				error("Error, no se pudo escribir el mensaje");
			
			if (strcmp(buffer,"salir\n")==0){    // Si el usuario digita "salir" la conversación se da por finalizada
				printf ("\033[31m Conversacion finalizada\n");
				sleep(2);
				system("clear");  // Limpia la pantalla
				break;
			}
			
			//Relleno con ceros
			bzero(buffer,1024);
			//Lee el mensaje
			encriptar(buffer,1);
			mensaje = read(socket1,buffer,1023);
				
			//Si se produce un error al leer el msj, se muestra el error
			if (mensaje < 0)
				error("Error, no se puede leer el mensaje");
				
			//printf("%s", buffer);
			
			close(socket1);
	
		}
		return 0;
	}
		
	else {  //Servidor
	
		//printf("Entre al servidor");
		
		struct sockaddr_in dir_servidor, dir_cliente;
		socket1 = socket(AF_INET, SOCK_STREAM, 0);
		
		//validacion en caso de no se pueda establecer el socket
		if (socket1 < 0)
			error("Error, no se puede crear el socket");

		//Establece los valores del bufer a 0
		bzero((char *) &dir_servidor, sizeof(dir_servidor));
		//numPuerto obtine el numero de puerto ingresado por el usuario
		
		dir_servidor.sin_family = AF_INET;                  //Protocolo TCP
		dir_servidor.sin_addr.s_addr = INADDR_ANY;          //Representa la direccion ip
		dir_servidor.sin_port = htons(numPuerto);           //Representa el puerto

		//Verifica la conexion
		if (bind(socket1, (struct sockaddr *) &dir_servidor,sizeof(dir_servidor)) < 0)
			error("Error, no se puede crear la conexión");
		
		while(1){
			
			listen(socket1,5);
	
			//Tamaño de bytes que ocupa la direccion cliente
			clilen = sizeof(dir_cliente);
			
			//Se cra una nueva comunicación
			nuevoSocket = accept(socket1,(struct sockaddr *) &dir_cliente, &clilen);
			if (nuevoSocket < 0)
			error("Error, no se puede aceptar la conexión");
						
			bzero(buffer,256);
			sleep (2);
			//Lee el mensaje
			desencriptar(buffer,1);
			mensaje = read(nuevoSocket,buffer,255);
			//Muestra el error en caso de que se produzca
			if (mensaje < 0)
				error("Error, al leer el mensaje enviado");
			
			if (strcmp(buffer,"salir\n")==0){
				printf ("\033[33m Conversacion finalizada\n");
				sleep(2);
				Menu();
				sleep(2);
			}
			
			else{
				//Muestra el mensaje recibido
				//desencriptar(buffer,1);
				printf("\033[32m \n %s:  %s\n",Usuario, buffer); //Muestra el mensaje enviado
					}
				
				close(nuevoSocket);
				}	
	}
	return 0;
}
Example #3
0
int main()
{

	srand(time(NULL));
	
	int eleccion_menu;

	printf("Ingresa el numero correspondiente a la funcion que quieras usar\n");
	printf("1. Generar claves publica y privada\n");
	printf("2. Encriptar desde archivo\n");
	printf("3. Desencriptar desde archivo\n");
	printf("4. Manual\n");

	scanf("%d", &eleccion_menu);

	if (eleccion_menu == 1)
	{	// GENERAR CLAVES PUBLICA Y PRIVADA
		int primos[10] = {17, 19, 23, 29, 31, 37, 41, 43, 47, 53};

		// p y q dos numeros primos...
		int p = primos[rand()%10];
		int q = primos[rand()%10];

		// n y euler(n)...
		long int n = p*q;
		long int phi_n = (p-1)*(q-1);
		
		// e tal que 1 < e < euler(n) y e coprimo con n y euler(n)
		long int e = rand()%phi_n;
		while(maximo_comun_divisor(e, n) != 1 || maximo_comun_divisor(e, phi_n) != 1)
		{
			e = rand()%phi_n;
		}

		// d tal que (d*e)%phi_n = 1
		// Usamos la funcion modIverse para generar la d...
		long int d = modInverso(e, phi_n) + phi_n * (rand()%5 + 1);

		printf("--- Las claves son ---\n");
		printf("--- publica (%li,%li) ---\n", e, n);
		printf("--- privada (%li,%li) ---\n", d, n);

	}
	else if (eleccion_menu == 2)
	{	// ENCRIPTAR DESDE ARCHIVO
		long int e, n;

		FILE * archivo_de_texto;

		archivo_de_texto = fopen("mensaje_entrada.txt", "r");

		char mensaje_entrada[1000]; // Contiene el mensaje del archivo
		long int mensajeEncriptado[1000]; // Contiene el mensaje encriptado

		//Limpiamos los 1000 elementos que tiene el mensaje 
		//antes de llenarlo con los caracteres
		for (int i = 0; i < 1000; ++i)
		{
			mensaje_entrada[i] = 0;
			mensajeEncriptado[i] = 0;
		}

		for (int i = 0; i < 1000; ++i)
		{
			fscanf(archivo_de_texto, "%c", &mensaje_entrada[i]);
			if (mensaje_entrada[i] == 0)
			{
				break;
			}
		}

		fclose(archivo_de_texto);

		printf("Ingrese la clave bajo la cual queres encriptar el mensaje\n");
		printf("Clave e (publica): ");
		scanf("%li", &e);
		printf("Clave n: ");
		scanf("%li", &n);

		encriptar(mensaje_entrada, mensajeEncriptado, e, n); // Salida en hex a cryptofile.txt
		printf("El mensaje encriptado a quedado en el archivo \"cryptofile.txt\" \n");
	}
	else if(eleccion_menu == 3)
	{
		long int d, n;

		FILE * archivo_de_encriptado;
		
		archivo_de_encriptado = fopen ("cryptofile.txt","r");

		long int crypto_hex[1000]; // Contiene los valores recibidos del archivo cryptofile.txt
		char mensaje_salida[1000]; // Contiene el mensaje que saldra

		for (int i = 0; i < 1000; ++i)
		{
			crypto_hex[i] = 0;
			mensaje_salida[i] = 0;
		}		
		
		for (int i = 0; i < 1000; ++i)
		{
			fscanf (archivo_de_encriptado, "%05X ", &crypto_hex[i]);
			if (crypto_hex[i] == 0)
			{
				break;
			}
			printf ("I have read: %li \n",crypto_hex[i]); // SACAR
		}
		
		fclose(archivo_de_encriptado);

		printf("Ingrese su clave privada para desencriptar el mensaje\n");
		printf("Clave d (privada): ");
		scanf("%li", &d);
		printf("Clave n: ");
		scanf("%li", &n);

		desencriptar(crypto_hex, mensaje_salida, d, n);

		for (int i = 0; i < strlen(mensaje_salida); ++i)
		{
			printf("%c", mensaje_salida[i]);
		}

		FILE * salidarchivo;
		salidarchivo = fopen("mensaje_salida.txt", "w");

		for (int i = 0; i < strlen(mensaje_salida); ++i)
		{		
			fprintf(salidarchivo, "%c", mensaje_salida[i]);
		}

		fclose(salidarchivo);
	}

	return 0;
}