📄 enc_parallel.c
字号:
#include <stdio.h>#include <fcntl.h>#include <sys/types.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <omp.h>void encrypt(char data,char data1,int key[],int k);/* Function to encrypt a file 2 chars at a time */void decrypt (int l,int r,int key[]);/*function to decrypt a file reading encrypted vallue of each char*/void enc_fie(char filename[],char key[]);/*function which calls the encrypt function*/void dec_file(char filename[],char key[]);/*function which calls the decrypt function*/void parallel_enc(char data[],int key[]);static char a[16];static char b[16];int main(){ char filename[50];//filename which user enters int f1,f2;//file pointers to read from one file in which encrypted data is stored and appending // it in one file for decryption char buf1[500];//buffer for reading from enc_temp2 500 chars at a timechar key[12]; double start_time, end_time;int choice = 0;int exit=0;while(exit == 0) { printf("what do you want to do? \n 1.Encrypt a file \n 2. Decrypt a file \n 3.Exit \n" ); scanf("%d",&choice); switch(choice) { case(1): start_time = 0; end_time = 0; printf("enter file to be encrypted \n"); scanf("%s",filename); printf("enter the key (8 charecters)to be used for encryption \n"); scanf("%s",key); // printf("%s \n",key); start_time = omp_get_wtime(); printf("encryption of %s started at : %f \n ",filename,start_time); enc_file(filename,key); end_time = omp_get_wtime(); printf("encryption of %s ended at %f \n", filename,end_time ); printf("total time taken for encryption was %f \n",(end_time - start_time)); f1 = open("enc_temp1.txt",O_RDWR |O_APPEND);//opening file descriptor f1 in read write append mode f2 = open("enc_temp2.txt",O_RDONLY); memset(buf1,0,sizeof(buf1));//setting the buffer to 0 while(read(f2,buf1,500)>0)//reading from file enc_temp2 { write(f1,buf1,500);//writing into file enc_temp1 } break; case(2): start_time = 0; end_time = 0; printf("enter file to be decrypted \n"); scanf("%s",filename); printf("enter the key (8 charecters)to be used for decryption \n"); scanf("%s",key); start_time = omp_get_wtime(); printf("decryptio started at: %f \n", start_time); printf("decrypting: %s",filename); dec_file(filename,key); end_time = omp_get_wtime(); printf("decryption ended at %f \n", end_time); printf("time taken for decryptionwa s%f \n" , end_time - start_time); break; case(3): exit = 1; break; } }}/* ---------------MAIN ENDS------------------*//*-----------enc_file STARTS----------------*/void enc_file(char filename[],char key[]){ int fp0;//file pointer int i=0;//for loop int key_int[8];//for getting ascii value of the key charadters int thread_id;//thread id fp0 = open(filename,O_RDONLY);//opening file for encrption int file_size = (int) (lseek (fp0,0,SEEK_END));//finding the file size printf("\n File size is: %d \n",file_size); int half = file_size / 2; close(fp0) ;//closing File Pointer for (i=0;i<8;i++)//finding ascii value of key characters key_int[i] = (int) key[i]; omp_set_num_threads(2);//Specifying no of threads #pragma omp parallel { printf("\n---------In parallel region ------------\n"); thread_id = omp_get_thread_num(); //printf("Thread id is : % d \n",thread_id); if(thread_id==0) { int count=0;//counting no of chars read char ch,ch1;//characters for reading from file FILE *fp1;//file pointer if ((fp1 = fopen(filename,"r")) == NULL ) printf("\n error opening file in Thread 0 \n");// printf("\n In thread 0 half is:%d \n",half); while(count<half) { ch1 = getc(fp1); ch = getc(fp1); // printf("\n Encrypting in thread 0 %c and %c \n",ch1,ch); encrypt(ch1,ch,key_int,thread_id);//calling encrypt to encrypt ch1 and ch count = count+2;//2 chars encrypted }//END OF WHILE fclose(fp1);//closing fp1 }/* -----------End of Thread 0------------*/ else if (thread_id==1) {// printf("\n In thread 2 \n"); char ch2,ch3;//characters for reading from the file FILE *fp2; int position = half;//position to which file pointer needs to be moved if (((fp2 = fopen(filename,"r")) == NULL));// printf("cant open file \n"); /*if (file_size %2 ==0) position = half; else position = half;*/ if(fseek(fp2,position,SEEK_SET)!=0)//moving file pointer to middle of the file printf("\n lseek failed in Thread 1\n"); ch2 = getc(fp2);//reading a character // printf("char read was : %c \n",ch2); while(ch2 != EOF)//continue till end of file { ch3 = ch2; ch2 = getc(fp2);// read 2 character// printf("\n Encrypting in thread 1 %c and %c \n",ch3,ch2); encrypt(ch3,ch2,key_int,thread_id);//encrypt ch3 and ch2 ch2 = getc(fp2); }//End of while fclose(fp2);//close fp2 }//END oF THREAD 1}//--------END of PRAGMA ---------------------- }//-----------------------END of enc_file-------------------------------------void dec_file(char filename[], char key[]){ FILE *fp1; int p,q,i=0; int key_int[8]; fp1 = fopen(filename,"r"); for (i=0;i<8;i++) key_int[i] = (int) key[i];// omp_set_num_threads(8) ; while(fscanf(fp1,"%d %d",&p,&q)>0)//read 2 chars from the file { // printf("read from file %d and %d \n",p,q); decrypt(p,q,key_int);//calling decrypt } fclose(fp1);//closing fp1}void encrypt(char a,char b, int key[],int k1){ int data = (int)a;// getting ascii of 2 chars int data2 = (int)b; int l[16];//array for finding encrypted value of a and b int r[16]; l[0] = data; r[0] = data2; int i =0; int j=0; int k =0; for (i=1;i<16;i++) { if (i>8 && k==0) { j=0;k++;} l[i] = r[i-1] ^ key[j]; r[i] = l[i-1] ^ key[j]; // printf("key index :%d \n",j); // printf("l %d is %d \n",i,l[i]);// printf("r %d is %d \n ",i,r[i]); j++; } printf("----------------------------- \n") ; int buf[2] ={l[15],r[15]};// printf("buffer :: %d and %d \n",buf[0],buf[1]); FILE *fp1, *fp2; fp1 = fopen("enc_temp1.txt","a"); fp2 = fopen("enc_temp2.txt","a");if (k1==0){// printf("\n Now writing enc_temp1.txt \n"); fprintf(fp1,"%d %d ",l[15],r[15]);}else if(k1==1){// printf("\n Now writng enc_temp2.txt \n"); fprintf(fp2,"%d %d ",l[15],r[15]);}fclose(fp1);fclose(fp2); }//----------------------End of encrypt()---------------------------------------------void decrypt (int l, int r,int key[]){ int fp1; int p,q; fp1 = open("enc.txt",O_WRONLY|O_APPEND); int i = 16; int k=6; int l1[16]; int r1[16]; l1[15] = l; r1[15] = r; for (i=14;i>=0;i--) { if (k<0) k=7; l1[i] = r1[i+1] ^ key[k]; r1[i] = l1[i+1] ^ key[k]; k--; // printf("l %d is %d \n",i,l1[i]); // printf("r %d is %d \n ",i,r1[i]); }// END of FOR char a = (char)(l1[1] ^ key[0]); char b = (char)(r1[1]^key[0]);// printf("char value is %c \n",a);// printf("char 2 value is %c \n",b); printf("\n******************** \n"); char buf[2]; buf[1]=a; buf[0]=b; if (write (fp1,buf,2)==-1) printf("write error"); close(fp1);}//----------------END of decrypt--------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -