数学之美系列二十二 由电视剧“暗算”所想到的 — 谈谈密码学的数学原理

本文主要是介绍数学之美系列二十二 由电视剧“暗算”所想到的 — 谈谈密码学的数学原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前一阵子看了电视剧“暗算”,蛮喜欢它的构思和里面的表演。其中有一个故事提到了密码学,故事本身不错,但是有点故弄玄虚。不过有一点是对的,就是当今的密码学是以数学为基础的。(没有看过暗算的读者可以看一下介绍, http://ent.sina.com.cn/v/2005-10-17/ba866985.shtml
因为我们后面要多次提到这部电视剧。)

密码学的历史大致可以推早到两千年前,相传名将凯撒为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表,比如说
    


这样,如果不知道密码本,即使截获一段信息也看不懂,比如收到一个的消息是 EBKTBP,那么在敌人看来是毫无意义的字,通过密码本解破出来就是 CAESAR 一词,即凯撒的名字。这种编码方法史称凯撒大帝。当然,学过信息论的人都知道,只要多截获一些情报,统计一下字母的频率,就可以解破出这种密码。柯蓝道尔在他的“福尔摩斯探案集”中“跳舞的小人”的故事里已经介绍了这种小技巧。在很长时间里,人们试图找到一些好的编码方法使得解密者无法从密码中统计出明码的统计信息,但是,基本上靠经验。

香农提出信息论后,为密码学的发展带来了新气象。根据信息论,密码的最高境界是使得敌人在截获密码后,对我方的所知没有任何增加,用信息论的专业术语讲,就是信息量没有增加。一般来讲,当密码之间分布均匀并且统计独立时,提供的信息最少。均匀分布使得敌人无从统计,而统计独立能保证敌人即使看到一段密码和明码后,不能破译另一段密码。在“暗算”里传统的破译员老陈破译的一份密报后,但无法推广的原因,而数学家黄依依预见到了这个结果,因为她知道敌人新的密码系统编出的密文是统计独立的。有了信息论后,密码的设计就有了理论基础,现在通用的公开密钥的方法,包括“暗算”里的“光复一号”密码,就是基于这个理论。

公开密钥的原理其实很简单,我们以给上面的单词 Caesar 加解密来说明它的原理。我们先把它变成一组数,比如它的 Ascii 代码 X=099097101115097114(每三位代表一个字母)做明码。现在我们来设计一个密码系统,对这个明码加密。

1,找两个很大的素数(质数)P 和 Q,越大越好,比如 100 位长的, 然后计算它们的乘积 N=P×Q,M=(P-1)×(Q-1)。

2,找一个和 M 互素的整数 E,也就是说 M 和 E 除了 1 以外没有公约数。

3,找一个整数 D,使得 E×D 除以 M 余 1,即 E×D mod M = 1。

现在,世界上先进的、最常用的密码系统就设计好了,其中 E 是公钥谁都可以用来加密,D 是私钥用于解密,一定要自己保存好。乘积 N 是公开的,即使敌人知道了也没关系。

现在,我们用下面的公式对 X 加密,得到密码 Y。
    


好了,现在没有密钥 D,神仙也无法从 Y 中恢复 X。如果知道 D,根据费尔马小定理,则只要按下面的公式就可以轻而易举地从 Y 中得到 X。
    


这个过程大致可以概况如下: 
    
点击查看原图


公开密钥的好处有:

1.简单。

2.可靠。公开密钥方法保证产生的密文是统计独立而分布均匀的。也就是说,不论给出多少份明文和对应的密文,也无法根据已知的明文和密文的对应来破译下一份密文。更重要的是 N,E 可以公开给任何人加密用,但是只有掌握密钥 D 的人才可以解密, 即使加密者自己也是无法解密的。这样,即使加密者被抓住叛变了,整套密码系统仍然是安全的。(而凯撒大帝的加密方法有一个知道密码本的人泄密,整个密码系统就公开了。)

3.灵活,可以产生很多的公开密钥E和私钥D的组合给不同的加密者。

最后让我们看看破解这种密码的难度。首先,要声明,世界上没有永远破不了的密码,关键是它能有多长时间的有效期。要破公开密钥的加密方式,至今的研究结果表明最好的办法还是对大字 N 进行因数分解,即通过 N 反过来找到 P 和 Q,这样密码就被破了。而找 P 和 Q 目前只有用计算机把所有的数字试一遍这种笨办法。这实际上是在拼计算机的速度,这也就是为什么 P 和 Q 都需要非常大。一种加密方法只有保证 50 年计算机破不了也就可以满意了。前几年破解的 RSA-158 密码是这样因数分解的

39505874583265144526419767800614481996020776460304936454139376051579355626529450683609727842468219535093544305870490251995655335710209799226484977949442955603
= 3388495837466721394368393204672181522815830368604993048084925840555281177 ×11658823406671259903148376558383270818131012258146392600439520994131344334162924536139

现在,让我们回到“暗算”中,黄依依第一次找的结果经过一系列计算发现无法归零,也就是说除不尽,我猜她可能试图将一个大数 N 做分解,没成功。第二次计算的结果是归零了,说明她找到的 N=P×Q 的分解方法。当然,这件事能不能用算盘完成,我就不知道了,但我觉得比较夸张。另外我对该电视剧还有一个搞不懂的问题就是里面提到的“光复一号”密码的误差问题。一个密码是不能有误差的,否则就是有的密钥也无法解码了。我想可能是指在构造密码时,P 和 Q 之一没找对,其中一个(甚至两个都)不小心找成了合数,这时密码的保密性就差了很多。如果谁知道电视剧里面讲的“误差”是指什么请告诉我。另外,电视剧里提到冯?诺依曼,说他是现代密码学的祖宗,我想是弄错了,应该是香农。冯?诺依曼的贡献在发明计算机和提出博弈论(game theory)。

不管怎么样,我们今天用的所谓最可靠的加密方法的数学原理其实就这么简单,一点也不神秘,无非是找几个大素数做一些乘除和乘方运算就可以了。
 

这篇关于数学之美系列二十二 由电视剧“暗算”所想到的 — 谈谈密码学的数学原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828768

相关文章

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

uva 11044 Searching for Nessy(小学数学)

题意是给出一个n*m的格子,求出里面有多少个不重合的九宫格。 (rows / 3) * (columns / 3) K.o 代码: #include <stdio.h>int main(){int ncase;scanf("%d", &ncase);while (ncase--){int rows, columns;scanf("%d%d", &rows, &col

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训