伏魔平天下——恺撒密码

2018-07-12 05:09王丽丽
中国信息技术教育 2018年12期
关键词:恺撒字符咒语

王丽丽

● 情境导入

赢了守护使这一关,阿派终于进入了那一方神秘世界。一路上,他披荆斩棘、伏魔降妖平天下,并获得了胜利的奖励——魔法羊皮卷。展开卷宗,只有一行看不懂的咒语,内容是PQ ETQUU PQ ETQYP。阿派照着字母念了几遍,都没有任何动静。忽然,他想到一种古老的加密方法——恺撒密码。于是,他一遍又一遍地尝试,终于发现若将所有字母都往前移2位,就可以形成一句有含义的话:NO CROSS NO CROWN(不经历风雨,怎能见彩虹)。阿派大声朗读出破解的咒语,只见一道金光闪现。

这节课的设计灵感来源于恺撒密码的故事。传说,古罗马皇帝恺撒在打仗时曾经使用“字母错位”的方法来加密军事情报。本课中,教师带领学生理解这种古老而简单的加密方法,并利用Python语言实现加密和解密。

● 恺撒密码的加密和解密思想

在苏托尼厄斯于公元二世纪写的《恺撒传》中,对恺撒密码作了详细描述,简而言之,就是将真正的信件内容(明文)中的每一个字母用其后的第N个字母代替,转换成一封密信(密文)。这样,即便敌军截住信件,也不知其意。据说,这种加密方法在当时的古罗马颇为流行。这种将字母表中的字母移动一定位置而实现加密的方法,被称为“恺撒移位密码”,简称“恺撒密码”。移动的位数N就是加密和解密的密钥。

如图1所示,前文中破解咒语的密钥为2,也就是明文和密文表中的字母相错两位。A加密后所对应的字母就是后两位的字母C,以此类推,且A~Z循环,因此,字母Z的加密字母为B,解码的过程正好与之相反。

恺撒密码的编码方法相对简单,密钥也只有25种,只需逐个试验,很容易破解,但这种加密、解密的思想影响深远。现今的密码术不断发展,大致可分为两种方法,即移位和替换,或者将两者结合产生更复杂的方法,但万变不离其宗,其核心还是算法和密钥。

● 破解咒语

恺撒密码的算法思想,前面已经解读,此处不再赘述。但在Python中实现咒语的破解(解密),还需要了解字符在计算机中的表示方式。英文字母在计算机中通常采用ASCII码表示,占一个字节。如图2所示,密文中的字符P转换为明文字符N的过程是这样的:先利用ord()函数将ASCII字符P转换为对应的ASCII数值80;再根据密钥2进行倒推,计算出其明文的字符所对应的数值应为78;最后利用chr()函数将数值78转换为对应的ASCII字符N。在这里,ord()和chr()这两个函数的效果正好相反,结合两者,可以实现字符的加密或解密。

利用Python语言实现破解咒语的具体过程如上表所示。想一想,如何允许用户自行输入咒语的文字信息,该如何修改程序?

isupper( )方法的作用是检测字符串中所有的字母是否都为大写,如果所有字符都是大写,则返回True,否则返回False。例如,字符A的ASCII码值是65,密钥为2,因此在前移2位后,ASCII码值变成了63,对应的字符是问号“?”,非大写字母。此时,可在63的基础上再向后移位26位,对应码值为89(字符Y),即字符A对应的密文字符为Y。这样,就形成了A~Z的循环。

● 加密咒语

本课中,阿派所破解的羊皮卷咒语是指定的密钥2。加密的过程与解密相反,前移2位,变为后移2位,即-2。A~Z的循环处理,也是一样,+26变为-26。此外,利用input()函数,允许用户自行输入咒语内容,具体的Python代码如图3所示。

upper( )方法的作用是将字符串中的字母全部转换为大写字母。这样,如果用户输入的明文信息包含了大小写字母,都会统一转换为大写字母,再进行加密。

● 自定义密钥加密咒语

使用不同的自定义密钥进行加密,可以提高信息传递过程中的安全性。如图4所示,新增变量key,提示用户选择1~25之间的某一个整数作为密钥,实现自定义密钥的加密咒语。

如果想让这段程序更加实用,还可以询问用户选择加密还是解密,多一次判断,使用户在同一个程序内可以自由选择加密或解密模式。

● 其他加密方法

由于恺撒密码的秘钥设置只有1至25,很容易被暴力破解,因此,人们在此基础上进一步改善,主要方法是将密文的字母顺序打乱。例如,圆盘密码就是典型的利用单表置换的加密方法。在两个同心圆盘上,外圈按照A~Z的字母序排列,内圈则按不同的顺序填好字母或数字。转动圆盘就可以找到字母的置换方法,很方便地进行信息的加密与解密。恺撒密码与圆盘密码本质都是一样的,都属于单表置换,即一个明文字母对应的密文字母是确定的,截获者可以分析字母出现的频率进行破译。为了提高密码的破譯难度,人们又发明了一种多表置换的密码——维吉尼亚密码。这种加密方法是根据密钥决定用哪一行的密表来进行替换。因此,一个明文字母可以表示为多个密文字母,使得针对单表置换的用词频分析来破译的方法失效,安全性更高一些。古代密码的编码方法还有很多。例如,滚桶密码(又称密码棒),利用字条缠绕木棒的方式,实现字母的位移,收信人要使用相同直径的木棒才能还原真实的信息。随着社会发展,现代密码引入了公钥和私钥的概念,也被称为非对称密码学,与只用一个钥匙的密钥密码学相对应。从恺撒密码,到现代密码学,你可以选择一个有兴趣的加密方法,了解更多加密原理,并利用Python来设计和编写程序,试着模拟一次你的密信传递和破译过程吧!

猜你喜欢
恺撒字符咒语
让河流改道
Python实现图片转字符画
让河流改道
正则表达式快速入门
图片轻松变身ASCⅡ艺术画
咒语
法医出手,恺撒瞑目
视频监视系统中字符叠加技术的应用
恺撒的圈套
怪童丸的咒语