苏砂

勿忘初心

全职高手张安同人《解码》repo 2.0

如此读者,夫复何求【不
祖国的未来就靠你了!
特别感谢22熬夜写了这么细致的一篇repo,能得到一名专业人士的认同,是我莫大的荣幸
以及我设置这个密码的关键就在于“只有安文逸能解”,这是这篇文最基本的主线

安家后院一口井:

 -严重涉及剧透,慎入!

-对1.0感兴趣的戳这里

@苏砂 你早该请我做理论顾问!

 

全职高手张安同人《解码》repo 2.0
  
  我之前写过一个关于《解码》的repo,主要说感情,现在这个,主要说密码。作为一个信息安全专业应用密码学方向的研究生,我认为作为一篇文学小说,这里面密码的设置很成功。而这个成功很重要的一点在于,能够让不懂密码学的人看懂,也许缺乏专业的严谨性,经不起细致、现实的推敲,但作为小说中运用的一个辅助元素,很有生命力。
  以下我主要结合部分原文,从较为专业的理论角度介绍文中主要提到的两个古典密码方法,并对其应用提出个人拙见。
  
  ZYVTGRNRSLUEQEMWERSQEUWSKITHAALEPJARWQKHJMQSQ
  
  “这是一段由四十五个英文字母所组成的字符段,元音字母十一个,占字母总数的百分之二十四点四,小于通常的元音字母在英文单词所组成的字符段中出现的百分之三十七点四的频率。不过由于这一串字符段的字母基数过小,这样的数据也仅能作为一个侧面的参考。更何况字母E在这段文字中出现的概率为百分之十一点一,与通常频率的百分之十二点二五非常接近,让安文逸的脑海中渐渐地浮现了一种可能性。
  最简单的换位密码?”
  
  换位密码:又叫移位密码,是古典密码技术中的一种单表替代密码,原理是对明文消息(未加密的信息)中的每个字母依次进行变换得到密文消息(加密之后的信息),变换方法是把明文消息中的每一个字母用26个英文字母中的另一个替换。
  这种情况下,26个英文字母与整数0,1,2,3,...,25一一对应。假设用函数EK()表示在密钥K(加密规律的关键信息)下作用的加密过程,M代表明文,C代表密文,DK()表示在密钥K下作用的加密过程,则数学表达为:
  加密过程 EK(M)=M+K(mod 26)
  解密过程 DK(C)=C-K(mod 26)
  其中mod表示取余数,即:K(mod 26)表示K除以26的余数,这么做是考虑当K大于26的情况。而当K小于26时,明文对应的密文就是每个字母用该字母后的第K个字母替代。

  对于这种单表替代密码可以用穷举密钥的方法进行破译,就是一个一个试,猜测密文中每个英文字母实际对应明文中的哪个英文字母。此外,一旦密文的消息足够长,可以利用语言的统计特性破译,即根据各个密文字母出现的频率高低来猜测它实际代表的明文字母。而通过对大量英文语言的研究,每个字母出现的频率不一样,e出现的频率最高。
  英文字母使用频率表:(%) 
