写在前面 做大一年级的导生,碰巧一个同学问了一个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”,结果会是什么呢?
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
用方才得到的加密内容去测试一下,看看解密程序是否工作良好? 看来没什么问题。 那么在这个解密环节里,我们做的最关键的分析是什么呢? 首先,是确定解密映射具有唯一性,即对于一个字符,它的明文必须唯一,这对于所有加解密过程都是通用的(但我们在设计时必须有这样的忧虑); 第二,模数求余的性质非常关键,应用也十分广泛,尤其是在公钥加密中最早的算法几乎都是以“钟算”(模n求余)形式实现的(关于公钥加密的算法分析,以后想起来的话会在博客里跟大家分享和讨论的)。 后话 我记得我的网络软件设计老师说:不是去写程序,而是设计程序;编程到深处,与写文章并无二异。 这句话可能不一定对,却引导我走上了计算机科学学习的道路。万卷归宗,百川到海。我们在不同领域所探索的不同谜题,也许都有着同样的谜底 致谢:感谢你的阅读,风云际会,即是有缘。祝 一路顺风!
|