本节书摘来自异步社区《Python密码学编程》一书中的第1章,第1.9节,作者 [美] Al Sweigart(斯维加特),李永伦 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.9 不用纸质工具做加密
在使用凯撒加密法做加密和解密时,加密轮盘和St. Cyr滑条都是很好的工具。但我们只用铅笔和纸也可以实现凯撒加密法。
把字母表的字母从A到Z写下来,在每个字母下面写下数字0到25。在A下面写0,B下面写1,如此类推,直到在Z下面写25(字母表里有26个字母,但我们的数字最多只到25,因为我们从0而不是1开始的)。最终看起来像这样:
有了上面这个从字母到数字的代码,我们就可以用数字来表示字母了。这是一个非常强大的概念,因为数学使用数字。现在我们可以在字母上做运算了。
现在,如果要加密,我们找到希望加密的字母下面的数字,然后把密钥数字加上去。这个和就是加密的字母下面的数字。如,我们使用密钥13加密“Hello. How are you?”。首先,我们找到H下面的数字,是7。接着,我们把密钥加上这个数字,7 + 13 = 20。数字20在字母U下面,这意味着字母H加密成字母U。如果要加密字母E,我们把E下面的4加上13,得到17。17上面的字母是R,因此E加密成R。如此类推。
直到我们遇上字母O时这个方法才会出问题。O下面的数字是14,当把14加上13时,我们得到27。但我们的数字列表最多只到25。如果字母的数字和密钥之和超过26,我们应该减去26,27 – 26得到1。数字1上面的字母是B。于是,当使用密钥13时,字母O加密成字母B。一个接一个地,我们可以把“HELLO. HOW ARE YOU?”里的字母加密成“URYYB. UBJ NER LBH?”。
因此,加密一个字母的步骤是:
1.从1到25选一个密钥。保管好这个密钥!
2.找出明文字母的数字。
3.把密钥加到这个明文字母的数字。
4.如果这个数字大于26,则减去26。
5.找出你计算的数字的字母。这就是密文字母。
6.对明文消息里的每个字母重复步骤2~5。
表1-1演示了如何使用密钥13加密“HELLO. HOW ARE YOU?”里的每个字母。每列演示了把左边的明文字母变成右边的密文字母的步骤。
如果要解密,你需要理解负数是什么。如果你不知道如何加和减负数,可以参考教程http://invpy.com/neg。
如果要解密,减去这个密钥,而不是加上它。对于密文字母B,这个数字是1。1减去13得到−12。就像加密的“减去26”规则,当解密并且结果小于0时,我们有一条“加上26”的规则。−12 + 26是14,因此,如表1-2所示,密文字母B解密回字母O。
如你所见,使用凯撒加密法加密是并不真的需要加密轮盘。如果你记住数字和字母,你甚至不必写下字母表以及它们下面的数字。你只需心算就可以写出秘密消息了。