课程设计,文件加密

小提示,密码文件需要自己先创建一个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 ;
}

我上传部分运行图片:
课程设计,文件加密

课程设计,文件加密

课程设计,文件加密

课程设计,文件加密

课程设计,文件加密

大一下期课程设计。

上一篇:深入浅出学习Linux(基础知识二)


下一篇:C++程序设计课程师生互动(2012年春第9周)