密码学数千年的发展史,加密与解密不断博弈,在这样一场永远存在的智力追逐中,我也等到了您。[没有永远的胜者]

start 密码学之旅,跳出现有编程的圈子,捧着????,来看看这些故事吧,目前加密对解密各自胜负为 7 胜 : 5 负。

密码学演化过程

【古典加密】

  • 手工加密
  1.    隐藏法
  2.    移位法和替代法
  3.    维尼吉亚加密
  • 机器加密
  1.    恩尼格玛机

 【现代加密】

  • 计算机加密【   数学是工程技术的最大推动力   】
  1.    魔王加密系统
  2.    RSA加密系统
  3.    量子加密

 

  

     加密的原则 :假设敌方已经拥有和自己一样的解密水准,接着在这个基础上制定加密手段,此加密方法要好用,不能一条信息几分钟还没发出去,要求加密解密时间短,成本低。

 

隐藏法:历史上,第一个加密法由希罗多德古希腊历史学家记载。那时,强盛的波斯帝国计划入侵希腊,斯巴达的老国王得证实后,在一块木板上些许这个消息并涂上一层蜡。这块木板躲过沿路士兵的检查,抵达斯巴达。收板人刮了蜡,就发现了下面的密报,于是马上备战。在公元前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 ...

相关文章:

  • 2021-10-13
  • 2021-11-15
  • 2021-12-05
  • 2021-11-19
  • 2021-10-30
  • 2022-02-27
猜你喜欢
  • 2021-11-17
  • 2021-11-19
  • 2021-09-29
  • 2021-04-30
  • 2021-04-22
相关资源
相似解决方案