您的位置:首页 > 编程语言 > C语言/C++

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

2015-10-27 11:14 627 查看
写在前面

做大一年级的导生,碰巧一个同学问了一个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求余)形式实现的(关于公钥加密的算法分析,以后想起来的话会在博客里跟大家分享和讨论的)。

后话

我记得我的网络软件设计老师说:不是去写程序,而是设计程序;编程到深处,与写文章并无二异。

这句话可能不一定对,却引导我走上了计算机科学学习的道路。万卷归宗,百川到海。我们在不同领域所探索的不同谜题,也许都有着同样的谜底

致谢:感谢你的阅读,风云际会,即是有缘。祝 一路顺风!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: