加密与解密:一个简单的C语言示例

写在前面
做大一年级的导生,碰巧一个同学问了一个C语言程序设计的题目。说是怎么都弄不对。我看了看,正好也是三年前我碰到的题目,仿佛还噙着旧日时光的泪痕。特此将题目与我的解法奉上,以祭奠那段逝去的时光。

1.问题是什么?

(1)使用要求的方法加密(容易)
《加密与解密:一个简单的C语言示例》
(2)如何去解密用以上方法加密过的内容(需要一点观察力)

2.加密程序

没什么好说的,直接按部就班来做就可以了,上程序:

#include<stdio.h>
#include<string.h>
char* encode(char code[]);  //Define a function for encoding process

int main() {
    char prim[100],*code;
    printf("Please input the words which needs to be encoded:\t");
    gets(prim);
    code = encode(prim);
    printf("The encoded words are:\t%s\n",code);
    return 0;
}

char* encode(char prim[]) {
    int i,n,len;
    char code[100];
    char temp_char,trans_char;
    int temp_num,trans_num;
    len = strlen(prim);

    for(i = 0;i < len;i++) {
        temp_char = prim[i];                   //Consider about the corresponding number of character
        if (temp_char <= 'z' && temp_char >= 'a')
            temp_num = temp_char - 'a' + 1;
        else if (temp_char <= 'Z' && temp_char >= 'A')
            temp_num = temp_char - 'A' + 27;

        trans_num = temp_num*3 % 52;

        if (trans_num > 26 && trans_num <= 52)         //Transform number to character
            trans_char = 'A' + trans_num - 27;
        else if (trans_num > 0 && trans_num <= 26)
            trans_char = 'a' + trans_num - 1;

        code[i] = trans_char;
    }
    code[len] = '\0';
    return code;
}

简单测试一下:如果输入“iloveu”,结果会是什么呢?
《加密与解密:一个简单的C语言示例》

3.解密程序

不错,加密固然好做,因为它是一种正向的映射过程。我们知道,对于如函数y = f(x) 而言,给定x自变量,y这一因变量也随之改变。但是给定了y,我们能立即知道x取值吗?我们甚至很难说x是唯一的,甚至是存在的。而这一难题,也是解密过程所必须面对的。
好在针对这一简单的问题,解密映射也是唯一的,只不过需要稍稍转个弯子。
好吧,先上程序:

#include<stdio.h>
#include<string.h>
char* decode(char code[]);  //Define a function for decoding process

int main() {
    char *prim,code[100];
    printf("Please input the words which needs to be decoded:\t");
    gets(code);
    prim = decode(code);
    printf("The primitive words are:\t%s\n",prim);
    return 0;
}

char* decode(char code[]) {
    int i,n,len;
    char prim[100];
    char temp_char,trans_char;
    int temp_num,trans_num;
    len = strlen(code);

    for(i = 0;i < len;i++) {
        temp_char = code[i];             //Consider about the corresponding digit of character
        if (temp_char <= 'z' && temp_char >= 'a')
            temp_num = temp_char - 'a' + 1;
        else if (temp_char <= 'Z' && temp_char >= 'A')
            temp_num = temp_char - 'A' + 27;

        n = temp_num % 3;  //Mode 3 and compute primitive number 
        switch(n) {
        case 0:
            trans_num = temp_num/3;
            break;
        case 1:
            trans_num = 35 + temp_num/3;
            break;
        case 2:
            trans_num = 18 + temp_num/3;
            break;
        default:
            break;
        }
           //Transform number to character
        if (trans_num > 26 && trans_num <= 52)       
            trans_char = 'A' + trans_num - 27;
        else if (trans_num > 0 && trans_num <= 26)
            trans_char = 'a' + trans_num - 1;

        prim[i] = trans_char;
    }
    prim[len] = '\0';
    return prim;
}

用方才得到的加密内容去测试一下,看看解密程序是否工作良好?
《加密与解密:一个简单的C语言示例》
看来没什么问题。
那么在这个解密环节里,我们做的最关键的分析是什么呢?
首先,是确定解密映射具有唯一性,即对于一个字符,它的明文必须唯一,这对于所有加解密过程都是通用的(但我们在设计时必须有这样的忧虑);
第二,模数求余的性质非常关键,应用也十分广泛,尤其是在公钥加密中最早的算法几乎都是以“钟算”(模n求余)形式实现的(关于公钥加密的算法分析,以后想起来的话会在博客里跟大家分享和讨论的)。

后话
我记得我的网络软件设计老师说:不是去写程序,而是设计程序;编程到深处,与写文章并无二异。
这句话可能不一定对,却引导我走上了计算机科学学习的道路。万卷归宗,百川到海。我们在不同领域所探索的不同谜题,也许都有着同样的谜底
致谢:感谢你的阅读,风云际会,即是有缘。祝 一路顺风!

    原文作者:维吉尼亚加密问题
    原文地址: https://blog.csdn.net/meditator_hkx/article/details/49445773
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