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

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

1.问题是什么?

(1)使用要求的方法加密(容易)
加密
(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”,结果会是什么呢?
encode

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

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

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

  • 29
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
某同学在宿舍公用计算机上面使用文本文件来记录每天的心情故事,但是宿舍公用计算机不能设置密码,同学担心自己的日记被偷看,特委托你来完成如下加密程序: 该程序是一个加密数据的日记记录工具,具有如下功能要求: 1. 运行系统后,系统给出三个选项:1)新增日记;2)阅读日记;3)退出系统 2. 选择功能1)后,系统提示用户输入日记文件名称和路径,并创建文本文件;同时,用户输入两个字符a和b,作为密钥;创建文件后,用户开始输入日记内容,日记内容为文本形式,将日记内容加密,然后将加密后的内容写入文件中; 3. 选择功能2)后,系统提示用户输入要打开的日记文件的路径和名称,打开文件后,读取文件中的密文,解密后显示出来; 4. 加密算法推荐大家采用简单的文本加密算法来实现,算法思想如下,从明文读入一个字符(英文),使用密钥a与该字符做异或操作,将结果作为密文保存下来,再读入第二个字符,使用密钥b与该字符做异或操作,同样保存结果,以此类推加密全文;解密过程可将密文作为输入完成整个加密过程,返回就是明文。如果同学们有兴趣加密中文,那么可将中文的高八位使用密钥a加密,低八位使用密钥b加密,完成加密过程。 这个加密算法需要使用C语言的位运算运算符,包括:& 按位与、| 按位或、^ 按位异或、~ 取反、<> 右移。 那么本算法中的异或可用如下方法完成,c为明文中取得的一个字符,该字符加密解密)指令如下: c = plaintext[i]; //i+1是奇数使用密钥a,是偶数采用密钥b cipher[i] = c ^ a; 那么在cipher[i]中保存的就是c的密文。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值