《数学之美》之谈谈密码学

《数学之美》之谈谈密码学


声明:以下内容或摘自或总结自吴军老师的《数学之美》,由于所理解能力有限,本文并不对内容的科学性进行考证,但求能够从中略窥知一二,则已经是大有裨益了。而内容的科学性考证还是交给一些领域专家们去做吧,我尽我所能广泛涉猎而已。

原始密码学

两千年前,相传名将凯撒为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表,比如说
此处输入图片的描述
这样,如果不知道密码本,即使截获一段信息也看不懂,比如收到一个的消息是EBKTBP,那么在敌人看来是毫无意义的字,通过密码本解破出来就是 CAESAR 一词,即凯撒的名字。这种编码方法史称凯撒大帝。
以上原始的方法通过统计一下字母频率就可以破解。而如果编码时,一对多,并随机挑选,这样就无法通过统计破解。
好的密码必须做到已知明文和密文的对应推断不出新的密文内容,就是说无法把握从密文到明文的转换规律。


信息论时代的密码学

根据信息论,密码最高的境界是敌方在截获密码时,信息量没有增加。一般来讲,当密码分布均匀并统计独立,提供的信息最少,类似白噪声就最难把握。
以早期著名的RSA算法为例,说明公开密匙的加密过程。

有公匙和私匙之分,一个用于加密,一个用于解密;
两个看似无关的密匙,在数学上是关联的;

RSA算法

  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。

XE mod N=Y

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

YD mod N=X

公开密匙的好处

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

首先声明世界上没有永远破不了的密码,关键是它能有多长时间的有效期,一种加密方法只要保证50年内计算机破解不了就可以满意了。


下面补充一些数学上的知识和段子:
摘自 http://www.cricode.com/1087.html

一个例子

A CHEF HIDE A BED
厨子藏起来了一张床!这是如此的重要,需要立即通知总部。千万重要的是,不能让反革命的厨子知道。

第一步是转码,也就是将英文转换成某个对应的数字。这个对应很容易建立,比如:

A B C D E F G H I
1 2 3 4 5 6 7 8 9
将上面的信息转码,获得下面的数字序列:

A CHEF HIDE A BED

1 3856 8945 1 254
这串数字完全没有什么秘密可言。厨子发现了这串数字之后,很容易根据数字顺序,对应字母表猜出来。


改进

为了和狡猾的厨子斗智斗勇,我们需要对这串数字进一步加密。使用总部发给我们的锁,两个数字:3和10。我们分为两步处理。

第一步是求乘方。第一个数字是3,也就是说,总部指示我们,求上面数字串的3次方:

原字符串: 1 3 8 5 6 8 9 4 5 1 2 5 4

三次乘方: 1 27 512 125 216 512 729 64 125 1 8 125 64

第二步是求余数。第二个上锁的数字是10,将上面每个三次乘方除以10,获得其余数:

余数: 1 7 2 5 6 2 9 4 5 1 8 5 4

将这串数字发回总部。中途被厨子偷看到,但一时不能了解其中的意思。如果还是像刚才一样对应字母表的话,信息是:

AGBEFBIDEAHED

这串字母完全不包含正常的单词。

信息到了总部。总部开始用神奇的钥匙来解读。这个钥匙是3。(偷偷告诉你的,别告诉厨子。)

(这里钥匙不小心和之前锁中的一个数字相同。这只是巧合。)

解锁过程也是两步。第一步求钥匙次的乘方,即3次方。第二步求它们除以10(锁之一)的余数。

加密信息:1 7 2 5 6 2 9 4 5 1 8 5 4

三次乘方:1 343 8 125 216 8 729 64 125 1 512 125 64 (这里用的是钥匙的“3”)

除十得余:1 3 8 5 6 8 9 4 5 1 2 5 4

正是我们发送的信息。对应字母表,总部可以立即知道原来的信息。

特工练习

再次强调,为了演示方便,选用了简单的锁和钥匙。锁和钥匙只是凑巧相同。为此,我们做一个小练习。

练习:总部新公布出来的锁是2987(次乘方)和3937(为除数)。

