小提示,密码文件需要自己先创建一个txt文件自己输入6个字符密码,路径与代码的运行路径在一起。。。
/*题目:文件加密
文件的传输会有明文和密文的区别,明文发送时不安全的,用一个程序实现发送文件的加密和解密操作。
加密算法,密钥设计由同学自己选择现有的加密解密算法或是自己设计的。
要求:
(1)对文件的字符根据加密算法,实现文件加密。
(2)对操作给出必要的提示。
(3)对存在的file1.txt文件,必须先打开,后读写,最后关闭。加密后的文件放在file2.txt。
(4)解密文件保存在file3.txt中。
*/
#include // 标准输入输出函数
#include // 标准库函数
#include // 字符串处理函数
#include //控制台输入输出函数
char password[6];//软件初始密码
int jiami();
int check(int type);
int jiemi();
int xianshi();
int zhucaidan();
int fuzhi();
int fanhui();
int gaimima();
int jieshu();
char infile[20];
char outfile[21];
int main()
{
system("cls");
// 操作前先校验密码
if(!check(1))
{
printf("抱歉,3次输入密码错误。按任意键退出程序...");
getchar();
exit(0);
}
// 密码校验成功,显示程序菜单,执行各种操作
zhucaidan();
return 0;
}
int jiami()
{
FILE *in;
FILE *out;
int i=0;
char ch;
char yuanzifu[100000];
char gaiguodezifu[100000];
system("cls"); // 清屏
printf("╔════════════════════════════════════╗\n");
printf("║ ║\n");
printf("║ 欢迎使用本软件进行文件加密 ║\n");
printf("║ ║\n");
printf("║ 祝您体验愉快 ║\n");
printf("║ ║\n");
printf("╚════════════════════════════════════╝\n");
printf("请输入需要加密的文件名(含路径):");
scanf("%s",infile);
in=fopen(infile,"rb");//只读文件
if(in==NULL)
{
printf("\n文件[%s]打开失败,请检查文件路径和名称是否输入正确!\n",infile);
printf("\n按下任意键返回重新输入加密文件....");
system("pause");//输入任意字符后进行下一步,也就是让输出停留
return jiami();
}
printf("\n请输入加密后的文件名(含路径):");
scanf("%s",outfile);
out=fopen(outfile,"wb");//只写文件
if(out==NULL)
{
printf("文件[%s]创建/写入失败,请检查文件路径和名称是否输入正确!\n",outfile);
printf("\n按下任意键返回重新输入加密文件....");
system("pause");//输入任意字符后进行下一步,也就是让输出停留
return jiami();
}
ch=fgetc(in);//读入一个字符
while(ch!=EOF)//读入字符直到字符结束
{
yuanzifu[i]=ch;//将ch赋给字符串数组
i++;
ch=fgetc(in);//读入一个字符
}
int n;
n=i;
putchar(10);//空行
printf("原文件内容如下:\n");
printf("%s\n",yuanzifu);
//printf("n=%d",n);
for(i=0;iint s=1;
int m=3000;
gaiguodezifu[i]=yuanzifu[i]+s*s-m;//进行字符加密处理
s++;
m--;
if(s>5000)
{
s=1;
}
}
//printf("%s",gaiguodezifu);
for(i=0;i// putchar(ch);
}
putchar(10);
printf("加密后的文件内容如下:\n");
printf("%s",gaiguodezifu);
putchar(10);
printf("\n按下任意字符后继续:");
system("pause");//输入任意字符后进行下一步,也就是让输出停留
fclose(in);
fclose(out);
system("cls"); // 清屏
printf("\n\n恭喜你,文件[%s]加密成功,保存在[%s]。\n", infile, outfile);
printf("\n\n输入任意字符进行选择下一操作");
system("pause");
return fanhui();
}
int jiemi()
{
system("cls");// 清屏
FILE *in;
FILE *out;
int i=0;
char ch;
char yuanzifu[100000];
char gaiguodezifu[100000];
printf("╔════════════════════════════════════╗\n");
printf("║ ║\n");
printf("║ 欢迎使用本软件进行文件解密 ║\n");
printf("║ ║\n");
printf("║ 祝您体验愉快 ║\n");
printf("║ ║\n");
printf("╚════════════════════════════════════╝\n");
printf("请输入需要解密的文件名(含路径):");
scanf("%s",infile);
in=fopen(infile,"rb");//只读文件
if(in==NULL)
{
printf("\n文件[%s]打开失败,请检查文件路径和名称是否输入正确!\n",infile);
printf("\n按下任意键返回重新输入解密文件....");
system("pause");//输入任意字符后进行下一步,也就是让输出停留
return jiemi();
}
printf("\n请输入解密后的文件名(含路径):");
scanf("%s",outfile);
out=fopen(outfile,"wb");//只写文件
if(out==NULL)
{
printf("文件[%s]创建/写入失败,请检查文件路径和名称是否输入正确!\n",outfile);
printf("\n按下任意键返回重新输入解密文件....");
system("pause");//输入任意字符后进行下一步,也就是让输出停留
return jiemi();
}
ch=fgetc(in);//读入一个字符
while(ch!=EOF)//读入字符直到字符结束
{
yuanzifu[i]=ch;//将ch赋给字符串数组
i++;
ch=fgetc(in);//读入一个字符
}
int n;
n=i;
putchar(10);//空行
printf("加密文件内容如下:\n");
printf("%s\n",yuanzifu);
//printf("n=%d",n);
for(i=0;iint s=1;
int m=3000;
gaiguodezifu[i]=yuanzifu[i]-s*s+m;//进行字符解密处理
s++;
m--;
if(s>5000)
{
s=1;
}
}
//printf("%s",gaiguodezifu);
for(i=0;i// putchar(ch);
}
putchar(10);
printf("解密后的文件内容如下:\n");
printf("%s",gaiguodezifu);
putchar(10);
printf("\n按下任意字符后继续...");
system("pause");//输入任意字符后进行下一步,也就是让输出停留
fclose(in);
fclose(out);
system("cls"); // 清屏
printf("\n\n恭喜你,文件[%s]解密成功,保存在[%s]。\n", infile, outfile);
printf("\n\n输入任意字符进行选择下一操作...");
system("pause");
return fanhui();
}
int xianshi()
{
FILE *in;
char ch2;
system("cls");
printf("************************************\n");
printf("** 欢迎使用本软件进行文件显示 **\n");
printf("** 祝您体验愉快 **\n");
printf("************************************\n");
printf("\n\n请输入需要显示的文件(包含路径):");
scanf("%s",infile);
in=fopen(infile,"rb");
if(in==NULL)
{
printf("\n打开文件错误,请检查文件名(路径),按任意键重新输入...");
system("pause");
return xianshi();
}
while(ch2!=EOF)
{
ch2=fgetc(in);
putchar(ch2);
}
printf("\n\n按下任意键进入下一选项...");
system("pause");
return fanhui();
}
int check(int a)
{
int i;
char ch3[6];
FILE *in;
in=fopen("mima.txt","r+");
if(in==NULL)
{
printf("\n\n密码文件错误,请检查...\n");
exit(0);
}
for(i=0;i<6;i++)
{
ch3[i]=fgetc(in);
}
for(i=0;i<6;i++)
password[i]=ch3[i];
// printf("%s",password);
char pwd[6]; //用户输入的密码
int trytimes; // 用户尝试输入密码的次数
printf("作者:陈浩翔 \n");
printf("\n程序设置了密码,验证通过后才能使用。请输入6位数字密码:");
for(trytimes=1; trytimes<=3; trytimes++)
{
scanf("%s",pwd);
fflush(stdin);/*清空输入缓冲区。
比如scanf("%d",&a);
scanf("%c",&c);
经常如果这种情况的话,
第一次输入的回车可能会被第二次输入操作所捕捉,
这个的作用就是清空缓冲,这样就不会出现这种情况了。*/
if(pwd[0]==password[0]&&pwd[1]==password[1]&&pwd[2]==password[2]&&pwd[3]==password[3]&&pwd[4]==password[4]&&pwd[5]==password[5])
{
return 1;
break;
}
else
if(trytimes==3)
{
return 0;
}
else
{
printf("抱歉,密码错误,您还有%d次机会:", 3-trytimes);
}
}
return 0;
}
int zhucaidan()
{
system("cls");//清屏
printf("****************************************************\n");
printf("** 欢迎来到文件加密解密界面 **\n");
printf("** 信息科学与工程学院 **\n");
printf("** 软件作者: **\n");
printf("** 1406102-15 陈浩翔 **\n");
printf("** **\n");
printf("** 请选择即将进行的操作 **\n");
printf("** 输入1:加密文件 **\n");
printf("** 输入2:解密文件 **\n");
printf("** 输入3:显示文件内容 **\n");
printf("** 输入4:将原文件内容复制到另一文件**\n");
printf("** 输入5:修改程序密码 **\n");
printf("** 输入6:退出软件 **\n");
printf("****************************************************\n");
int b;
scanf("%d",&b);
switch(b)
{
case 1:jiami();break;
case 2:jiemi();break;
case 3:xianshi();break;
case 4:fuzhi();break;
case 5:gaimima();break;
case 6:jieshu();break;
default:
{
printf("没有相应的菜单!按任意键返回...");
system("pause");
return zhucaidan();
}
return 0;
}
}//bug1:在主菜单输入多个字母会自动跳到加密文件菜单;
int fuzhi()
{
system("cls");//清屏
printf("╔════════════════════════════════════╗\n");
printf("║ ║\n");
printf("║ 欢迎使用本软件进行文件复制 ║\n");
printf("║ ║\n");
printf("║ 祝您体验愉快 ║\n");
printf("║ ║\n");
printf("╚════════════════════════════════════╝\n");
FILE *in1,*out1;
char ch1;
printf("请输入需要加密的文件名(含路径):");
scanf("%s",infile);
in1=fopen(infile,"rb");//只读文件
if(in1==NULL)
{
printf("\n文件[%s]打开失败,请检查文件路径和名称是否输入正确!\n",infile);
printf("\n按下任意键返回重新输入加密文件....");
system("pause");//输入任意字符后进行下一步,也就是让输出停留
return fuzhi();
}
printf("\n请输入加密后的文件名(含路径):");
scanf("%s",outfile);
out1=fopen(outfile,"wb");//只写文件
if(out1==NULL)
{
printf("文件[%s]创建/写入失败,请检查文件路径和名称是否输入正确!\n",outfile);
printf("\n按下任意键返回重新输入加密文件....");
system("pause");//输入任意字符后进行下一步,也就是让输出停留
return fuzhi();
}
while(!feof(in1))//如果没有遇到输入文件的结束标志
//feof(in)是检查in指向的文件是否结束
{
ch1=fgetc(in1);//从输入文件读入一个字符,暂时放在变量ch中
fputc(ch1,out1);//将ch写到out指向的文件中
putchar(ch1);
}
putchar(10);
fclose(in1);
fclose(out1);
return fanhui();
}
int fanhui()
{
system("cls");//清屏
int m;
system("cls");
printf("############################################\n");
printf("## 操作成功,请进行选择 ##\n");
printf("## 1:进入加密菜单 ##\n");
printf("## 2:进入解密菜单 ##\n");
printf("## 3:进入显示文件内容菜单 ##\n");
printf("## 4:进入文件复制菜单 ##\n");
printf("## 5:返回主菜单 ##\n");
printf("## 6:退出程序 ##\n");
printf("############################################\n");
scanf("%d",&m);
switch(m)
{
case 1:jiami();break;
case 2:jiemi();break;
case 3:xianshi();break;
case 4:fuzhi();break;
case 5:main();break;
case 6:jieshu();break;
default:
{
printf("没有对应选项,按任意键返回");
system("pause");//输入任意字符后进行下一步,也就是让输出停留
return fanhui();
}
}
}
int gaimima()
{
system("cls");
int i;
char ch[6];
char cha[6];
FILE *in;
in=fopen("mima.txt","w+");
if(in==NULL)
{
printf("\n\n打开(建立)文件出错...\n");
exit(0);
}
getchar();
printf("\n请输入6个新密码字符或数字:");
for(i=0;i<6;i++)
{
scanf("%c",&ch[i]);
}
getchar();
printf("\n\n请再输入一次6个新密码字符或数字:");
for(i=0;i<6;i++)
{
scanf("%c",&cha[i]);
}
for(i=0;i<6;i++)
{
if(ch[i]!=cha[i])
{
printf("2次输入的密码不同,请重新输入:");
system("pause");
return gaimima();
}
continue;
}
for(i=0;i<6;i++)
{
password[i]=ch[i];
}
for(i=0;i<6;i++)
{
fputc(password[i],in);
}
fclose(in);
printf("按下任意键返回主菜单...");
system("pause");
return main();
}
int jieshu()
{
system("cls");
printf("***************************\n");
printf("** 欢迎下次再使用本软件 **\n");
printf("** ( ^_^ )/~~拜拜 **\n");
printf("***************************\n");
return ;
}
大一下期课程设计。