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.exitn");
printf("1.create and inputn");
printf("2.encryptn");
printf("3.decryptn");
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 yn");
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("nn是否继续解密,继续请按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;
}
原文始发于微信公众号(汇编语言):c语言课程设计之文本文件加密技术
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论