#include#include//使用了exit函数
#include
#define M 30
void menu(void);//菜单函数
void create(void);//新建文件及输入文本函数
void encrypt(void);//加密函数
void decrypt(void);//解密函数
int judge(void);//判断函数
int proceed(code);//判断密码是否合理
charcode[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;charc, 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();
}
}elseprintf("\n密码不合格!\n");
getchar();//停顿一下,等待判断是否继续加密
}
}void decrypt(void)
{int n = 1;
FILE*fp,*fp1;charc,fname[M];char code1[M];//用户输入的密码
inti;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(charcode[])
{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;
}