首页 > 代码库 > c语言课程设计之文本文件加密技术

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

#include<stdio.h>
#include<stdlib.h>//使用了exit函数
#include<string.h>
#define M 30
void 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;
}

 

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