凯撒密码(加密与解密)

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
    /************************************************************************/  
    /*caeser.c 
    /* 凯撒密码是把明文字符按照相同的位移量向后移动 
    /*比如明文can,位移量为3,密文为fdq 
    /*本程序仅对英文字母和数字有效 
    /*使用时将文件置于caeser.c同目录下,密文默认名字为cipher.txt 
    /************************************************************************/  
    #include<stdio.h>  
    #include<stdlib.h>  
    #define ITEM 2  
    void encipher();  
    void decipher();  
    int main()  
    {  
        int flag;  
        void (*menu[ITEM])()={encipher,decipher};  
        printf("加密文件——1\n");  
        printf("解密文件——2\n");  
        printf("退出程序——0\n");  
        while(1)  
        {  
            scanf("%d",&flag);  
            if(!flag)  
                exit(1);  
            else if(flag==1||flag==2)  
                menu[flag-1]();  
            else  
                break;  
        }  
        return 0;  
    }  
    void encipher()  
    {  
        int key;  
        char ch,c;  
        char file_name[50];  
        FILE *infile,*outfile;  
        printf("输入欲加密文件名:");  
        scanf("%s",file_name);  
        printf("输入加密密钥:");  
        scanf("%d",&key);  
        if((infile=fopen(file_name,"r"))==NULL)  
        {  
            printf("Cannot open file!\n");  
            exit(1);  
        }  
        if((outfile=fopen("cipher.txt","w"))==NULL)  
        {  
            printf("Cannot open file!\n");  
            exit(1);  
        }  
        ch=fgetc(infile);  
        while(!feof(infile))  
        {  
            if(ch>=48&&ch<=57)//数字加密  
            {  
                c=((ch-48)+key)%10;  
                fputc((char)(c+48),outfile);  
            }  
            else if(ch>=65&&ch<=90)//大写英文字母加密  
            {  
                c=((ch-65)+key)%26;  
                fputc((char)(c+65),outfile);  
            }  
            else if(ch>=97&&ch<=122)//小写英文字母加密  
            {  
                c=((ch-97)+key)%26;  
                fputc((char)(c+97),outfile);  
            }  
            else  
                fputc(ch,outfile);  
            ch=fgetc(infile);  
        }  
        if(fclose(infile)||fclose(outfile))  
            printf("File cannot close!\n");  
        else  
            printf("加密成功");  
    }  
    void decipher()  
    {  
        int key;  
        char ch,c;  
        FILE *infile,*outfile;  
        printf("输入解密密钥:");  
        scanf("%d",&key);  
        if((infile=fopen("cipher.txt","r"))==NULL)  
        {  
            printf("Cannot open file!\n");  
            exit(1);  
        }  
        if((outfile=fopen("a.txt","w"))==NULL)  
        {  
            printf("Cannot open file!\n");  
            exit(1);  
        }  
        ch=fgetc(infile);  
        while(!feof(infile))  
        {  
            if(ch>=48&&ch<=57)//数字解密  
            {  
                c=((ch-48)-key+10)%10;//此处+10是防止,c==负数  
                fputc((c+48),outfile);  
            }  
            else if(ch>=65&&ch<=90)//大写英文字母解密  
            {  
                c=((ch-65)-key+26)%26;  
                fputc((char)(c+65),outfile);  
            }  
            else if(ch>=97&&ch<=122)//小写英文字母解密  
            {  
                c=((ch-97)-key+26)%26;  
                fputc((char)(c+97),outfile);  
            }  
            else  
                fputc(ch,outfile);  
            ch=fgetc(infile);  
        }  
        if(fclose(infile)||fclose(outfile))  
            printf("File cannot close!\n");  
        else  
            printf("解密成功");  
    }  

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:一种求离散数学传递闭包的算法java实现

下一篇:DateUtils日期操作Java类