c语言课程设计之文本文件加密技术

发布于 2022-06-02 07:08

#include<stdio.h>#include<stdlib.h>//使用了exit函数#include<string.h>#define M 30void 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.exit\n");    printf("1.create and input\n");    printf("2.encrypt\n");    printf("3.decrypt\n");    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 y\n");               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("\n\n是否继续解密,继续请按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;}



本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材