#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; }
时间: 2024-10-15 01:33:12