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