分享

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

 晚鸣愚者 2017-04-01

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

1.问题是什么?

(1)使用要求的方法加密(容易)
加密
(2)如何去解密用以上方法加密过的内容(需要一点观察力)

2.加密程序

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

#include#includechar* encode(char code[]); //Define a function for encoding processint 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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

简单测试一下:如果输入“iloveu”,结果会是什么呢?
encode

3.解密程序

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

#include#includechar* decode(char code[]); //Define a function for decoding processint 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;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

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

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多