Python密码学编程(第2版)
上QQ阅读APP看书,第一时间看更新

1.3 凯撒密码

即将学习的第一个密码是凯撒密码,它以早期使用者Julius Caesar的名字命名。它简单易学,但也因此极易被密码分析员破解。但是,它仍然可以用来进行练习。

凯撒密码通过替换字母完成加密,每个字母由字母表中其后特定位数的字母代替。例如,Julius Caesar将字母表向后移动3个字母的位置,然后用得到的新字母表中的字母替换原消息中的每个字母。

例如,消息中的每一个A都变成D,每个B都变成E等。当Caesar需要将字母表末尾的字母(如Y)移位时,他会绕回到字母表的开头,移动3个位置到B。在本节中,将使用凯撒密码手动加密消息。

1.3.1 密码轮

为了更方便地使用凯撒密码将明文转换为密文,将使用一个密码轮,也称为密码盘。密码轮包含两个由字母组成的环,每个环有26个槽(为字母表的26个字母准备)。外圈表示明文中的字母,内圈表示在密文中相对应的字母。内圈同样把字母从0到25进行标号,这些数字代表加密密钥,这里的加密密钥是指将A移动到内环上对应的字母所需经过的字母位数。因为轮盘是圆形的,用大于25的密钥移位会使字母表绕一整个圈,所以移动26位与移动0位相同,移动27位与移动1位相同,以此类推。

读者可以通过原书网站在线访问虚拟的密码轮,其形式如图1-1所示。为了旋转密码轮,需要先单击它,然后移动鼠标光标,直到想要的配置到位。再次单击鼠标,密码轮停止旋转。

图1-1 在线密码轮

在本书的配套资源中也可以获得可打印的纸版密码轮。剪下两个圆圈,把它们叠放,小的圆圈放在大的圆圈中间。在两个圆圈的中心插入一个大头钉或曲头钉,这样它们就可以旋转了。

无论使用纸质密码轮还是虚拟密码轮,都可以完成手动加密。

1.3.2 使用密码轮进行加密

开始加密前,请先用英文在一张纸上写下待加密的消息。在这个例子中,待加密消息是“THE SECRET PASSWORD IS ROSEBUD”。接下来,旋转密码轮的内轮,直到它的槽与外轮中的槽相匹配。注意外轮上字母“A”旁边的点,点在内轮上最接近的数字就是加密密钥。

例如,在图1-1中,外轮的“A”对应内轮的8。现在使用8作为加密密钥来加密上面例子中的消息,如图1-2所示。

图1-2 用8作为密钥的凯撒密码加密消息

在外轮上找到消息中的每一个字母,并用内轮中对应的字母替换它。在这个例子中,消息的第一个字母是“T”(在“THE SECRET…”中的第一个“T”),因此在外轮上找到字母“T”,然后在内轮上找到对应的字母,也就是字母“B”。秘密信息总是用“B”替换“T”。(如果使用不同的加密密钥,则明文中的每个T将被替换为其他的字母。)消息中的下一个字母是“H”,加密时变成“P”,而字母“E”变成“M”。外轮上的每个字母总是加密为内轮上固定的对应字母。为了节省时间,在查找“THE SECRET…”中的第一个“T”并且发现它加密变成“B”之后,就可以将消息中的每个“T”都替换为“B”,因此每个字母只需查找一次。

在对整个消息进行加密之后,原始消息“THE SECRET PASSWORD IS ROSEBUD”就变成了“BPM AMKZMB XIAAEWZL QA ZWAMJCL”。注意,非字母字符(如空格)是没有改变的。

现在,可以把这个加密后的消息发送给他人(或者自己保存),除非告诉他们密钥,否则没有人能够读懂消息的含义。请确保加密密钥是保密的,因为任何知道消息是用密钥8加密的人都可以读懂密文。

1.3.3 使用密码轮进行解密

要对密文进行解密,需要查找从密码轮的内轮到外轮的映射。假设接收的密文为“IWT CTL EPHHLDGS XH HLDGSUXHW”,除非知道密钥(或者是一个聪明的黑客),否则将无法解密该消息。幸运的是,朋友已经提前告知,他们对消息加密时使用的密钥是15。该密钥的密码轮如图1-3所示。

图1-3 密钥设为15的密码轮

现在可以将外轮上的字母“A”(下面带点的那个字母)与内轮上的数字15(字母“P”)相对应。然后,在内轮上找到密文的第一个字母,即“I”,并查看外圈对应的字母,即“T”。密文中的第二个字母“W”解密为字母“H”。对密文中剩下的字母进行解密,还原成明文,可以得到完整的消息“THE NEW PASSWORD IS SWORDFISH”,如图1-4所示。

图1-4 用密钥为15的凯撒密码解密消息

如果使用不正确的密钥(如16),则解密的消息将是“SGD MVV OZRRVNQC HR RVNQCEHG”,依然不可读。除非使用正确的密钥,否则解密出来的消息也是不可理解的。

1.3.4 通过计算进行加密和解密

使用密码轮实现凯撒密码的加密和解密是十分便捷的,但是也可以通过数学计算进行加密和解密。在此过程中,从“A”到“Z”写出字母表中的字母,在每个字母下标注数字0~25。从“A”下面的0开始,“B”下面是1,以此类推,直到“Z”下面是25,如图1-5所示。

图1-5 为字母标号0~25

可以用这些数字来表示对应的字母。这是一个强有力的概念,有了它的存在,就可以在字母上进行数学运算。如果将字母“CAT”表示为数字2、0和19,分别加3获得数字5、3和22,则根据图1-5,这些新的数字表示字母“FDW”,这样就实现了为“CAT”加密。稍后,会设计一个计算机程序实现这一计算过程。

要运用算术实现凯撒密码的加密,请找到要加密的字母下方的数字,并将其加上密钥的值,得到的和就是对应密文字母下的数字。可以使用1~25的任意数字作为密钥,例如,使用密钥13加密“HELLO. HOW ARE YOU?”。首先,找到“H”下的数字7,然后加上13:7+13=20。因为数字20在字母“U”之下,所以字母“H”加密得到“U”。

类似地,加密字母“E”(4)为4+13=17。因为17对应的是“R”,所以“E”加密得到“R”,以此类推。

直到字母“O”之前的过程都很顺利。“O”之下的数字是14,但是14加上13是27,而序号只到25。如果字母对应的数字和密钥相加的和是26或者更多,则需要从结果中减去26。在此例中,27−26=1。1对应的字母是“B”,因此“O”用密钥13加密得到“B”。消息中的每一个字母加密完成后,密文是“URYYB. UBJ NER LBH?”

要对密文进行解密,需要减去密钥而不再是进行加法运算。密文字母“B”对应的数字是1,1减去13得到−12。类似于“减去26”的加密规则,当解密结果小于0时,需要加上26。因为−12+26=14,所以密文字母“B”解密为“O”。