c语言课程设计之文本文件加密技术
发布于 2022-06-02 07:08
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;
}
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材