练习15A、15Ba和15C学习顺序不分先后。
密码学是隐藏信息的艺术和科学。在某种意义上,只有一些人可以看到它。在这一课中,我们将介绍一个最简单的加密方法,凯撒密码 (也被称作 移位密码), 同时你会写一个程序来破解它。你需要全方位设计你的解决方案(不像课程15A,我们把问题分为了不同部分)。
凯撒密码的加密方法是:每当你想要加密一段文字时,你需要选择一个移位值 S, 它是一个0到25之间的整数。然后,你把文字中的每一个字母用S个位置之后的字母替换(假设S=1,那么A就用B替换)。如果位置超过了Z,那么就要从A开始继续数。
例子
假设我们想对以下秘密信息进行加密:
JOIN ME AT EIGHT BY THE ZOO
使用移位值 S=2。加密规则说每个字母都要被在字母表中它后两位的字母替换。例如,字母表是 ABCDEFGHIJKL..., 第一个字母J
会被字母L
代替。以此类推,O
会被Q
代替,I
会被K
代替。要想加密Y, 我们必须返回到字母表的开始:在Y之后是Z,接着就是A,所以Y
会被A
代替。同样的,Z
会被B
代替。所以加密后的文字就变成了:
LQKP OG CV GKIJV DA VJG BQQ
如果间谍看到了这个信息,那你的信息对他们来说是比较难理解的。
解码
当你的朋友拿到一条加密信息, 如果他们知道秘密移位值S,那么对于他们来说解密就变得非常简单:每一个字母都被字母表上S位前 的字母代替。例如,当看到 L
,他们就会向前移两位并找到J
,那么他们就知道了你秘密信息的第一个字母。接着,他们必须把字母表看成一个圆圈,假设 Z
在A
之前。
HUD
,移位值 S=6,那么原来的信息是什么(请使用大写)?为坏人工作
你被一个间谍雇来帮助破解一个使用移位密码加密的消息。但是间谍不知道S的值。你将要使用数据来编写一个程序,它将很有可能自动找到S
我们的方法是使用字母频率分析。在英语中,一些字母会经常出现(比如E),而另外一些出现的频率会很少(比如J)。下面是一张基于在很多文字中分析出的频率表。
A | B | C | D | E | F | G | H | I |
---|---|---|---|---|---|---|---|---|
.0817 | .0149 | .0278 | .0425 | .1270 | .0223 | .0202 | .0609 | .0697 |
J | K | L | M | N | O | P | Q | R |
.0015 | .0077 | .0402 | .0241 | .0675 | .0751 | .0193 | .0009 | .0599 |
S | T | U | V | W | X | Y | Z | |
.0633 | .0906 | .0276 | .0098 | .0236 | .0015 | .0197 | .0007 |
例如, L的频率是 .0402=4.02%,表明在平常的英语文字中,4.02% 的字母是L。
把每个字母在上面表格中的值称为强度。然后创建我们的统计方法:将一个句子的强度定义为等于每一个字母的强度之和。例如字符串GOOD
的强度是
goodness("GOOD
") = .0202 + .0751 + .0751 + .0425 = .2129
现在,频率分析背后的想法是,更高强度的字符串更可能代表正确的英语文本。例如,如果间谍看到加密的消息是"JRRG
",它的原始内容可能是移位值
S= 3 的”GOOD”,或者移位值S= 1 的”IQQF”。但是"IQQF
" 的强度是
goodness("IQQF
") = .0697 + .0009 + .0009 + .0223 = .0938
因为 .0938 < .2129,所以你的程序应该得出结论: GOOD
比IQQF
更有可能是正确的破解信息。
用强度来测量字符串并不是完美的。假设秘密信息是JAZZ ,并且移位值是S=10,所以加密后的信息是TKJJ . 当你输入TKJJ 到你的解码程序中,它会尝试S=10作为一种可能,并给出强度为.0846,但强度最高的移位值是S=5,给出强度为.3514的 OFEE 作为对秘密信息的最佳推测。所以你的程序会输出一个并不存在的英语单词OFEE (这种类型的频率分析最好是使用在较长的秘密信息上)。 |