2.1 密码学概述
提到“密码”二字,我们很容易联想到谍战片里的一幕情景:发报方的机要人员将文字内容转换为数字给电报员,电报员坐在发报机前焦急地滴滴答答按个不停;而接收方电报员则戴着耳机紧锁眉头,认真地将听到的数字一字不差地记录在本子上,然后急冲冲地交给机要员;机要员看到这串数字后,拿出一个小本子,随即将数字还原成文字。他们传递信息如此谨慎小心,是因为这些信息是极其重要的,很可能是我军的作战方案,哪能被敌军知晓,所以需要通过加密来传递。在上述场景中,发报员发的数字叫作密文,它能被包括敌方在内的任何人看到,但是只有数字根本无法知道发报内容;而机要员手里的小本子就是密文和明文的对照本,即所谓的密码本,里面的对照关系都是事先设定好的,比如:001→赵,002→钱,003→孙,004→李,当然这些都是最简单的对应关系,实际使用中发送的并不是单纯的一串数字,可能是数字、中英文或者符号的各种组合,有的情报内容甚至把方言以及生活习惯都加进去,如图2-2所示。
图2-2 密码本实现密文和明文的互换
什么是密码学?密码学(在西欧语系中,源于希腊语kryptós“隐藏的”和gráphein“书写”)是研究如何隐密地传递信息的学科。事实上,密码学是伴随着加密与破译的斗争在实践中逐步发展起来的,随着先进科学技术的应用,已成为一门综合性的尖端技术学科,它与语言学、数学、电子学、声学、信息论、计算机科学等有着广泛而密切的联系。它的现实研究成果,特别是各国政府现用的密码编制及破译手段都具有高度的机密性。著名的密码学者罗纳德·李维斯特(Ronald Rivest)(RSA加密算法提出者之一)解释道:“密码学是关于如何在敌人存在的环境中通信。”随着现代数学方法和计算机性能的提升,以及各个学科的深度融合,已经能够设计出更加复杂、高效的密码体制。
密码学的首要目的是隐藏信息的内涵,并不是隐藏信息本身的存在,其中就涉及对信息的加解密操作,即广义上的密码。
那么什么是密码?密码是通信双方按已经设定好的规则对所要传输的数据信息进行特殊转换的一种重要保密手段。依照这些规则,变明文为密文,称为加密;变密文为明文,称为解密。其中明文是指没有经过加密,能直接读懂原文意思的数据;密文是明文经过加密处理后的数据,隐藏了原文的意思。加密和解密如图2-3所示。
图2-3 加密和解密
在人类历史发展进程中,出现过很多隐秘传递消息的方法。早期最具代表性的,且被明文记载有具体加密和解密的密码就是恺撒密码(Caesar cipher)。
恺撒密码的实现方式很简单,就是将明文中的字母按照固定的位数进行移动。图2-4展示的是将字母B平移两位替换成D,字母l平移两位替换为n,以此类推,明文BlockChain通过恺撒加密替换成DnqemEjckp。看起来很简单,但是如果不知道移动位数,密文DnqemEjckp读起来如同读天书一样,根本就不知道明文其实是BlockChain。当然你也可以通过暴力方法,不断尝试平移不同的位数来破解恺撒密码。破译密码的方法不是本书讲述的主要内容,读者如果感兴趣可以查阅相关的密码学文献。
图2-4 恺撒密码中的字母平移
在古希腊,还有一种叫作Syctale的密码棍,它被用来对信息进行加解密,使用方式是将字条缠绕在木棍上,实现字母的位移,原理与恺撒密码类似,棍子的直径决定了位移大小,所以只有用相同直径的棍子才能还原出原始信息,如图2-5所示。
图2-5 Syctale密码棍
在中国古代也有这样的密报形式,其中“阴符”是出现最早的军事密码。据《太公六韬》记载,“阴符”乃姜子牙所创。相传武王伐纣期间,姜子牙需要援军,情况危急之际,派信使去通知武王出兵,但又担心武王不信任信使,随即将自己的心爱之物鱼竿折成几段,让信使带给武王。武王将几节鱼竿拼在一起,辨别出是姜子牙的心爱之物,于是赶紧派出援军救了姜子牙。事后,姜子牙和武王一起商定了专用的凭证,这就是“阴符”。
当时的“阴符”共有八种:我军大胜、全歼敌军,阴符长度为10寸;击破敌军、俘虏敌将,阴符长度为9寸;敌军投降、占领城池,阴符长度为8寸;击退敌军、通报战况,阴符长度为7寸;激励军民坚守防御,阴符长度为6寸;请求增援兵马粮草,阴符长度为5寸;军队失败、将领阵亡,阴符长度为4寸;战斗失败、士兵伤亡,阴符长度为3寸。
后来由于战场上需要传递的消息更多,姜子牙又发明了“阴书”。通俗来讲,就是把一封写有秘密消息的文书横截成3份,派3个信使各执一份分别在不同时间、不同路线先后送出去,只有集齐3份才能获悉文书完整的内容。即使敌军截获其中两份,也无法解读文书的全部内容。
除了阴符、阴书的加密方式外,中国古代还有隐语、密码锁、字验法等。可以说,我国是世界上使用密码最早、类型最多的国家。
延伸阅读
隐语,又称暗语,就是将需要隐藏的信息变换成表面上有意义,但与真实信息完全无关的话语,这是一种流传很广的自然语言保密方法。据《左传·宣公十二年》记载,春秋时楚国要攻打萧国,萧国大夫还无社向楚国大夫申叔展求救。申叔展用隐语问:“你有麦粷吗?”还无社摆头回答:“没有。”申叔展又问:“你有山鞠穷吗?”还无社照样摆摆头,这可急坏了申叔展,申叔展继续暗示:“你得了风湿病怎么办?”还无社方才领悟,原来麦粷和山鞠穷是两味治风温的中药,用以暗指水井水坑。次日,萧国城破,还无社藏于水井而获救。
延伸阅读
前面我们提到过,密码是将秘密信息的含义隐藏起来。此外还有一种技术,是将秘密消息本身隐藏起来,我们称这种技术为“隐写术”(Steganography)。
在中国古代有一种诗叫“藏头诗”,即将所说的事藏于诗句之首,这就与隐写术有异曲同工之妙。
读过《水浒传》的朋友都知道,“玉麒麟”卢俊义乐善好施、豪侠仗义、济人危难,且武艺高强。梁山伯头领宋江一心想要把卢俊义招至麾下,可惜卢俊义只想报效朝廷,不愿与江湖草莽为伍,宋江为此非常困扰。宋江身边的“智多星”吴用心生一计,次日,吴用假扮算命先生来到卢俊义府上,此时卢俊义正在为躲避所谓的“血光之灾”而惶恐不安,吴用利用卢俊义的惶恐之心,一阵神神叨叨之后,口占四句卦歌,并题于壁上:
芦花丛中一扁舟,
俊杰俄从此地游。
义士若能知此理,
反躬难逃可无忧。
吴用巧妙地把“卢俊义反”这四个字藏于四句卦歌之首,而卢俊义却没有发现,最后朝廷得知这四句卦歌后,兴师问罪,大肆捉拿卢俊义,卢俊义走投无路之际,只得上梁山投了宋江。
在现代,隐写术常被用于数字水印中。其原理就是将标识符隐藏到类似图像这样的载体中,使得其来源可跟踪或可校验。