课程设计,文件加密

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 课程设计,文件加密

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

我上传部分运行图片:

屏幕快照 2022-04-12 下午5.54.58.png屏幕快照 2022-04-12 下午5.55.06.png屏幕快照 2022-04-12 下午5.55.13.png屏幕快照 2022-04-12 下午5.55.19.png

目录
相关文章
|
3月前
|
安全 API 数据安全/隐私保护
史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录(一)
欢迎访问我的原站!本文详细介绍了程序脱壳技术,包括壳的定义、作用、执行过程、OEP(原始入口点)的概念及查找方法。文章通过多个实例,逐步演示了如何使用OD(OllyDbg)等工具进行脱壳操作,涵盖了压缩壳、加密壳等多种类型的壳。内容详尽,适合逆向工程初学者深入学习。[点击查看原文](https://www.oisec.cn/index.php/archives/520/)
91 0
|
3月前
|
存储 监控 API
史上最全最完整,最详细,软件保护技术-程序脱壳篇-逆向工程学习记录(二)
本文详细介绍了软件保护技术中的程序脱壳过程,包括IAT(导入地址表)的重建、OD(OllyDbg)跟踪输入表、HOOK-API技术以及FSG、UPX和WinUpacx等常见压缩壳的加脱壳方法。文章通过具体实例和详细步骤,帮助读者理解并掌握逆向工程的基本技巧。[原文链接](https://developer.aliyun.com/article/1618653)
67 0
|
5月前
|
安全 Java Shell
"SpringBoot防窥秘籍大公开!ProGuard混淆+xjar加密,让你的代码穿上隐形斗篷,黑客也无奈!"
【8月更文挑战第11天】开发SpringBoot应用时,保护代码免遭反编译至关重要。本文介绍如何运用ProGuard和xjar强化安全性。ProGuard能混淆代码,去除未使用的部分,压缩字节码,使反编译困难。需配置ProGuard规则文件并处理jar包。xjar则进一步加密jar包内容,即使被解压也无法直接读取。结合使用这两种工具可显著提高代码安全性,有效保护商业机密及知识产权。
459 3
|
7月前
|
算法 安全 Java
技术经验分享:JAVAAES加密与解密
技术经验分享:JAVAAES加密与解密
80 0
|
8月前
|
存储 算法 安全
C# | 上位机开发新手指南(七)加密算法
加密算法是信息安全领域中的重要技术之一,可以保护数据在传输、存储和处理过程中的安全性。 学习加密算法可以帮助我们更好地理解和应用其他相关技术。例如,数字证书、数字签名、安全协议等都与加密算法密切相关,掌握加密算法可以为我们理解和应用这些技术提供帮助。
124 0
C# | 上位机开发新手指南(七)加密算法
|
前端开发 安全 JavaScript
基于Python实现一个在线加密解密网站系统
基于Python实现一个在线加密解密网站系统
189 4
|
数据安全/隐私保护
手撕文件加密-解密
手撕文件加密-解密
36 0
|
运维 安全 Shell
金鱼哥戏说RHCSA认证:十六、文件查找、传输和打包压缩
第十六章 文件查找、传输和打包压缩
143 0
金鱼哥戏说RHCSA认证:十六、文件查找、传输和打包压缩
|
数据安全/隐私保护 C++
恺撒加密(MOOC)(C++)
恺撒加密(MOOC)(C++)
137 0
|
Java 数据安全/隐私保护
教你一招破解字节码加密
字节码加密的需求 java的字节码是可以反编译的,所以很多时候,做商用产品的时候,防止别人看你的核心代码是一个必要手段,字节码加密的需求就诞生了,本质就是防止别人反编译看代码。
2634 0