15C: 凯撒密码

练习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=5来加密SPY CODER的结果会是什么(使用大写)?你还可以在操作台 中编写一个程序来计算它,它在后面可能会对你有帮助。
正确!

解码

当你的朋友拿到一条加密信息, 如果他们知道秘密移位值S,那么对于他们来说解密就变得非常简单:每一个字母都被字母表上S 的字母代替。例如,当看到 L,他们就会向前移两位并找到J,那么他们就知道了你秘密信息的第一个字母。接着,他们必须把字母表看成一个圆圈,假设 ZA之前。

简答练习: 间谍解码员
如果加密的信息是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,所以你的程序应该得出结论: GOODIQQF更有可能是正确的破解信息。

强度来测量字符串并不是完美的。假设秘密信息是JAZZ,并且移位值是S=10,所以加密后的信息是TKJJ. 当你输入TKJJ到你的解码程序中,它会尝试S=10作为一种可能,并给出强度为.0846,但强度最高的移位值是S=5,给出强度为.3514的 OFEE 作为对秘密信息的最佳推测。所以你的程序会输出一个并不存在的英语单词OFEE(这种类型的频率分析最好是使用在较长的秘密信息上)。

编程练习: 自动破解
编写一个程序,使它完成以下几件事:首先,它应该读入一行输入,
这行就是被加密的消息,这个消息包括大写字母和空格。你的程序必须测试所有26种可能的移位值S;在这26个可能的原消息中,打印出那个强度最高的。

为了方便起见,我们会先为你定义好变量letterGoodness,它是一个长度为26的列表(列表中的每一项都对应上方频率表中的值),

letterGoodness = [.0817,.0149,.0278,.0425,.1270,.0223,.0202,...
点击这里来这看一些基本建议。

上面的解决方案被称为暴力破解方案,因为你只是尝试了所有26种可能性。如果需要的话,你甚至可以人工来做这件事。另一方面,在现代密码协议中,这些密码设计的目的,都是使暴力破解方案失效(即使你使用非常快的电脑来尝试所有的可能性)。

如果你想使这个自动解码系统更准确,你可以注意其他的英语统计,如“什么字母有可能与其前面或后面相连的字母一起出现?什么字母有可能开始一个单词开头?”

你已经完成了这节课!现在你可以给你的朋友发一条秘密信息来庆祝了。