您的位置:首页 > 其它

课程设计,文件加密

2015-08-21 18:13 274 查看
小提示,密码文件需要自己先创建一个txt文件自己输入6个字符密码,路径与代码的运行路径在一起。。。

/*题目:文件加密
文件的传输会有明文和密文的区别,明文发送时不安全的,用一个程序实现发送文件的加密和解密操作。
加密算法,密钥设计由同学自己选择现有的加密解密算法或是自己设计的。
要求:
(1)对文件的字符根据加密算法,实现文件加密。
(2)对操作给出必要的提示。
(3)对存在的file1.txt文件,必须先打开,后读写,最后关闭。加密后的文件放在file2.txt。
(4)解密文件保存在file3.txt中。
*/

#include <stdio.h>  // 标准输入输出函数
#include <stdlib.h>  // 标准库函数
#include <string.h>  // 字符串处理函数
#include  <conio.h>   //控制台输入输出函数
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;i<n;i++)
{
int 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<n;i++)
{
ch=gaiguodezifu[i];
fputc(ch,out);
// 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;i<n;i++)
{
int 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<n;i++)
{
ch=gaiguodezifu[i];
fputc(ch,out);
// 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 ;
}


我上传部分运行图片:











大一下期课程设计。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: