#include<stdio.h> #include<stdlib.h>//使用了exit函數 #include<string.h> #define M 30 void menu(void);//菜單函數 void create(void);//新建文件及輸入文本函數 void encrypt(void);//加密函數 void decrypt(void);//解密函數 int judge(void);//判斷函數 int proceed(code);//判斷密碼是否合理 char code[M]; main() { int num;//定義菜單指令的變量 while(1) { menu(); scanf("%d",&num); switch(num) { case 0:printf("\n"); exit(0); case 1:system("cls");//清屏處理 create(); break; case 2:system("cls"); encrypt(); break; case 3:system("cls"); decrypt(); break; default:printf("input error, enter again!\n"); break; } } } void menu(void) { printf("***********\n"); printf("****\n"); printf("* 文本文件加密技術 *\n"); printf("******************************************************\n"); printf("\n0.exit\n"); printf("1.create and input\n"); printf("2.encrypt\n"); printf("3.decrypt\n"); printf("\nchoose(0--3):"); } void create(void) { FILE *fp;//定義文件指針fp用以指向某個文件 char ch[100];//定義輸入字符 char fname[40];//文件名字 int i;//判斷次數 printf("input file name:"); scanf("%s",&fname); if((fp = fopen(fname,"w"))==NULL) { printf("failure to open %s.\n",fname); exit(0); } //判斷文件能否正常打開或建立 printf("input the content:\n"); for(i = 0;;i++) { scanf("%c",&ch[i]); if(ch[i] == '#'&&ch[i-1] == '#') break; fputc(ch[i],fp);//將字符的ASCII碼寫入文件 } //while((ch = getchar()) != '#') //fputc(ch,fp); fclose(fp); } void encrypt(void) { int n = 1,x; FILE *fp, *fp1; char c, fname[M]; while(n) { printf("\n輸入加密密碼(至少兩個字母和四個數字):\n"); scanf("%s",code); x = proceed(code); if(x == 1) { while(n) { printf("\n輸入加密的文件名\n"); scanf("%s",fname); if((fp = fopen(fname,"r")) == NULL)//以讀的方式打開源文件 { printf("\n無法打開,繼續按 Y or y\n"); getchar(); n = judge(); } if((fp1 = fopen("encrypt.txt","w")) == NULL)//以寫的方式打開目標文件 { printf("無法打開\n"); exit(0); } while((c = fgetc(fp)) != EOF) { fputc(c+1,fp1); }//將fp所指向文件中的內容進行加一的加密方法 fclose(fp1); fclose(fp); remove(fname);//remove函數刪除指定文件 rename("encrypt.txt",fname);//給文件重命名,實現文件移動功能(若歸屬文件夾不同,可以實現該文件移動) printf("\n文檔加密並保存成功!\n"); printf("\n是否繼續加密,繼續請按y:\n"); n = judge(); } } else printf("\n密碼不合格!\n"); getchar();//停頓一下,等待判斷是否繼續加密 } } void decrypt(void) { int n = 1; FILE *fp,*fp1; char c,fname[M]; char code1[M];//用戶輸入的密碼 int i; while(n) { printf("\n輸入解密密碼\n"); scanf("%s",code1); if(strcmp(code1,code) == 0) { while(n) { printf("\n解密的文件名:\n"); scanf("%s",fname); if((fp = fopen(fname,"r")) == NULL) { printf("\n 文件打不開\n"); exit(0); } if((fp1 = fopen("decrypt.txt","w")) == NULL) { printf("無法打開文件!\n"); exit(0); } while((c = fgetc(fp)) != EOF)//文件末尾標志 { fputc(c-1,fp1); if(c-1 != '#') putchar(c-1); } fclose(fp1); fclose(fp); remove(fname); rename("decrypt.txt",fname);//將decrypt.txt重命名為fname,歸屬文件夾不同,可以做到移動的效果 printf("\n\n是否繼續解密,繼續請按y:\n"); n = judge(); } } else printf("\n輸入有誤,重新輸入:\n"); getchar(); } } int judge(void) { char x;//要判斷的數 scanf("%c",&x); if(x == 'Y' || x == 'y') return 1; else return 0; } int proceed(char code[]) { int i, flag1 = 0,flag2 = 0,len; len = strlen(code); for(i = 0; i< len; i++) { if(code[i] >= 'a' && code[i] <= 'z') flag1 += 1; else if(code[i] >= 'A' && code[i] <= 'Z') flag1 += 1; else if(code[i] >= '0' && code[i] <= '9') flag2 += 1; } if(flag1 >= 2 && flag2 >= 4) return 1; else return 0; }