古典密码学之所以被称为古典,是因为区别于现代密码学,这些密码理论虽然很有价值,但是现在很少使用。因此,学习古典密码学,主要是学习前人设计密码的思路,和他们成功或失败的历史。
多表替换密码(Poly-alphabetic Shift Cipher,Vigenère Cipher)
为了较好地为信息加密,古人发明了加密算法:维吉尼亚密码(Vigenère Cipher)。其特点就是选用某一段字符串作为其密钥,并将密钥重复若干次直到长度与明文相同。
例如,用密钥“THINK”加密明文"ATTACKATONCE",就要将密钥重复并得到密钥排列"THINKTHINKTH"。密钥排列得到的一串字符,每个字符都代表将该位置的明文字母向后移动某位,从而得到密文。对于上述的"THINKTHINKTH"而言,用所需移位的数字表示就是“19,7,8,13,10,19,7,8,13,10,19,7”。
明文第一位(A)对应密钥排列的第一位(T),而T在字母表中排第19位(A是第0位),就将明文的第一位字母(A)向字母表排序的后面移动19位,由于A在字母表中排第0位,移动完是第19位T,因此得到密文第一位字母(T);
明文的第二位(T)对应密钥排列的第二位(H),而H在字母表中排第7位,就将明文的第二位字母(T)向字母表排序的后面移动7位,由于T是第19位,19向后7位是第26位,而字母表中最后一位字母Z是第25位,因此得到新的循环中的字母表第0位,于是得到密文的第二位字母(A);
第三位同理能够得到字母表中第27位,也就是B。以此类推,最终将会得到密文"TABNMDHBBXVL"。
相较于逻辑推演生成密码,维吉尼亚密码还可以使用表格法生成密码。
如下图,对于明文的第三个字母T,对应密钥的第三个字母I,于是使用表格中I行字母表进行加密,得到密文第三个字母B。类似地,明文第六个字母为K,对应密钥的第六个字母T,在表格中使用对应的T行进行加密,得到密文第二个字母D。以此类推,可以得到密文“TABNMDHBBXVL”。
可以看出,使用表格法无论是加密还是解密,都有着更低的学习成本以及更高的效率。这种密码的高易用性和不错的强度让它声名显赫。
维吉尼亚密码以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”(法语:le chiffre indéchiffrable)。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。维吉尼亚密码足够地易于使用使其能够作为战地密码。例如,美国南北战争期间,南军就使用黄铜密码盘生成维吉尼亚密码。北军则经常能够破译南军的密码。战争自始至终,南军主要使用三个密钥,分别为“Manchester Bluff(曼彻斯特的虚张声势)”、“Complete Victory(完全的胜利)”以及战争后期的“Come Retribution(报应来临)”。
对包括维吉尼亚密码在内的所有多表密码的破译,都是以字母的出现频率为基础的,但直接的频率分析却并不适用。例如,如果’P‘是密文中出现次数最多的字母,则’P‘所代表的明文很有可能是’E‘(在明文为英文的前提下),其原因在本文的第二章已经论述。由于在维吉尼亚密码中,同一个明文字母可以被加密成不同的密文,因而简单的频率分析在这里并没有用。
然而,维吉尼亚密码也有着很明显的漏洞。如果我们知道了密钥的长度,那密文就可以被看作是交织在一起的恺撒密码,而其中每一个都可以单独破解。例如,上个例子中以”THINKTHINKTH“作为密钥排列,这种情况下明文的第一位和第六位都将以密钥字母’T‘加密,它们的偏移量就是相同的。倘若明文足够长,就可以选取所有模5同余的位上得到字母来组成一组恺撒密码。
因此,对于一个明文足够长、密钥长度为t的维吉尼亚密码,至多需要将其按照模t同余的原则分解为t组平移密码即可破译。于是,破译过程的核心便落在了如何取得t值上。
五、卡西斯基试验(Kasiski’s Method)、弗里德曼试验和重合指数(Index of Coincidence)
为了求出密钥长度t,可以利用卡西斯基实验和重合指数。卡西斯基实验的内容很容易理解,不多做赘述。这里引用百度百科中的例子。
卡西斯基试验是基于类似the这样的常用单词有可能被同样的密钥字母进行加密,从而在密文中重复出现。例如,明文中不同的CRYPTO可能被密钥ABCDEF加密成不同的密文:
密钥:ABCDEF AB CDEFA BCD EFABCDEFABCD
明文:CRYPTO IS SHORT FOR CRYPTOGRAPHY
密文:CSASXT IT UKSWT GQU GWYQVRKWAQJB
此时明文中重复的元素在密文中并不重复。然而,如果密钥相同的话,结果可能便为(使用密钥ABCD):
密钥:ABCDAB CD ABCDA BCD ABCDABCDABCD
明文:CRYPTO IS SHORT FOR CRYPTOGRAPHY
密文:CSASTP KV SIQUT GQU CSASTPIUAQJB
此时卡西斯基试验就能产生效果。对于更长的段落此方法更为有效,因为通常密文中重复的片段会更多。如通过下面的密文就能破译出密钥的长度:
密文:DYDUXRMHTVDVNQDQNWDYDUXRMHARTJGWNQD
其中,两个DYDUXRMH的出现相隔了18个字母。因此,可以假定密钥的长度是18的约数,即长度为18、9、6、3或2。而两个NQD则相距20个字母,意味着密钥长度应为20、10、5、4或2。取两者的交集,则可以基本确定密钥长度为2。
除了卡西斯基实验,我们也可以使用别的参数来描述猜测的t值是否准确。当计算某个密文的重合指数(又名:重合概率,Index of Coincidence)时,即相当于求在某个密文中随机无放回地抽取其中的两位,这两位的字母相同的概率。
对于一个由任意字母表所构成的密文字母串而言,其重合指数可以表示下图:
其中c是归一化系数,用于对不同字母表进行归一化处理(英语为26),n 下标a是字母“a”出现在文本中的次数,N是文本的长度。重合指数也可以用求和的形式来表示:
我们已经知道,维吉尼亚密码可以被分解为若干组平移密码来破译,而一个明文足够长的平移密码的重合指数接近0.0687。换言之,如果我们选取某个t值,使得分组后的密文的重合指数接近0.065,则说明选取的t值与密钥的长度是一致的。
在一串无规律的字母中,我们随意抽取两个字母,由于每个字母被抽到的概率相同,因此抽取的两个字母相同的概率为26*(1/26)^2=0.0385。如果是从一篇文章或者一句完整的话中抽取,此时的概率为P(a)^2+P(b)^2+….+p(z)^2=0.067。这种特性是破译密码的一大关键,正常的单表替换,其重合指数更接近于0.067,而像维吉尼亚密码这类周期性多表替换,其重合指数更接近于0.0385。
这里引用维基百科中的例子进一步阐述,为简化描述,下文中“重合指数”全部指明文为英文时的情况:
作为使用IC的实际例子,假设我们截获了以下密文消息:
QPWKA LVRXC QZIKG RBPFA EOMFL JMSDZ VDHXC XJYEB IMTRQ WNMEA IZRVK CVKVL XNEIC FZPZC ZZHKM LVZVZ IZRRQ WDKEC HOSNY XXLSP MYKVQ XJTDC IOMEE XDQVS RXLRL KZHOV
(分为五个字符只是一个电报惯例,与实际字长无关。)我们怀疑这是一个使用Vigenère密码加密的英文密文,其中包含普通的A-Z分量和一个短的重复关键字,我们可以考虑密文“堆叠”成若干列,例如7列:
Q P W K A L V
R X C Q Z I K
G R B P F A E
O M F L J M S
D Z V D H X C
X J Y E B I M
T R Q W N ... ...
如果密钥大小恰好与假定的列数相同,那么单个列中的所有字母都将使用相同的密钥字母加密,实际上是一个简单的恺撒密码,应用于随机选择的英文明文字符。与它们相应的密文字母组,尽管每个字母已被置换(移位对应于密钥字母的量,参考本文第四节),也应具有类似于英语的频率分布的粗糙度。
因此,如果我们计算每列重合指数IC,它应该在0.067左右;另一方面,如果我们猜错了密钥大小(也就是选错了列数),则其重合指数IC应该在0.0385左右。因此,我们分别计算当密钥大小从1到10时的 IC:
从上图可以看出,密钥长度t很可能是5.如果实际长度是5,那么当长度取10的时候也会有较高的IC,原因是此时它的每列也对应一个简单的恺撒加密。
在求得密钥长度之后,通过穷举密钥字母的每一种可能取值(A到Z总共26种),并且针对每一行求其在某一取值下重合指数,重合指数最高的情况下该行最有可能为明文原文,此时的穷举结果即为密钥字母。以下是经过解密后得到的明文:
MUSTC HANGE MEETI NGLOC ATION FROMB RIDGE TOUND ERPAS SSINC EENEM YAGEN TSARE BELIE VEDTO HAVEB EENAS SIGNE DTOWA TCHBR IDGES TOPME ETING TIMEU NCHAN GEDXX
从中可以读出明文想要发送的信息为:
是否必须将会议地点从桥改到地下通道,因为据信敌方特工已被派去观看桥头会议.时间不变XX
在明显的位置恢复了单词划分。“ XX”显然是“空”字符,用于填充最后一组进行传输。
整个过程可以很容易地打包成自动算法来破解这些密码。由于正常的统计波动,这种算法偶尔会做出错误的选择,特别是在分析短密文时。
以上内容仅代表本人大学学习思考内容,如有侵权及时删除,欢迎讨论和指教!