A: 8.19  B: 1.47  C: 3.83  D: 3.91  E: 12.25  F: 2.26  G: 1.71  H: 4.57  I: 7.10  J: 0.14 K: 0.41  L: 3.77  M: 3.34  N: 7.06  O: 7.26  P: 2.89  Q: 0.09  R: 6.85  S: 6.36  T: 9.41 U: 2.58  V: 1.09  W: 1.59  X: 0.21  Y: 1.58  Z: 0.08
  当然这个统计表根据统计时间不同具体数值也不同,但是各字母的频率高低排序基本是不变的。另外,不同题材的文献中字母出现的频率排列也不同。同时,还有字母组合出现频率的统计,这个信息对于破解密码也很重要,不过这里就不具体举例了。
  
  “「Vigenere」。
  这世上的任何一名情报人员,大概都不会对这个单词感到陌生。作为一种至今依然在流行的古老的加密方式,维热纳尔密码的安全性自然毋庸置疑。”
   
  这里提到的Vigenere(维热纳尔)密码(注:这是一个法语词,以法国密码学家Blaise de Vigenere的名字命名)又称弗吉尼亚密码。这是最古老且最著名的多表替代密码,该密码有一个参数N,加解密时同样把26个字母一一映射为0,1,2,3,...,25的数字再进行运算,并按N个字母一组来变化。其中密钥K的长度为N,明文M、密文C都以N的长度为单位运算:
  设密钥K=(K1,K2,K3,..,KN),明文M=(M1,M2,M3,..,MN),加密变换为:
  EK(M)= (C1,C2,C3,..,CN),其中Ci(Mi+Ki)(mod 26),i=1,2,3,...,N
  设明文C=(C1,C2,C3,..,CN),密钥K=(K1,K2,K3,..,KN),解密变换为:
  DK(C)= (M1,M2,M3,..,MN),其中Mi(Ci-Ki)(mod 26),i=1,2,3,...,N
  注意:K的长度为N,但M和C的长度均可不等于N,只是以N为单位重复运算,具体如下例。
  例:设密钥k=cipher,明文消息为appliedcryptosystem,用该密码对其进行加密并解密。
  解:密钥k=cipher,则N=6,将明文按6个一组分组,并转化成对应密文


  与之前的单表替代密码相比,多表替代密码一定程度上隐藏了明文消息的一些统计特征,破译相对较为困难。首先需要确定密钥的长度,可使用Kasiski测试法和重合指数法。
  从安全性的角度,目前来说,古典密码学的安全性都不高,可以说古典密码学算法虽然很有趣味性,但是基本已经退出历史舞台,取而代之的是基于数学难题的现代密码学体制。但是在这篇文的背景下,未涉及现代密码体制,而在古典密码学范畴,多表替代密码的安全性确实比单表替代密码好,当然,这里使用的维热纳尔密码并不是安全性最好的。只是一直以来,在密码领域,安全性和便捷性某种意义上是相互制约的,所以一个密码的选用往往不能只看安全性,要综合很多因素考虑。
  
  “即便是拥有全世界最尖端的电子计算机,破解一段用维热纳尔密码加密的字符段依然需要大量的人力与物力。更何况张新杰所留下的讯息中只有短短的四十五个字符,如果这段信息的密钥单词在十个以上,那么想要破解这段讯息便几乎是一个不可能完成的任务。”
  
  在这篇文的背景下,关于全世界最顶级的计算能力,作者的说法就是设定。不可否认因为作者本身并不是学密码学出身,其中难免会有一些漏洞。对此我只想说,砂砂要是早点儿认识我做她的理论顾问就好了。【
  
  “如果假定张新杰是以维热纳尔密码加密了这段字符,那么45这个数字则非常值得玩味。首先将45作质因数分解,得到一个3×3×5的结果。那么45的因数则有1、3、5、9、15、45六种选择。依照张新杰严谨的个性,他绝对不会允许在密钥中断的情况下完成对这段文字的加密,那么排除1和45这两个极端的可能性,所剩下密钥单词的字母数量的可能性只有3、5、9、15四种选择。
  而由于9和15这样的密钥字符数对于一段仅由45个字母构成的字符段来说实在毫无必要,那么组成密钥单词的字符数便只剩下3和5这两项选择。
  安文逸毫不犹豫地便将目标锁定在了5这个数字上。”
  
  根据上面介绍维热纳尔密码的原理可知,最理想的情况下,明文、密文长度都是密钥长度的整数倍。这就是文中提到“依照张新杰严谨的个性,他绝对不会允许在密钥中断的情况下完成对这段文字的加密”的意思。既然是整数倍,那么在猜测密钥长度的时候就要分析密文长度的因数,具体情况就是文中所说。只是,我之前提到,破解这种多表替代密码时,猜测密钥长度的方法理论上可使用Kasiski测试法和重合指数法。但在实际的密码破解中并不一定要这么教条主义,就像文中分析的,既然45的因数只有1、3、5、9、15、45,对应组成密钥单词的长度,可想而知5比较合适。(具体推理过程参加原文)
  简单的说一下Kasiski测试法。它是F.Kasiski于1863年描述的一种重码分析法。基本思想:用给定的N个字母表周期性地对明文字母加密,则当两个相同的明文段在明文序列中间隔的字面数为N的整数倍时,将加密成相同的密文段。
  可以想象,这种方法是针对长度很长的密文,因为当密文很长,文中的方法显然就不适用了。因为对于一个长度为L(假定L是一个很大的数)的密文,无法简单的通过推理选择合适的因数并且一一尝试。在我看来文中破解密钥长度的方法不能说不对,只能说很有局限性,不过恰好适用于这里的密码,那么它就是最好的方法。
  
  “安文逸逐个排除着每一个单词的可能性,手中的弹夹也越甩越快,发出着急促的「咔咔咔」的声音。安文逸的手心已经布满了密密麻麻的细汗,此时握着枪的手忽然一滑,弹夹便朝前飞了出去,穿过照映进窗口的夕阳,嘭地一声落在了地上。
  在弹夹飞进光线的一瞬,刻在弹夹底部的激光镭射字母在阳光的反射下一闪而逝。
  那是代表生产这只弹夹的军工厂的代号,虽然只有短短的一瞬间,却也足够让安文逸的捕捉并记下这一串字符。在一朵玫瑰标志的旁边,几个字母工整地列成一排,在夕阳的映衬下熠熠生辉。
  「BLOOD&GLORY」。
  「血与荣耀」。
  「GLORY」。
  「荣耀」。”
  
  关于密钥的选择,理论上为了保证密码的安全性,肯定要选用不容易想到的密钥。事实上我在看这篇文的时候也是一秒猜出了这个密钥。但是小说跟现实的不同就在于,它使用很多元素并不一定非要严谨得如同教科书,反而应该有一些作者想表达的东西。虽然这个密钥很简单,但是我很喜欢,无关密码学,只谈“荣耀”。而且其实从后文来看,张新杰这个密码就是为安文逸设计的,这里选用这个密钥也是为了安文逸能够顺利解出。至于万一被敌方猜到这个密钥怎么办的问题,我后面会针对这个密码特殊的安全性保障设计进行说明。
  
  如果我上述介绍还算清楚,那么大家可能会发现维热纳尔密码实际的安全性并不是很好。尤其是对于文中这样短小的密文,安文逸能想到的破解方法认真来说别人也能想到。为什么不用更安全一点儿的古典密码,比如一次一密密码。这里我就不具体说这个密码的原理,有兴趣的人都可以百度得到,我只说为什么这个密码的应用情况并不好。该密码体制要求:密钥是真正的随即序列;密钥长度大于明文长度;每个密码只用一次(一次一密)。也就是说要求很高,实现难道大。
  当然,对于文中这种明文不长的情况其实是可以尝试的,至于为什么不用,我猜是砂砂不喜欢?【
  其实主要还是我之前提到的“一个密码的选用往往不能只看安全性,要综合很多因素考虑”,至于这里为什么选择这个密码,是综合哪些因素,我想更多的可能是行文效果?【
  
  后面关于莫尔斯电码和栅栏密码我觉得很简单,文中已经解释得很清楚我就不再赘言了。再之后则主要涉及张新杰个人对于整个密码的设计,比如巧妙地算计了自己心脏停止的时间,以安文逸的Soldier’s Number作为口令等等。至于最后的启动芯片销毁程序的密码更是最简单的字母数字对应替换,相信每个看过的人都印象深刻——
       “「2081141119 , 1325 , 1215225」
       「Thanks , My Love」。”
  
  总的来说,整篇文章的密码设置其实很简单,都是最浅显易懂的古典密码学方法,即便是不懂密码学的人也可以通过一定的思考完全明白。然而正是因为这样,按照文中设定的秘密级别,这个密码的安全性是值得质疑的。而对于这个问题,我的看法有两点:
  一是砂砂本身作为一个密码学爱好者,自己设计密码的能力有限,同时又要考虑简单易懂或者行文效果只能这样安排,老实说我还蛮喜欢这个设计的,并且认为这个看起来不太严谨的问题根本不是问题;
  二是决定这个密码安全性的关键并不是密码本身,而是安文逸。
  是的,这个密码的算法很简单,但里面许多关键的突破口却都有一个共同特点——不是安文逸根本不可能知道,或者说敌方很难得到。所以从这个角度来看,这个密码的安全系数实在很高,虽然决定它安全系数的东西并不是“科学”。但正是因为这样,才体现了密码元素在这篇文中的意义。毕竟,砂砂写这篇文并不是炫耀她的密码学知识,而是为了通过借由密码元素深刻讲述一个张新杰与安文逸彼此了解、彼此信任、彼此相爱的故事。
  多余的话我不说了,因为我也只是一个旁观者,只是想在时隔这么久重看这篇文之后,换一种方式表达我对《解码》的理解。同时再一次感谢砂砂写了这么好的张安故事,不管是被虐被感动还是被震撼,能够在这样的日子里遇到,实在是一件幸运的事情。
  今天会写这篇repo确实有些原因的,但当我重看《解码》并打开这个文档,就已经“不对事不对人”了。相信所有喜欢《解码》喜欢张安的人多多少少都有相似的心情,也一定有各自不同的理解,这中间自然是不分对错的。
  而我只是突然想说说自己的这一种。

 

评论(8)

热度(248)