1) 作为特工,用上面的算法为信息加密(你可能需要一些编程来计算,尝试用Python的数学计算功能?)。

猜到钥匙是什么了呢?不是上面两个数字中的任何一个,而是143!

2) 作为值班人员,验证143是钥匙,可以解密信息。

为了简便,你可以只检验一个简单的信息,比如“IE”。

费马与欧拉

发觉自己被愚弄了,厨子很生气,后果很严重。厨子发奋看了书,知道了这个加密方法叫RSA,是三为发明人 R. Rivest, A. Shamir和L. Adelman名字首字母合起来的。RSA算法是1977年发明的。全称是RSA Public Key System。这个”Public Key”是公共密钥,也就是我们上面说的锁。再读下去,厨子大窘。这个1977年的,现代计算机加密的RSA算法,居然源于17世纪。

  1. 费马小定律

RSA的原理借助了数论中的“欧拉定理”(Euler’s theorem)。17世纪的费马首先给出一个该定理的特殊形式,即“费马小定理”:

p是一个正的质数,a是任意一个不能被p整除的整数。那么,ap11能被p整除。

我们并不需要太深入了解费马小定理,因为等下就会看到这个定理的“升级版”。但这个定理依然很美妙,它优美的得到乘方和整除的某种特殊关系。使用一个例子来说明它。比如p=7,a=3。那么费马小定律表示,3711可以被7整除。

事实上,上面的数字计算得到361=728,它确实可以被7整除。

数学小贴士:

1) 除 (divide),商和余数:两个整数相除,有一个为整数的商,和一个余数。比如10/3=3,余1。我们用一个特别的方式记录这一叙述:

10≡1(mod3)

也可以写成另一种方式:

[10]3=[1]3

这一表述方式与“10除以3,得3余1”这样的方式并没有什么区别。但采用标准的数学方式更容易和别人交流。

如果我们知道:

[a]n=[b]n

那么存在某个整数t,且:

a=nt+b

2) 整除 (divisible):当一个整数a除以另一个整数b,余数为0时,那么我们说a可以被b整除。比如说,4可以被2整除。即

[4]2=[0]2

3) 质数 (prime number):一个质数是只能被±1和这个数自身整除的整数(不包括±1)。比如2,3,5,7,11,13等等。

加密方法是将原来的某种信息按照某个规律打乱。某种打乱的方式就叫做密钥(cipher code)。发出信息的人根据密钥来给信息加密,而接收信息的人利用相同的密钥,来给信息解密。就好像一个带锁的盒子。发送信息的人将信息放到盒子里,用钥匙锁上。而接受信息的人则用相同的钥匙打开。加密和解密用的是同一个密钥,这种加密称为对称加密(symmetric encryption)。

如果一对一的话,那么两人需要交换一个密钥。一对多的话,比如总部和多个特工的通信,依然可以使用同一套密钥。但这种情况下,对手偷到一个密钥的话,就知道所有交流的信息了。二战中盟军的情报战成果,很多都来自于破获这种对称加密的密钥。

对称加密的薄弱之处在于给了太多人的钥匙。如果只给特工锁,而总部保有钥匙,那就容易了。特工将信息用锁锁到盒子里,谁也打不开,除非到总部用唯一的一把钥匙打开。只是这样的话,特工每次出门都要带上许多锁,太容易被识破身份了。总部老大想了想,干脆就把造锁的技术公开了。特工,或者任何其它人,可以就地取材,按照图纸造锁,但无法根据图纸造出钥匙。钥匙只有总部的那一把。

此处输入图片的描述

关键是锁和钥匙工艺不同。知道了锁,并不能知道钥匙。这样,银行可以将“造锁”的方法公布给所有用户。每个用户可以用锁来加密自己的信用卡信息。即使被别人窃听到,也不用担心:只有银行才有钥匙呢!这样一种加密算法叫做非对称加密(asymmetric encryption)。非对称加密的经典算法是RSA算法。它来自于数论与计算机计数的奇妙结合。


2015-9-16 艺少

posted @ 2015-09-17 10:43  ZhangPYi  阅读(906)  评论(0编辑  收藏  举报