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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM