加密与解密:一个简单的C语言示例
2015-10-27 11:14
627 查看
写在前面
做大一年级的导生,碰巧一个同学问了一个C语言程序设计的题目。说是怎么都弄不对。我看了看,正好也是三年前我碰到的题目,仿佛还噙着旧日时光的泪痕。特此将题目与我的解法奉上,以祭奠那段逝去的时光。
(2)如何去解密用以上方法加密过的内容(需要一点观察力)
简单测试一下:如果输入“iloveu”,结果会是什么呢?
好在针对这一简单的问题,解密映射也是唯一的,只不过需要稍稍转个弯子。
好吧,先上程序:
用方才得到的加密内容去测试一下,看看解密程序是否工作良好?
看来没什么问题。
那么在这个解密环节里,我们做的最关键的分析是什么呢?
首先,是确定解密映射具有唯一性,即对于一个字符,它的明文必须唯一,这对于所有加解密过程都是通用的(但我们在设计时必须有这样的忧虑);
第二,模数求余的性质非常关键,应用也十分广泛,尤其是在公钥加密中最早的算法几乎都是以“钟算”(模n求余)形式实现的(关于公钥加密的算法分析,以后想起来的话会在博客里跟大家分享和讨论的)。
后话
我记得我的网络软件设计老师说:不是去写程序,而是设计程序;编程到深处,与写文章并无二异。
这句话可能不一定对,却引导我走上了计算机科学学习的道路。万卷归宗,百川到海。我们在不同领域所探索的不同谜题,也许都有着同样的谜底
致谢:感谢你的阅读,风云际会,即是有缘。祝 一路顺风!
做大一年级的导生,碰巧一个同学问了一个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”,结果会是什么呢?
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; }
用方才得到的加密内容去测试一下,看看解密程序是否工作良好?
看来没什么问题。
那么在这个解密环节里,我们做的最关键的分析是什么呢?
首先,是确定解密映射具有唯一性,即对于一个字符,它的明文必须唯一,这对于所有加解密过程都是通用的(但我们在设计时必须有这样的忧虑);
第二,模数求余的性质非常关键,应用也十分广泛,尤其是在公钥加密中最早的算法几乎都是以“钟算”(模n求余)形式实现的(关于公钥加密的算法分析,以后想起来的话会在博客里跟大家分享和讨论的)。
后话
我记得我的网络软件设计老师说:不是去写程序,而是设计程序;编程到深处,与写文章并无二异。
这句话可能不一定对,却引导我走上了计算机科学学习的道路。万卷归宗,百川到海。我们在不同领域所探索的不同谜题,也许都有着同样的谜底
致谢:感谢你的阅读,风云际会,即是有缘。祝 一路顺风!
相关文章推荐
- 经验积累之C语言与汇编语言的区别
- FIR IIR 数字滤波器 C++实现
- C++中的extern "C" {}
- C++ string数据类型的实现
- CCPC - k题(dp)
- C语言中常用的几个关键字 const 和 static 和 extern
- C语法_指针
- C++类的设计与实现规范
- C++类的设计与实现规范
- C语法_回调函数
- C++ Primer 掌握得不好的部分或跳过的部分
- 插入排序C++实现
- C++指针和数组:二级指针和二维数组
- c++虚函数,虚继承 详解
- C++前置声明
- 设计模式之策略模式
- leetcode 274 : H-Index
- 【简单易懂】c++中组合与聚合
- C++ STL 总结
- 打鱼还是晒网C++