密码的故事
你有几个密码?想必有很多个。
解锁手机、打开电脑需要密码;用手机支付、转账也需要密码;想放松一下,登QQ、刷微信、玩抖音也需要密码……忘记密码,我们的手机会变成“砖头”!
那么,你知道密码究竟是怎么来的吗?
密码有着悠久的历史,几乎与文字一样悠久。在古代,无论是帝王还是将军,在管理国家或者指挥军队的过程中,都想有个保密的、安全的通信系统。因为一旦自己的重要消息落入敌人之手,就会惨遭灭顶之灾。
在近现代战争中,密码得到了更广泛的应用:传递情报、指挥战争,甚至进行外交斗争。在和平时期,间谍、黑客也会使用密码来传递信息。
在信息时代,密码技术发展更加迅速,它不再局限于军事、外交领域,而是更广泛地应用在社会和经济活动中。
本期,我们就来讲述密码的故事。
密码与数学的关系十分密切。自古以来,先有数学,然后才有密码。人类遵循数学的逻辑规律,发明出各种密码,并将其延伸为一门学科——密码学。
为了更好地讲清楚密码学,我们先来讲一个故事。
小男孩阿呆和小女孩阿美是好朋友,由于父母工作调动,他们分开了,平时只能在QQ上聊天。可令他们头疼的是,阿呆的哥哥阿聪总是偷看阿呆和阿美的聊天记录。
于是,阿呆和阿美决定使用一种阿聪看不懂的“特定代码”来聊天!具体操作是,阿呆写好一句话,然后找来《现代汉语词典(第7版)》,把这句话中的每个字在词典中对应的页码数和本页的第几个条目记录下来,通过QQ发送出去。阿美看到这串数字后,对照《现代汉语词典(第7版)》,把数字转换成文字,就能成功地读取阿呆发给她的消息。而阿聪偷看阿呆和阿美的QQ聊天记录,就只能看到一串数字,根本看不懂两人的聊天内容啦!
故事讲到这里,密码学里最重要的概念都已经呈现,分别是——
小男孩阿呆:加密方、发送方
小女孩阿美:解密方、接收方
阿聪:非法接收方
阿呆给阿美发送的信息原文:明文
根据《现代汉语词典(第7版)》写出的一串数字:密文
阿聪收到信息:截获
阿呆将信息变为数字:加密
阿美读信:解密
《现代汉语词典(第7版)》:密钥
阿呆和阿美事先约定好的加密/解密规则:加密/解密算法
如此一来,前面讲述的故事,就可以用密码术语重新改写成一句“冷冰冰”的话:发送方(阿呆)使用密钥(《现代汉语词典(第7版)》),对明文进行加密或密码编码,发送后遭到非法接收方(阿聪)的截获,但非法接收方破译密码失败,而接收方(阿美)成功解密。由此,我们可以总结出密码学里的一些专业术语。
密码术语表密码术语表
从几千年前到第二次世界大战结束,密码系统并无原理层面上的本质突破,这一时期的密码常被称为古典密码学。在古典密码学早期,密码体系主要包括明文、加密、密文、解密这4个基本要素。此时,因为数学还不够发达,人们只能用简单的办法把想要传递的消息隐藏起来。
古典密码学发展一段时间后,加密算法、解密算法和密钥的概念出现了。加密算法、解密算法是用数学语言对各种加密、解密手段的归纳和总结。人们发现,我们不用更改加密算法和解密算法,只更改密钥,就可以得到不同的密文。例如在前面所讲的故事里,加密算法不变,把《现代汉语词典(第7版)》更换成其他书,如《新华字典》《红楼梦》等,得到的密文必然不同,别人很难破解。
在古典密码学阶段,主要有两类基本加密方法:
替换密码是将明文中的文字(或字母)替换成另外一种文字、字母、数字或符号,接收者要对密文做反向替换才能还原出明文。
换位密码即明文保持不变,但打乱字符的顺序,接收者可以用某种方式还原出正确的顺序。
这两种加密方式比较简单,在现在看来,这些技术已无安全可言了,但是其设计思想对于理解、设计及分析现代密码学十分有益。
经过第一次世界大战和第二次世界大战的战争刺激,密码学在理论和技术上都有了长足的进步。
在古典密码学阶段,人们基本采用手工或机械方式对明文进行加密、对密文进行解密;第二次世界大战结束时,计算机被发明出来了!
人们发现,具有强大计算能力的计算机对破解密码具有极其重要的作用,如果掌握了一个密码系统的数学结构缺陷,就能降低破解所需要的计算量。
在计算机看来,古典密码学可谓漏洞百出。关于密码学,人们达成了以下两点共识:
1.对发明加密方法的人来说,密码系统必须变得更复杂一些,使得破解所需计算量超过计算机的运行速度。
2.对想要破解密码的人来说,则要从数学角度寻找加密算法的缺陷,降低计算量,使得这个密码能用计算机进行破解。
为了抵抗计算机对密码的攻击,又因为数学的进步,1976年,一种被称为“公钥密码学”的加密方式出现了。公钥密码学与几千年来的所有密码有着本质区别!
怎么理解呢?我们知道,在古典密码学阶段,加密密钥和解密密钥完全相同,如果阿呆用《现代汉语词典(第7版)》对信息进行加密,阿美就必须用《现代汉语词典(第7版)》进行解密,换其他任何一本书都不行;在公钥密码学里,加密密钥和解密密钥是不同的,这就好比阿呆用《现代汉语词典(第7版)》对信息进行加密,阿美用另外一本截然不同的书进行解密!这样的话,即便阿聪从阿呆那里窃取了“加密密钥是《现代汉语词典(第7版)》”这一关键信息,但阿聪却不知道阿美用什么书来解密。因此,阿聪依然无法破译密文。
到了20世纪90年代,逐步出现椭圆曲线等其他公钥算法。在这一阶段提出的公钥加密算法,使加密时无需在发送方和接收方之间传输密钥,从而进一步提高了加密数据的安全性,具有非常大的经济价值和现实意义。例如,某个掌握公司加密系统秘密的员工离开了公司,公司只需要更换密钥即可保证系统的安全,而无须修改加密算法和系统,这显著提高了工作效率,降低了系统维护的成本。
可以这么说,公钥密码学是信息社会的根基,是密码学历史上的一次革命。
无论是在中国或其他国家,密码学最早的应用都是在军事领域。早期的军事密码虽然简单,但其设计巧妙,还是令现在的人惊叹赞许。
《六韬》,是中国先秦时期的著名军事著作,最早明确收录此书的是《隋书》,题为“周文王师姜望撰”。姜望即姜太公,也就是《封神演义》的主角姜子牙。
不过,在长达一千多年的时光里,《六韬》一直被人怀疑是伪书。直到1972年,在山东临沂银雀山的一座西汉时期的墓地里,出土了大批竹简。用这些竹简和现存的《六韬》一对照,人们发现其中的内容基本一样。这批竹简的出土,证实了在西汉时期,《六韬》就已经很流行,关于《六韬》是伪书的说法,也就不攻自破了。现在同学们去山东的银雀山汉墓竹简博物馆参观,就可以看到这批竹简啦。
银雀山汉墓竹简博物馆
对汉墓出土的竹简鉴定后,人们断定,《六韬》是春秋战国时期的典籍。全书有6卷,共60篇,是以问答形式写的书。书中的内容十分广泛,几乎涉及了和战争相关的方方面面的问题。这本书中介绍了中国最古老的密码——阴符和阴书。
《六韬》,分为6个篇章,分别是《文韬》《武韬》《龙韬》《虎韬》《豹韬》和《犬韬》。阴符的内容在《龙韬》篇里。我们来看看《六韬》里是怎么介绍阴符的。
武王问太公曰:“引兵深入诸侯之地,三军卒有缓急,或利或害。吾将以近通远,从中应外,以给三军之用,为之奈何?”
太公曰:“主与将有阴符。凡八等:有大胜克敌之符,长一尺;破军擒将之符,长九寸;降城得邑之符,长八寸;却敌报远之符,长七寸;警众坚守之符,长六寸;请粮益兵之符,长五寸;败军亡将之符,长四寸;失利亡士之符,长三寸。诸奉使行符,稽留者,若符事泄,闻者告者皆诛之。八符者,主、将秘闻,所以阴通、言语不泄、中外相知之术。敌虽圣智,莫之能识。”
武王曰:“善哉!”
——《六韬·龙韬》
接下来,我们将这段文言文翻译成白话文,方便大家理解。
武王问太公说:“率领军队深入到敌国境内,三军突然遭遇紧急情况,战事可能顺利也可能失利。我想联络远处,以国内策应国外,供给三军的需求,应当怎么办?”
太公答道:“君主与主将之间使用秘密的阴符联系。阴符共分为八种:代表我军大获全胜、攻克敌军的阴符,长度为一尺;代表攻破敌军、擒杀敌将的阴符,长度为九寸;代表敌军投降、占领敌人城邑的阴符,长度为八寸;代表击退敌人、报告战况的阴符,长度为七寸;代表誓师率众坚守的阴符,长度为六寸;代表请求补给粮草、增加兵力的阴符,长度为五寸;代表军队失败、将领阵亡的阴符,长度为四寸;代表战斗失利、士卒伤亡大的阴符,长度为三寸。凡是奉命传递阴符的,如果延误时限,泄露机密,听到和传告机密的,都一律处死。这八种阴符,由君主和将帅秘密掌握。这是一种暗中传递消息而不泄露朝廷和战场机密的通信手段。这样,即使敌人有十分高深的智慧,也无法识破它的奥秘。”
武王说:“很好!”
阴符的使用可以增加军情传递的安全性,因为8种长度的阴符和8种军情消息有许多种排列组合方式。1尺长的阴符可以对应8种军情的任意一种;9寸长的阴符可以对应余下的7种军情(有1种已经被1尺长的阴符代替)的任意一种;8寸长的阴符可以对应余下的6种军情的任意一种……总数是:8×7×6×5×4×3×2×1=40320。数万种排列组合方式,敌人很难猜到不同长度的阴符代表着什么军情了!
君主和将军约定
前方交战
传递阴符
解读阴符
阴符属于前文提到的替换密码。军情就是消息明文,阴符就是密文,事先约定好的阴符的长度与军情之间的关系就是加密方法和解密方法。
阴符只能传递8种类型的信息,还是太少了,想要传达更多的信息应该怎么办?武王也就这个问题询问了姜子牙。
武王问太公曰:“引兵深入诸侯之地,主、将欲合兵,行无穷之变,图不测之利,其事烦多,符不能明,相去辽远,言语不通,为之奈何?”
太公曰:“诸有阴事大虑,当用书不用符。主以书遗将,将以书问主,皆‘一合而再离,三发而一知’。‘再离’者,分书为三部;‘三发而一知’者,言三人,人操一分,相参而不相知情也,此谓阴书。敌虽圣智,莫之能识。”
武王曰:“善哉!”
——《六韬·龙韬》
我们将这段文言文翻译成白话文,同学们可以更好地体会其中的意思。
武王问太公说:“率领军队深入敌国境内,君主和将领想要集结兵力,根据敌情施行灵活的机变,谋求出其不意的胜利。但要沟通的事情繁杂,用阴符难以说明,彼此相距又十分遥远,信息不便传递。在这种情况下该怎么办?”
太公回答道:“凡是密谋大计,都应用阴书,而不用阴符。君主用阴书向将领传达指示,将领用阴书向君主请示问题,这种阴书都是‘一合而再离,三发而一知’。所谓‘再离’,就是把一封完整的书信切割两刀,分为三个部分;所谓‘三发而一知’,就是分派三个人送信,每人持有其中的一部分,每人只知三分之一,即使送信的人也不知道书信的全部内容,这就叫阴书。这样,无论敌人怎样聪明,也不能识破阴书中的秘密。”
武王说:“很好!”
这种加密法和中国古人的记事材料有关。在造纸术发明之前,古人记事主要是用的竹简和木简。
湖南里耶出土的里耶木简,写着九九乘法表
银雀山汉墓出土的《孙膑兵法》
阴书的使用方法是“一合而再离,三发而一知”,即把一份完整的军事文书写在一块竹简(或木简)上。再用刀割两下,将之裁成3份;派3个通信员分别持这3块竹简(或木简)分别出发,到达目的地后,再将3块竹简(或木简)合而为一,就能知道原意。送信途中即使其中一人被敌人抓到了,也不致泄密。阴书比起阴符来,又进了一步,可以传递更多信息了。
在木简上书写军情
将木简切成三份
派三人传递军情
君主看到完整的木简
在阴书的传递过程中,军情消息就是明文,将之裁成3份就是加密,将这3份重新拼起来就是解密。显然,君主需要掌握这3份竹简才能正确解读军情消息。这种加密方式属于换位加密。
我们可以看出,阴符和阴书这类密码是对信息加密从而起到保护明文的作用。实际上,密码还被用于认证领域。至少在战国时代,密码学就已经分为两个领域,一个是保密,一个是认证。
那么,如何用密码来认证?答案是——虎符。
★虎符的故事
虎符,指古代传达命令或调兵遣将所用的凭证,通常是用青铜或黄金做成的虎状令牌,分为两半,右半符留在君主身边,左半符发给统兵大将,君主给军队下达命令时需要派人持右半符前往军中,与大将手中的左半符相配,命令才能生效。下面,我们通过一则历史故事来理解。
侯生乃屏人间语,曰:“嬴闻晋鄙之兵符常在王卧内,而如姬最幸,出入王卧内,力能窃之。嬴闻如姬父为人所杀,如姬资之三年,自王以下,欲求报其父仇,莫能得。如姬为公子泣,公子使客斩其仇头,敬进如姬。如姬之欲为公子死,无所辞,顾未有路耳。公子诚一开口请如姬,如姬必许诺,则得虎符夺晋鄙军,北救赵而西却秦,此五霸之伐也。”公子从其计,请如姬。如姬果盗兵符与公子。
——《史记·魏公子列传》
这段文言文理解起来有一定难度,我们将这段话翻译成白话文。
侯生屏退众人,悄悄地说道:“我听说晋鄙的兵符常放在魏王的卧室里。如姬最受宠爱,经常出入魏王的卧室,她有办法能够偷到它。我听说如姬的父亲被人杀了,如姬悬赏请人报仇有三年了,从魏王以下,都想替她报杀父之仇,但没有人能够做到。如姬对公子(信陵君)哭诉,公子派门客斩下她仇人的头,恭敬地献给如姬。如姬愿意为公子效力,也不会推辞,只是没有机会罢了。公子果真开口请求如姬,如姬一定答应,那就可以得到兵符,夺取晋鄙的军队,北边救援赵国,西边打退秦国,这是五霸那样的功业啊。”公子依从他的计策,去请求如姬。如姬果然偷出兵符交给公子。
据说,古代新兵入伍第一件事就是要知道虎符长什么样子。因为将士们都极少有机会见到君主,而虎符就被视为君主的象征,见到它就如同见到君主。所以,不管何人拿着虎符,要做什么,士兵们都要绝对地服从此人。有了虎符就能调动大军,因此才有“信陵君窃符救赵”的故事。现代汉语中的“符合”一词也来源于此。
★杜虎符
现存于世的虎符只有3个:秦阳陵虎符、杜虎符和新都虎符。杜虎符1975年在陕西省西安北沉村出土,现藏陕西历史博物馆。这个杜虎符背面有槽,颈上有一小孔。虎符上有错金铭文9行共40字,字体为小篆:
兵甲之符。右才(在)君,左在杜。凡兴士被甲,用兵五十人以上,必会君符,乃敢行之。燔燧之事,虽母(毋)会符,行殹(也)。
这段文言文的意思是:
右半符掌握在国君手中,左半符在杜地军事长官手中,凡要调动50人以上的带甲士兵,杜地的左符就要与君王的右符相合,才能行动。但遇上烽火报警的紧急情况,则不需要君王的右符。
战国时代,战争频繁,军情紧急,稍有闪失就可能丢城失地。更何况山高水远,没有现代通信手段,君主就靠虎符传达军令。那么,虎符到底是怎么实现认证功能的呢?
1.虎符通常设计成小巧、隐匿的造型,内部还有独特的卯榫结构,两半虎符拼起来可以完美契合。
2.虎符在制造时,尺寸是严格保密的,每个虎符的大小都不一样,而且在两半虎符的接缝处往往有特殊的文字,这是一种防伪标志(类似现代的骑缝章)。
3.虎符的使用有严格的规定,专符专用,一地一符,绝不可能用一个兵符同时调动两个地方的军队。
★虎符用于身份验证
到了汉代,在兵符上承袭秦制,发兵时除了使用虎符,还需要诏书配合使用;到了隋代,虎符被改为麟符;到了唐代,唐高祖李渊为了避讳(李渊的爷爷叫李虎),将虎符改为鱼符。后来武则天时期把鱼符废掉,改为龟符,不过没多久又改了回去。
唐代的鱼符和龟符:分左右两半,上端有一个“同”字,字形卯榫可相契合。有些鱼符还在底侧中缝加刻“合同”两个字,分开后两半都只有半个字,合在一起就完整了,用来验证身份。今日仍沿用的“合同”一词就源于此。
唐代鱼符分为3类,有用来调兵遣将的鱼符,有用来验证官员身份的随身鱼符,还有用于出入宫门、开关宫门的交鱼符、巡鱼符。鱼符几乎都是铜制的,外形是一条鱼,分为左右两部分,左半部分留在京师,右半部分留在地方。如果有新官上任,需携带左半部分“鱼符”,地方上拿右半部分。两半鱼符完美地合在一起后,才能证明这位新来的官员不是冒牌货。然后,新官与旧官完成交接。
不论是虎符还是龟符、鱼符,都是用来验证身份的,和当代密码学的认证原理一模一样。比如我们每次打开手机时要输入密码(或指纹),这个流程是怎样的?
首先,拿到新手机时,会要求我们输入6位数解锁密码(或录入指纹),手机就会保存下来,生成一个认证符;下次我们想用手机的时候,输入密码(或指纹)解锁,手机就会调用认证算法,对我们输入的信息进行处理,生成一个新的认证符,新的认证符会和所存的认证符进行一一比对,如果比对成功,那么认证通过,我们就可以使用手机了。
也就是说,给手机设置一个密码,相当于铸造了虎符的左边;当你使用手机的时候,你得输入密码登录,这就是虎符的右边。这俩能合上,手机就可以使用了。
先秦时期,我国已经发明阴符、阴书、虎符等密码,实际上,密码学在西方出现得也比较早,最早可以追溯到古希腊时期。
公元前400年左右,斯巴达人发明了一种加密方法,名叫“天书”(英文写作“skytale”)。
★天书的原理
天书是这样加密的:发信人和收信人各持有直径相同的圆木棍,把羊皮纸条斜着缠绕在木棍上,绕的时候纸条要倾斜一定角度。随后,发信人把明文从左至右写在羊皮纸条上。写好后抽走木棍,“纸条”上的字母就会断开,看不出每个完整的单词了。
★天书的使用
外人较难想到用木棍来恢复原文,即使想到了,但随便选择的木棍直径跟原用木棍很难一模一样,也不容易完全看出原字母是如何排列的。而收信人因为有跟发信人同样直径的木棍,把纸条缠在木棍上就能看出信的内容来了。如下面这个例子,假设该木棍可写下3行单词(为直观显示,均写在了同一面),则明文“TONIGHT RETREAT(今晚撤退)”在展开后的羊皮纸带上显示为无意义的“THROTENRAIETGT”。
天书是世界上最早的手工构造的转置式密码,和我国的阴书原理相同,发明时间相近,两者可算得上是中西方古代密码学的雏形。
棋盘加密法是公元前2世纪前后由希腊作家波利比奥斯提出来的,在当时得到了广泛的应用。
★棋盘加密的原理
棋盘密码是将希腊字母加密成两位整数来达到目的。希腊字母一共有24个,分别是:Α、Β、Γ、Δ、Ε、Ζ、Η、Θ、Ι、Κ、Λ、Μ、Ν、Ξ、Ο、∏、Ρ、∑、Τ、Υ、Φ、Χ、Ψ、Ω,恰好可以放到一个5×5的棋盘里去(空出一个小方格),如图1所示。
需要注意的是,24个希腊字母在这个5×5的棋盘里是随机放置的。在确定字母排列结果的基础上,每一个字母都会对应一个整数ab,其中a是该字母所在行的标号,b是该字母所在列的标号。通过这个5×5的棋盘就可以对希腊字母进行加密,如Λ对应31,Σ对应43。
希腊字母同学们没有学过,有些陌生,接下来,我们再以英文字母为例来说明。同样地,将26个英文字母随机放置在5×5的棋盘中,字母I和J被放在同一个方格中(将字母I和J放在同一个方格的原因是“J”是一个低出现频率字母,在日常写作中很少出现,可用“I”来替代而不影响文字的可读性)。
在给定了字母排列结果的基础上,每一个字母都会对应一个整数
图1
图2
★棋盘密码的破译
在一开始,人们很难破译经过棋盘加密的密文。想想看,将25个英文字母(将字母I和J看成一个字母)随机地放在5×5的棋盘,有多少种方法?
从第一格开始放25个英文字母,那么,第一个格子有25种放法,第二个格子有24种,第三个格子有23种……总共有25×24×23×…×2×1种方法,可以写作:
25!=25×24×23×…×2×1
上面式子里的“!”不是感叹号,而是数学中的阶乘符号。设n是自然数,符号“n!”读作“n的阶乘”,表示不超过n的所有正整数的连乘积,如:
3!=3×2×1
5!=5×4×3×2×1
25!是个很庞大的数字,想要暴力破解棋盘密码几乎是不可能的。然而,人们很快发现,棋盘密码的加密机制决定了密文中的整数和明文中的英文字母具有相同的出现频率。26个英文字母的出现频率并不一样——只要密文的样本量足够大,就可以通过频率分析法找出每个数字对应哪个字母,从而破解密文。
在公元前50年左右写就的《高卢战记》里,也有描述凯撒大帝使用加密系统来保护重要军情的故事,即所谓的“凯撒密码”。
★凯撒密码的原理
凯撒是怎么做的呢?他的基本思想是:将字母在字母表中的位置移动一定的位数来实现加密和解密。例如,把英文字母在字母表中的位数向前移动3位,那么明文E就变成了密文B,A变成X,B变成Y,C变成Z……
凯撒加密的方式就是将字母移位,也是“替换密码”的一种。移动的位数就是凯撒密码加密和解密的密钥。如果加密是向后移3位,解密就是反过来向前移3位,密钥就是3。
★凯撒密码的破译
凯撒密码只是简单地把明文中的每一个字母用字母表中该字母前的第三个字母代替,显然,从1到25个位置的移位我们都可以使用。后来,为了不用每次都写出一个新的列表,人们根据凯撒加密法的原理制作了移位加密圆盘。盘的内圈和外圈分别是两个字母表,转动外圈圆环不同的格数,就可以形成不同的移位值,从而组成不同的凯撒替换密码表。
在密码学中,凯撒密码是一种最简单且最广为人知的加密技术,对后世影响极其深远。同学们应该已经发现,凯撒密码很容易被破译,破译的关键在于如何确定移位的数值。破解方法有两种,一种是穷举法,一种是频率分析法。穷举法,就是一个一个地试,直到出现有明确意义的明文为止——毕竟凯撒密码中的密钥只有25种可能,很容易被破译。
频率分析法,指的是根据英语中每个字母出现的频率进行破译。书面语言的一个重要特征是单个字母不是以同样的频率出现的。在英文文章中,平均说来,字母“E”出现的频率最高,可以占到所有字母的13%,其次是字母“T”,可占所有字母的10%左右,而字母“Z”出现的频率远远小于1%。因此我们很容易根据这个特点破解置换密码,找出密文中出现次数最多的字母,使之与最常出现的字母“E”相对应,再找到密文中出现次数第二多的字母,使之与字母“T”对应……以此类推,就能很快破译密码,如下面这个例子。
例已知下面的密文是用移位置换密码编写的,试着破译该密文。
UQJFX JLTYT YMJBT WQIYW FIJHJ SYJWY TFYYJ
SIYMJ RJJYN SLFYY MWJJU RSJCY BJISJ XIFD
解容易看出,其中出现频率最高的字母是“J”,将其与字母“E”相对应,这样可以知道是位移了5个位置,于是可以破译出相应的有明确意义的明文为:
PLEAS EGOTO THEWO RLDTR ADECE NTERT OATTE
NDTHE MEETI NGATT HREEP MNEXT WEDNE SDAY
也就是“PLEASE GO TO THE WORLD TRADE CENTER TO ATTEND THE MEETING AT THREE PM NEXT WEDNESDAY”(请在下周三下午3点到世界贸易中心参加会议)。
凯撒密码太容易被破解了,因此,人们在凯撒密码的基础上更进一步,发明了随机替换加密这种方法。
★随机替换加密的原理
所谓随机替换加密,指的是一组字母表中的字母是有序的,另一组是随机的,两组字母形成一一对应关系。例如,在两个同心圆盘上,内盘按随机的顺序填好字母,而外盘按照一定顺序填好字母,随机转动圆盘就可以找到一种字母的替换方法。穷举法已经无法破解随机替换密码了,因为穷举的次数将达到26!次,人们只能用频率分析法来破解密文。
★加密机的出现
到了欧洲的文艺复兴时期,人们在加密圆盘的基础上不断改善,比如在同一密码盘上多增加几个同心圆,制成了更复杂的替换圆盘,每个明文字母可以用密文中的多个字母来替代,而每个密文字母也可以表示多个明文字母。到了17世纪左右,人们发明了一些加密机。这些加密机克服了凯撒密码体制的缺点,敌人很难再通过分析字母出现的频率来破译,加密性能得到了很大提升。
这些加密机虽然结构简单,但其基本思想却一直延续到第二次世界大战时期,在战争中发挥了重要作用。
除了阴符和阴书,我国古代的军事家在军事领域还发明了一系列加密方法,如隐语、字验、反切加密等。
所谓“隐语”,就是话中有话,也叫“密语”“谬语”,即不把本意直接说出而借别的词语来暗示。中文博大精深,使用人口众多,因此,中文成为世界上最大的一支隐语系统。隐语的内容从字面上看很普通,但通信双方却能通过它互通重要的机密情报。《左传》便记载了这样两个场景。
叔展曰:“有麦曲乎?”曰:“无。”“有山鞠穷乎?”曰:“无。”“河鱼腹疾奈何?”曰:“目于眢井而拯之。”“若为茅绖,哭井则已。”
——《左传·宣公十二年》
吴申叔乞粮于公孙有山氏,曰:“佩玉繠兮,余无所系之!旨酒一盛兮,余与褐之父睨之!”对曰:“粱则无矣,粗则有之。若登首山以呼曰,‘庚癸乎!’则诺。”
——《左传·哀公十三年》
这两段话究竟是什么意思,历来众说纷纭。但主要的观点都认为这是当时的隐语,用来传达战争消息的,因为当时正在打仗,许多话不能说得太明白,只能说隐语来传达消息。隐语还有许多形式,有时候,人们也把明文藏进字谜和诗歌里,加工为密文再传递出去。
在公元11世纪,我国出现了第一本真正的军用通信密码表,它保存在北宋著名政治家、文学家、军事家曾公亮(999—1078)编纂的《武经总要》中。
曾公亮
★《武经总要》
北宋时,辽国和西夏很强大,他们频频侵犯中原。为了窃取北宋的军事情报,赢得战争的胜利,两国常常派遣间谍潜入中原,刺探各种情报。当时的军机要件,大都是派心腹直接投送的。曾公亮总结前人经验,发现军事通信工作中保密的重要性,指出泄密的危害,因而要求加强保密措施。他认为旧的军事通信技术有严重缺点,并在《武经总要》一书中写道:
旧法:军中咨事,若依文牒往来,须防泄漏;以腹心报覆,不惟劳烦,亦防人情有时离叛。
这段文言文的意思是:
军中汇报传递消息是以文书传递的,要小心消息泄露。因此,我们要用信得过的人来传递消息,不要怕麻烦,防止有人背叛。
★字验的原理
为了解决这个问题,曾公亮设计了一种被命名为“字验”的加密方法。他编制了一种特殊的通信密码表,将军中常用的40个军事术语,分别编为相应的数字代码,分别是:
当将领率兵出征时,后方先发给他一个密码表(可按照不同的排列组合,打乱这40句短语的顺序),后方和将领先约定好,用某一首五言诗(每首诗8句,每句5个字,共40字,其中绝对不能出现重复的字),作为解码密钥。例如,约定下面这首诗作为解码之用:
题破山寺后禅院
清晨入古寺,初日照高林。曲径通幽处,禅房花木深。
山光悦鸟性,潭影空人心。万籁此俱寂,但余钟磬音。
战争开始后,将领打了一战后,发现刀消耗太多,因此请求后方送刀来前方。这时,他查出“请刀”是第3个密语,与之对应的五言诗中的第3个字是“入”。于是,将领就可以编发一道嵌有“入”字的普通公文发出,并在这个字上加盖印章,以表示这个字是关键字。若出现了多种军情,也采用同样的办法。假设需要请弓、请箭、请船3种情况,将领查出这是1、2、12号密语,对应了五言诗中“清”“晨”“径”3个字,将领就可以编一首嵌有“清”“晨”“径”3个字的普通公文发出,并且在这3个字上盖印章,表示这3个字是关键字。
公文到达后,后方马上就可以破译出统兵将领来函的意图。如果他同意下属的请示,就重新写下这个字,把它夹杂在文章中,加盖印章发回;如果不同意,就什么也不写,只盖上一个空印。
★字验的使用
字验是一种极其高明的加密方式。因为这40个常用军事术语,可以按任意的顺序随便编排!用数学知识来计算,可知这40个常用军事术语的排列方法有40!种。
40!=40×39×38×…×3×2×1
40!是一个大得吓人的天文数字,大约有50多位。同时,唐代的五言诗又数以万计,敌人很难猜出主帅与大将约定的是哪一首唐诗。
在字验这种加密方式中,这首任意选择的五言诗就是密钥,40个常用军事术语编成的小册子称为密码本(这种密码本都是一次性的),将领和后方各持一本。只要密码本和密钥诗不同时落入敌人手里,以当时科技水平而言,这种密码几乎是不可能被破译的。
到了16世纪中叶(明代中期),另外一种密码也出现了——反切密码。这是一种汉语独有的加密法,它是使用汉字的“反切”注音方法来进行加密的。
★什么是反切密码
网上曾经流行一个笑话,问:吃什么会变丑?答案是藕。为什么说吃藕会变丑呢?其实你只要念一遍“吃藕”和“丑”就会明白了,原来这是网友们在用“吃藕”委婉地表示“丑”呢!
“吃藕”一词源于百度贴吧,某网友发帖问一个游戏中的人物是不是很丑,不小心把“丑”打成了“吃藕”。从此,以“吃藕”表示“丑”的用法,在网上流行起来。
“吃藕”的网络用法与中国传统注音方法“反切”是一样的。所谓“反切”,就是用两个汉字来拼注另一个汉字的读音,基本要求是:前面的字取声母,后面的字取韵母和声调。
根据这个规则,“丑”正好是“吃藕切”,也就是取前字“吃”的声母“ch”,再加后字“藕”的韵母“ǒu”与上声声调组合而成。其他汉字都可以用此法切出来,例如“春”字可以用“闯墩”切出来,取“闯”字的声母“ch”和“墩”字的韵母调声调“ūn”。
显然,用反切法可以给每一个汉字注音,实际上,古代的字书就是“反切”的总汇。这样,读书识字就方便得多了。除了在读书识字时用于注音外,反切法还可以用来做游戏。
★反切密码和戚继光
在明朝中期,著名的抗倭将领戚继光(1528—1588)发明了一套根据反切的注音方法来设计的密码。戚继光虽然是个武将,但他的文学水平也非常不错,写过几首很不错的诗。当时有人评价他“无意为诗,自足生趣,若郭定襄,直于诗坛中位置之”。意思是说,戚继光如果专心写诗,可以成为诗坛领袖。这是很有眼光的评价。
戚继光发明的反切密码就隐藏在两首诗中。
第一首诗是:
柳边求气低,波他争日时。
莺蒙语出喜,打掌与君知。
第二首诗是:
春花香,秋山开,嘉宾欢歌须金杯,孤灯光辉烧银缸。
之东郊,过西桥,鸡声催初天,奇梅歪遮沟。
戚继光将前一首诗歌的前15个字作为声母(最后一个字和前面的“争”字声母重复),依次编号为1—15;后一首诗歌的36个字作为韵母,按顺序编号为1—36;然后再将当时字音的八种声调,也按顺序编号为1—8,就编写出了完整的“反切码”体系。
进行密语时,只要说出声母、韵母的代表字的编码,再配合拍手或单用拍手就行了。戚继光亲自训练军事密语人员,要求他们把歌词读得滚瓜烂熟,又亲手编了一部《八音字义便览》作为训练的教材。
根据反切注音法,如果密码的编码是“5—25—2”,5是声母“低”字,25是韵母“西”字,2是声调的二声,据此,“5—25—2”就可以读为“敌”字。
为了保密,还可以将这两首诗里的字的顺序打乱,随意组合,安全性能大大加强。
前面介绍的隐语加密、字验加密和反切加密都用在军事领域。到了清朝,密码的使用已经不再仅限于军事领域了,还被用在了金融行业中。
1823年,也就是清朝道光三年,山西省平遥县成立了第一家票号——“日升昌”。所谓“票号”,相当于钱庄。日升昌最主要的业务就是汇兑业务,即此处交款,彼处取款,票号从中取得汇费作为利润。汇费一般是汇款金额的1%~3%,有时高达7%~10%。如咸丰十一年(1861年)由平遥汇往开封白银1000两,汇费收取14两。
在明清时期,我国的货币主要有铜钱和银子两种,大额交易时都用银子支付。银子是贵金属,密度很高,明清时1两为37克,50两银子是1850克,如果某商人带1000两银子出门做生意,那就是37千克,可是相当沉重了。
现银携带起来很笨重,费时误事,而且经常发生差错。有了票号后,商人们就不用携带很沉重的银子出门了。比如某商人从扬州出发前往广州做生意,商人可以先在扬州的日升昌分号存一笔钱,日升昌就给他开一张汇票,汇票上会写清楚顾客汇了多少钱——然后商人带着汇票来到广州,就可以在广州的日升昌分号取款。
也就是说,汇票就等于钱。然而汇票仅仅是一张纸而已,可能被伪造,古代通信不畅,扬州分号开了一张票,广州分号一时半会儿也不知道。日升昌的各分号是怎么确定这张汇票是自家开的呢?那就要靠相应的防伪措施了。
日升昌的汇票防伪措施有好几条,其中一条很重要的就是创造了以汉字代替数字的密码防伪办法。票号将汇票上涉及的银两数目、签发日期等数字都采用汉字代码书写,也就是前面讲过的代替加密。我们来介绍一个具体的例子。
首先,代表全年12个月的代码为“谨防假票冒取,勿忘细视书章”。“谨”代表1月,“防”代表2月,“假”代表3月……以此类推。
代表每月30天的代码为“堪笑世情薄,天道最公平,昧心图自利,阴谋害他人,善恶终有报,到头必分明”。可能有同学会纳闷儿——为什么没有31号呢?那是因为清代用的是农历,农历每个月要么29天,要么30天,没有31天。
接下来,用“国宝通流”4个字来分别表示汇款金额的万位数、千位数、百位数和十位数。
代表银两数“壹贰叁肆伍陆柒捌玖拾”的相应汉字为“赵氏连城璧,由来天下传”(或“生客多察看,斟酌而后行”)。
如某人在3月5日汇银5000两,即写“假薄璧宝”。其中,“假薄”指的是3月5号,“璧”指的是5,“宝”指的是千,“璧宝”指的是5000。
再比如,某人在6月21日汇银653两,则它加密后写出的汉字代码就是“取善由通璧流连。”“取善”指的是6月21日,“由通”指的是600,“璧流”指的是50,“连”指的就是3。
总的来说,这样加密之后,乍一看都是似是而非的汉字,让人摸不着头脑。即便外人拣到汇票,也不会认为这张纸能值几百、几千两银子。
这种用诗句代表数字的密码,读起来朗朗上口,容易记忆,用起来方便安全,比较保密。其次,经营者还不时地变换这套诗歌,更增强了汇票的保密性,一旦作废,将永不会重复使用。一旦付款后,就会销毁这张汇票,因此,现在无法找到当年汇出银两的汇票原件。
这种保密方法非常妥当,据说,在票号盛行的百年历史里,从来没有出现过一例汇票被冒领的事。
前面介绍的加密方式都是历史上真实存在的,在大量的文学作品和影视作品里,也有许多破译密码的故事。
金庸是我国著名武侠小说家,他一生写了14部武侠小说,其中有一部作品叫《连城诀》。这部作品写尽了人性的善良和丑恶。整部小说围绕南朝梁元帝遗留的宝藏展开,藏宝的地点在“江陵城南偏西天宁寺大殿佛像,向之虔诚膜拜,通灵祝告,如来赐福往生极乐(明文没有标点)”,加密者用了一本《唐诗选辑》对密文进行加密。
万震山低声道:“……连城剑法的第一招,出自杜甫的《春归》……‘苔径临江竹’,第四个字是‘江’,你记下了。第二招,仍是杜甫的诗,出自《重经昭陵》。”他又沾湿手指,去湿纸页:“嗯,是‘五十一’!”他一个字一个字地数下去:“一五、一十、十五、二十……‘陵寝盘空曲,熊罴守翠微’,第五十一个字,那是个‘陵’字。‘江陵、江陵’,妙极,原来果然便在荆州。”
——金庸《连城诀》
加密者找到了这句明文里的每个汉字在《唐诗选辑》这本书里的哪一首诗里出现过,例如第一个字“江”在杜甫的《春归》里出现过,第二个字“陵”在杜甫的《重经昭陵》里出现过;接着,再数到这个汉字是这首诗中的第几个字,“江”是《春归》这首诗里的第四个字,“陵”是《重经昭陵》这首诗的第五十一个字。
然后,加密者又从所有选出的诗里抽出两句,按顺序编成一整套剑法;最后,将汉字的序号编成一套口诀,这套数字就是书名“连城诀”。也就是说,宝藏的地址是明文,《连城诀》是密文,《唐诗选辑》则是密钥。
这种加密方法和我们最开始讲述的那个故事一样,也被称为“比尔密码”,就是用数字来暗示文字,破译时必须找到密钥——编码者作为编码依据的某本书籍(或文字材料),再把那些数字按编码规律在书里像查字典那样查出对应的文字(就像用《连城诀》的数字从《唐诗选辑》里查出文字一样),连起来就是明文内容了。
除了《连城诀》,《福尔摩斯探案全集》里也有好几篇破译密码的故事。《跳舞的人》是其中很著名的一篇。
故事说的是乡绅丘比特先生娶了位美国妻子,妻子让他许诺,永远不过问她来英国之前的生活。婚后一年左右,这位乡绅的妻子收到一封来自美国的信,读完之后她惊恐万分。不久,在他们居住的庄园宅第里,在许多墙面和纸张上,都开始出现一个个跳舞小人的图像……乡绅非常焦急地找福尔摩斯求助。
福尔摩斯把纸条举起来对着太阳光看。那是张从记事本上撕下来的纸,上面用铅笔画了些跳舞的人。
“我从你这儿回到家里以后,第二天早上看到的头一件东西就是一行新的跳舞的小人。这些人像是用粉笔画在工具房的黑木门上的,工具房就在草坪边,正对着前窗的。我照样临摹了下来,在这儿。”
他打开一张纸,放在了桌子上。下面就是他临摹下来的图形:
“太好了!”福尔摩斯说,“请继续讲。”
“我临摹下来后就把那些图形擦了。可是两天之后的早晨,新的图形又出现了。这是我临摹的。”
……
“应用秘密文字的规律来分析,就不难找到答案。在交给我的第一张纸条上那句话很短,我只能稍有把握
——柯南·道尔《福尔摩斯探案全集》
在《跳舞的人》这个故事中,福尔摩斯发现,每个小人代表一个字母,他根据不同字母的出现概率破解了每个小人代表了哪些字母,最后侦破了案件。
《跳舞的人》是短篇小说,在《福尔摩斯探案全集》里还有一篇长篇小说,叫《恐怖谷》。在这次冒险中,福尔摩斯又成功破译了一则密码。
福尔摩斯又把那张纸平铺在空盘子上,我站了起来,在他身后低头注视着那些稀奇古怪的文字,文字排列如下:
福尔摩斯把身子仰靠在椅背上,凝视着天花板,说道:“这个人编写密码信的蓝本是一本书。咱们就从这点出发吧……我们可以假设,534是密码出处的页数。那么我们这本书就是一本很厚的书了。关于这本厚书的种类,我们有些什么别的可以查明的迹象没有呢?第二个符号是C2,你看它是什么意思呢?华生。”
“代表第几栏!”我喊道。
“高明,华生。今天早晨,你真是才华横溢呀。如果它不是第几栏,那我可就真是误入歧途了。所以现在你看,我们设想有一本很厚的书,每页分两栏排印,每一栏又相当长……是一本版本统一而又人人都会有的一本书了。”
——柯南·道尔《福尔摩斯探案全集》
福尔摩斯研究出:第一行中的C2指的是第二栏,而534特指一本书的页数。而之后的那些数字则是指那一列中的特定单词。发信人原本打算在第二则信息中传达书名的线索,但是他改主意了。尽管如此,福尔摩斯还是成功推论出被用作密钥的书是一本年鉴,并破解了密码,查清了事实真相。
如果同学们看过《伪装者》《潜伏》《风声》等谍战片,会发现谍战片都会有这样的情节:情报人员在一台发报机(或收报机)前工作,“嘀、嘀、哒、哒——”的声音不断响起……情报人员按的电报码,也叫莫尔斯码。
那么,什么是莫尔斯码?19世纪30年代,画家塞缪尔·莫尔斯(1791—1872)决定放弃他的绘画事业,发明一种用电发送信息的方法——电报。经过长达10年的思索,1844年,他发明了一台名叫“莫尔斯电报机”的机器。
莫尔斯电报机使用莫尔斯码收发信息。莫尔斯码采用“·”“—”两种符号来表示26个英文字母。在发送时,“·”就是“嘀”的一声,“—”就是“嗒”的一声。“嗒”的时间长度等于3个“嘀”的时间长度。
1 8 4 4 年,莫尔斯发明的电报机
1895年,无线电诞生了,无线电报出现。人们依然用莫尔斯码来收发无线电报。很快,无线电报就作为一种战争工具广泛地用于军事通信。
由于莫尔斯码已经成为公开的秘密,要想让它用于军事和间谍领域,还需层层加密。最简单的一种加密方法是参照凯撒密码,如发送方写一封信(这封信是明文),对字母移位加密后形成密文,发送方查出密文对应的莫尔斯码,用无线电报机发送给接收方,接收方接收到了电报,根据莫尔斯码的编码规则还原为密文,再将字母反向移位,得到明文。
2 6 个字母和10个阿拉伯数字的莫尔斯码
对英文来说,莫尔斯码特别方便,因为英语只有26个字母,编码规则简单;对汉语来说就麻烦了,因为汉语有几千个字!那我们如何用莫尔斯码表示汉字呢?
答案是给汉字编码!用4个阿拉伯数字代表一个汉字。例如,在公开的《标准电码本》中,“中”字的编码为“0022”,“国”字的编码为“0948”……再找到这些阿拉伯数字对应的莫尔斯码,用发报机将信息发出去。
如果用《标准电码本》里的文字代码直接发报,属于明码电报;如果需要传送机密信息,则由收发双方自行编一本新的《汉字编码本》,双方各持一本。发报的时候,发送方把想要传达的信息写下来,再根据自己手中的《汉字编码本》将汉字加密为密文,通过电报机发送出去;接收方接到电报后,根据自己手中的《汉字编码本》把密文还原成明文。
一般来说,常用汉字有3000个,将3000个常用字和0001~3000的数字对应起来,其排列方法为3000!,这是一个极其巨大的数字。因此,随随便便就可以编出许多《汉字编码本》。
用电报机发送汉字电报,传送速度慢,每分钟大致发90个数字(相当于22个汉字)。虽然人工发报劳动强度大,但是它所用的设备简单,维修方便,性能稳定,适用于战争环境,为革命战争时期的通信联络立下了汗马功劳。
《标准电码本》
第一次世界大战期间,无线电报技术得到了快速发展,大部分战场信息都靠无线电报发送,因此,战争双方破解对方的无线电密文就显得至关重要,密码学得到了快速发展。
为了破解越来越复杂的密码,在一战中,各国军队都设立了专门从事密码破解的部门,其中比较著名的有英国海军部的“40号房间”和美国陆军部的“军情第八科”。
这些部门所破解的情报对协约国取得战争的胜利有着至关重要的作用。1914年,英国对德宣战的同时,英国海军就切断了德国穿越大西洋的海底电缆,使德军不得不依靠无线电报来与海外战场进行通信联系,从而使英军轻易地获得了德军大量的无线电报密文。
为了破解这些加密电报,英国于1914年10月成立了一个专门破解密码的小组,其办公所在地是英国旧海军大楼第40号房间,因此被称为“40号房间”。在“40号房间”成立前后,英军截获了德军的多个密码本以及大量与德军密码系统相关的资料,大大加速了英军对德军密码的破解。1915年3月,英国获得了德国外交部的某个密码本,该密码本对英国破解德国的外交密电起到了重要作用,直接导致美国参与战争,加快了第一次世界大战的胜利进程。该次破解也被认为是历史上最为成功的一次密码破解案例。据称,“40号房间”在第一次世界大战期间共破译了超过15000份的德国密电,对战争的胜利做出了巨大贡献。
4 0 号房间的工作人员
第一次世界大战期间,加密和解密技术迅速发展,但作为一门学科,其基本原理还是古典密码学的范畴,甚至在加解密的方式上都仍然依赖于手工操作。
第二次世界大战使各国进一步明白了密码的重要性,没有什么比洞悉敌人的秘密能更有效地打击敌人,也没有什么比保护自己的秘密更能确保己方的胜利。因此,各国政府在密码系统和密码分析两方面都加大投入,使得无论是在密码理论还是应用方面,都发生了革命性的变化。
在技术方面,基于机械的加解密装置全面取代了以往的手工密码。大量的数学和统计学知识被应用于密码的分析和破解,越来越多的数学家不断加入密码队伍,以更为严谨的数学分析代替以往的个人灵感。这期间,最出名的故事就是英国数学家图灵(1912—1954)带领团队破解德国的恩尼格玛密码机的故事。(这段故事还被改编成了一部电影,叫《模仿游戏》。)
数学家图灵和英国的炸弹机
恩尼格玛密码机是这样的:键盘上有26个字母,没有标点符号。当要加密一串字符时,操作员要在机器下方的键盘上按出明文字母,每按下一个字母,键盘上方面板上的一个字母就会亮起来,这就是机器所生成的密文字母。在输入需要加密的信息的同时,我们便可以根据按顺序亮起的字母,记录下一串与明文长度相等的密文。
恩尼格玛密码机最大的特点是,键盘上按下相同的字母时,机器每一次都可能会产生出一个不同的字母来作为密文,这就使得人们无法通过研究每个字母出现的概率来破译密码。
根据计算,恩尼格玛密码机一共有159百亿亿(实际上为158962555217826360000)种配置方案。也就是说,译码者至多需要尝试159百亿亿种不同的配置,才能通过蛮力破译出密码。因此,整个二战期间,德国人都坚信恩尼格玛密码机牢不可破。
然而,图灵发现了恩尼格玛密码机的缺陷:不能将一个字母加密为自己。这个发现大大减小了计算量,再配合一种叫“炸弹机”的装置,英国人成功破译了德军的大量密码,将第二次世界大战的结束时间提早了至少一年。
前面介绍过,1976年,第一种非对称加密技术被发明出来,这是几千年以来文字加密颠覆性的革命。非对称加密在我们的生活中发挥了极其重要的作用。可以这么说,没有非对称加密,就没有当今的信息社会。
现在,几乎所有的账号登录和电子支付站都在使用非对称加密,比如微信支付、支付宝支付、腾讯Q币充值、京东付费……甚至,即便只是普通上网,如果你看到网址开头是https,那么你也正处在非对称加密技术的保护之下。
通过前面的讲解,同学们应该已经发现,在对称加密里,加密用的密钥和解密用的密钥是一样的。比如,不论你用什么密钥来加密,解密的时候还是要用这个密钥。因此,对要保护信息安全的人来说,安全主要靠保护好钥匙,也就是密钥。
对整个加密过程来说,就像使用一只保险箱,掏出钥匙(密钥)开箱,扔进要保护的数据,锁好;需要使用数据的时候,再掏出一把钥匙(密钥)开箱。
然而,随着技术进步,人们的联系越来越密切,交流越来越多,保护密钥也成了一个问题。人们要保护的信息常常不像放入固定不动的保险柜,而更像是放进便携的手提箱再送给别人。试想一下,如果要和一千个人交流,为了让对方能够打开箱子,大体上有两种思路:
(1)把你的钥匙复制一千把分发给大家。“让一千个人同时保护好你的钥匙”——这听起来真是太不可靠了!此路不通。
(2)和每个人通信时都使用不同的钥匙。此法倒尚可,不过,现在你自己就有一千把钥匙要保存了,显然保存难度太大!
虽然在现代计算机技术的帮助下,保存几千个密钥不难,但如何安全地分发和更新密钥还是一件让人苦恼的事情。
在这样的环境下,非对称加密技术应运而生。1976年,两位数学家提出了这样一种密码体制:
加密算法和解密算法相同,但密钥不同,其中一个密钥用来加密,另一个密钥用来解密。两个密钥中一个被公开给所有人,称为公钥,而另一个自己收好,称为私钥。
发明公开密钥加密方法的两位数学家Diffie和Hellman
这个加密技术主要有两种用法,一种是用来加密以防范信息泄露,另一种和前文提到的虎符一样,是用来验证身份的。
(1)当用来加密明文,保护信息时,比如甲要将一段需要保密的信息发送给乙,则:
甲先使用乙的公钥将信息的原文加密,然后发送给乙。这样,由于必须使用乙的私钥才能解密,所以只有乙能看到原文,而其他人只能对着乱码望而兴叹。
(2)当用来验证身份时,比如甲要公布一个发红包的声明,则:
甲使用自己的私钥对声明进行加密,然后将结果发布出去。大家收到声明后,就使用甲的公钥进行解密,从而知道甲要送大家每人xxx元。如果这时甲反悔了,说这是别人冒充他发出的声明!对不起,大家能够用甲的公钥解密,就说这份文件确实是甲使用自己的私钥加密的,甲就不能抵赖说是别人冒充自己。
这种加密法中,加密和解密过程使用了不同密钥,所以人们就将它称为非对称加密,而过去那种加解密时密钥都相同的加密方法就与之相对地叫作对称加密。另外,由于非对称加密方法会将一个密钥公开,所以这种体制有时也被叫作“公钥密码体制”。
这个想法可谓石破天惊!因为在此之前,人们都认为,加密的密钥是需要保密的。因为,一旦知道如何加密,就知道了如何解密。在以前,你知道传递密码的人用“加3”来加密,你只需“减3”就可以解密,而现在,对方却可以大方告诉你,“给我的数据都用3加密”,因为加密结果只有用他手中的另一个数字才能解开。
聪明的读者一定会想到这个问题:不同的密钥运算两次后能够恢复出明文,说明这两个密钥肯定不是随便选择的,其间必然存在关联!是的,数学家们在设计非对称加密机制的时候有一个很关键的要求,就是不能通过一个密钥容易地推导出另一个密钥。要知道,很多破解密码的人都拥有强大的数学能力,甚至可能是某个国家的数学家团队。
发明RSA加密算法的三位数学家罗纳德·李维斯特、阿迪·萨莫尔和伦纳德·阿德曼
于是,为了满足这个要求,数学家们使用了一种称为单向函数的东西。
这种单向函数利用一些数学上很难解决的问题,在正向计算时毫无难度,要逆向计算却十分困难,比如最常见、也是用得最多的一种非对称算法RSA就是利用了大质数分解问题——两个质数相乘很简单,当比较小的时候,即使小学生也能轻松分解,但如果是两个巨大质数,面对他们的乘积,即使世界上最强大的数学家也没有什么好办法。
比如,你能将175230317快速分解为两个质数的乘积吗?是不是很难分解?
常用于非对称加密的数学问题有大质数分解、离散对数、椭圆曲线等,就让我们通过大质数分解问题来体验一下RSA加密的过程。
要使用RSA加密算法,我们首先要制作一个加密密钥。
步骤1制作密钥
(1)首先,选择两个质数p、q,求出其乘积n=p×q,并求出(p-1)×(q-1)。
质数p和q越大,RSA算法的安全性越好,不过为了简单,我们选择两个很小的数。
设p=5,q=11,则n=55,(p-1)×(q-1)=40。
(2)选择一个数e,使e和(p-1)×(q-1)互质,也就是两个数的最大公约数为1。
在这里,我们任选一个e=7,7与40的公约数只有1,满足条件。现在我们已经得出了公钥(n,e)→(55,7)。
(3)接下来找出一个整数d,要求是d和e的乘积除以(p-1)×(q-1)后余1。
代入前面的数字,现在要找到一个整数d,使7d除以40余1,同学们一定能很快找出答案,d=23。好!至此,我们也得到了私钥(n,d)→(55,23)。
步骤2用RSA密码进行加密
(1)先把我们需要加密的字母信息转换成数字信息。
现在,我们需要把要加密的字母“j”发给另外一个人,那么,我们把字母“j”变成一个数。
把字母转换成数字信息可以有不同的方法,最简单的转换法可以用数字和字母一一对应,如a=0,b=1,c=2,d=3,……,j=9,以此类推。
那么,我们就知道j=9。
(2)用公共密钥(n,e)对数字进行加密,具体计算公式为C≡me mod n,也就是明文m的e次方除以n,余数就是密文。
mod是一个数学符号,意思是取余数,比如10÷6=1……4,100÷21=4……16,我们就可以写成:
10 mod 6=4
100 mod 21=16
所以,如果用我们的公共密钥(55,7),就必须计算97mod 55,因为97=9×9×9×9×9×9×9=4782969,4782969÷55=86963……4。
可以解得C=4。
所以,字母j就被加密成了密文4。
步骤3用RSA密码进行解密
解密的计算公式是:
m≡Cd mod n
我们的公共密钥是(55,7),私人密钥(解密密钥)是(55,23)。要解密通过公共密钥加密过的信息“4”,就必须计算
m≡423 mod 55
用电脑上的科学计算器来进行计算,可以得到:
423mod 55=9。
而这个9就是我们最初加密的信息,也就是字母“j”。
经过千辛万苦之后,我们终于得到原本的信息。
思考题
用刚刚算出的RSA公共密钥(5 5,7)将单词“cat”进行加密。(先将字母转成数字,a=0,b=1,c=2,d=3,……,以此类推)
相比起在真正应用中使用的RSA密钥,我们举例所用的数实在是太小了,为保证信息安全,在网上银行在线支付这样的系统中,使用的两个质数至少也要几百上千位,从而保证其乘积无法在有效的时间内被分解开来。如果有一天突然发现了高效的大质数分解方法,互联网一定会马上崩溃。幸运的是,目前数学家们还没有发现什么好办法哦。
总之,非对称加密一直发挥着核心级作用来保卫我们的计算机、网络账号、个人隐私和银行账户!