密码学数千年的发展史,加密与解密不断博弈,在这样一场永远存在的智力追逐中,我也等到了您。[没有永远的胜者]
start 密码学之旅,跳出现有编程的圈子,捧着????,来看看这些故事吧,目前加密对解密各自胜负为 7 胜 : 5 负。
密码学演化过程
【古典加密】
- 手工加密
- 隐藏法
- 移位法和替代法
- 维尼吉亚加密
- 机器加密
- 恩尼格玛机
【现代加密】
- 计算机加密【 数学是工程技术的最大推动力 】
- 魔王加密系统
- RSA加密系统
- 量子加密
加密的原则 :假设敌方已经拥有和自己一样的解密水准,接着在这个基础上制定加密手段,此加密方法要好用,不能一条信息几分钟还没发出去,要求加密解密时间短,成本低。
隐藏法:历史上,第一个加密法由希罗多德古希腊历史学家记载。那时,强盛的波斯帝国计划入侵希腊,斯巴达的老国王得证实后,在一块木板上些许这个消息并涂上一层蜡。这块木板躲过沿路士兵的检查,抵达斯巴达。收板人刮了蜡,就发现了下面的密报,于是马上备战。在公元前480年,击毁了波斯200艘战舰,5年的准备毁于一旦。还有许多的隐藏法,这里不一一追溯了,电视剧里很多哦。
解密: 只需要受过专业训练的士兵检查严格,那么类似的隐藏术是毫无用处的,脑动大开的除外。
移位法:古罗马时期, 凯撒加密术。对于信件中的每一个字母,会用 ta 后面的第 n 个字母代替。例如,n = 4 时,"China"加密的规则是用原来字母后面第 4 个字母代替原来的字母,即 "A" => "E", 如此,China => Glmre。
解密: 排列组合[非常麻烦,
种可能, n为代替符号数量] 或 9世纪, 阿拉伯人发明 频率分析法**【概率论的出现】。
凯撒加密术代码实现 : 解决了,加标点符号问题,大小写都是正常输出的 ~
#include <stdio.h> #include <string.h> #include <ctype.h> void EnCesar(char *str, int n); void DeCesar(char *str, int n); const int N = 100000; int main(void) { char str[N] = ""; int n; printf("%s","密文 :> "); gets(str); // scnaf函数遇到空格就停啦 ~ printf("%s","** :> "); scanf("%^[0-9]d",&n); EnCesar(str,n); putchar(10); printf("%s -> %s\n","加密密文",str); DeCesar(str,n); printf("%s -> %s\n","解密密文",str); return 0; } void EnCesar(char *str, int n) { if( !str ) return; for( ; *str; str++ ) { if( isspace(*str) || ispunct(*str) || isdigit(*str) ) // 跳过空格、标点符号、数字 continue; if( isupper(*str) ){ // 'A' ~ 'Z' *str -= 'A'; // 变成 0 ~ 25 *str = (*str+n)%26; // 密文 = (字母 + n) mod 26 *str += 'A'; } if( islower(*str) ){ // 'a' ~ 'z' *str -= 'a'; // 变成 0 ~ 25 *str = (*str+n)%26; // 密文 = (字母 + n) mod 26 *str += 'a'; } } } void DeCesar(char *str, int n) { if( !str ) return; for( ; *str; str++ ) { if( isspace(*str) || ispunct(*str) || isdigit(*str) ) // 跳过空格、标点符号、数字 continue; if( isupper(*str) ){ *str -= 'A'; // 变成 0 ~ 25 *str = (*str-n)%26; // 密文 = (字母 + n) mod 26 *str += 'A'; } if( islower(*str) ){ *str -= 'a'; // 变成 0 ~ 25 *str = (*str-n)%26; // 密文 = (字母 + n) mod 26 *str += 'a'; } } }古典密码最小操作单位都是单个字符或者符号,如凯撒加密术。而现代密码学,把研究对象用数来描述,再对数进行运算。不但突破了,字母作文最小单位对限制,还可以使用更高等的数学工具做运算,因此解密越来越难,但有趣是,解密方所需要的时间越来越少,从4000年的跨度变成1000年现在的频率是几十年甚至更少。
替代法:
我就是讲故事大师,从16世纪的苏格兰女王玛丽一世说起。玛丽一世 27 岁时,被自己的姑姑英格兰女王伊丽莎白一世关押了起来,这一关就是 18 年。到 ta 44 岁时,监狱里的她和外界反叛军密谋要杀害姑姑,一旦谋杀成功,ta 自己就能登上王位。当时传信件是由侍女在递红酒时,藏在瓶塞中带进去的。玛丽很聪明,包含暗杀计划的并不是普通的信,而是加密过的。用的加密法便是替代法。所有英文字母被类似符文的东西替换,一些常用词也用符号代替。代替方式,如下图。
如果没对照图,您也不能看懂,是吗 ~ 玛丽此后就用这个加密方式与反叛军
(我觉得谁输了,谁就是叛军),一段时间后,玛丽熟练掌握了,也不用一一对比来写。这体现对加密的要求,不复杂实用。 可惜,这个传信的人是双面间谍,这些情况伊丽莎白全部知晓了。在位的女王正愁拿玛丽没办法,现在终于可以言正名顺的处死玛丽了。不过现在还急不得,必学抓到足够硬的证据,而且最好把整个阴谋背后所有参与者一起除掉。此后,玛丽和外界的通信,每一封都先经过双面间谍送到密码学校,花一定时间誊写好,接着密封好递出王宫。
那么,密码学校成功了吗?? 这么难的密码呀 ?
解密 :ta的**方法是 频率分析,由9世纪的阿拉伯产出,直至16世纪才被欧洲数学家注意到。
原理,英文中字母出现的频率,是不一样的。比如,字母 e 是出现频率最高的,占 12.7%; 其次是 t,9.1%; 接着是 a, o, i, n 等,最少的是 z,只占 0.1% ,见下图,英语字母频率统计。
另外,其他语言也有详细统计。e.g. 法语、德语、西班牙语、葡萄牙语、世界语 ...
玛丽和外界用密文往来很多,字符总量足够多,收集到一起,统计哪个符号出现的比例最高,那个字符大概就是字母 e。 也会有,字母出现的频率极为接近,如 h、r、s,分别是 6.09%、5.98%、6.32%。但只需要留意字母前后关联,便可区分开了。e.g. 字母 t 几乎不可能出现在 字母 b、d、g、j、k、m、q 左右,而 字母 h 和 字母 e 经常连在一起, ee 一起出现的频率远大于 aa 一起出现的频率,如此等等。
频率分析法的实质,便是大幅度减低字母排列组合的可能性,上面的条件如同中学的排列组合题。把 种可能减少为线性,有的减为只有 1、2 、3 可能,均摊下了依然是线性。这样一来,即使第一步的统计各种符号出现的频率时并不完全确定,但只要第二步,以拼写规律筛选一下,代替符号对应但真实字母就可以找出来。
在审讯过程里,尽管玛丽始终不承认谋反,但证人和密码学专家一起向公众展示密文和原文,并告之解密规则,最后故事完了。想知道玛丽但结局,还不如和我讨论一下这个程序怎么实现呐 ~ 这解密赢了加密,不过很快又有了新的加密法来针对频率分析,ta 叫同音替代法。
同音替代法:史上最有名的采用同音替代法的密码,是法国国王路易十三、十四时期的 "Grand Chiffre"。ta使用40多年,随着拿破仑的倒台突然失传。直至1890年,才被完整的**,**方法就是从单词拼读规律入手的。这套加密法用了 587 种数字,来表示不同的发音。其中包含大量陷阱,如,一些数字只代表字母,不代表发音;很多数字只为干扰字符,ta们没有意义;还有一些数字即不是发音又不是字符,而是代表删除前一个字符。 666
解密:为了更好的说明,我举一个具体的例子哈。字母 a 可以用 11、23、41 仨个数字代替,这三个数字翻译过来都是 a ,越常常用的字母,如上文说的 字母e ,就用越多的符号代替它。这种想法的目标,就是让每个数字出现的频率大致相同,频率特征没有了,密码就不容易被**。具体,见下图。
怎么** ?
思考 3 min...
怎么** ?
我们聊一聊数学,您看懂了就发现解密很大程度不就是数学的概率论嘛。当年,概率论的诞生,正是一个赌徒数学家 Girolomo Gardano 研究概率出现的,著有《论赌徒的游戏》,ta也是三元方程一般解法的发现者,更是导致玛丽悲剧结果的发动机。
数学的发展,有俩个高峰。
- 一个是公元前 500 年到 公元前 300 年,之后一直下划到公元 500 年跌到谷底。
- 1000年后,玛丽女王的时代,才超越古希腊巅峰时期的水平,到现在也还没出现最高值
怎么** ?
其中的一种方法是,通过字母的前后顺序关系枚举瞎猜。e.g. 字母q 后面出现最大可能是 字母u,而字母q又是一个不常用的字母,有很大概率猜中。其 ta 字母猜出来的难度大一些,但只要肯花时间,总能**出来。
更新ing ...