你有没有在操场上玩过一种游戏:老师让全班同学按身高排成一排,然后喊“报数”!同学们依次报出数字。如果老师换一种方式:让同学们排成两排,第一排是1、3、5、7……号,第二排是2、4、6、8……号,然后再按顺序读出来,队伍的“信息”就变了。
栅栏密码(Rail Fence Cipher)玩的正是这个游戏。它不改变任何字母,只是重新排列它们的位置——就像把一队士兵重新整队,队形变了,但士兵还是那些人。
最简单的栅栏:两行之字形
最经典的栅栏密码是两行版本。它的加密方式很简单:
- 把明文按之字形(上下交替)写在两行“栅栏”上。
- 然后按行依次读出字母。
举个例子,我们要加密一句话:WE ARE DISCOVERED(我们被发现了)。去掉空格后得到:WEAREDISCOVERED。
现在,我们把它写成两行,像织布一样上下穿梭:
第一行:W . A . E . I . C . V . E .
第二行:. E . R . D . S . O . R . D
(点表示该位置没有字母)
把字母按行收集:
第一行:W A E I C V E
第二行:E R D S O R D
拼接起来:WAEICVE ERDSORD(可以写作 WAEICVEERDSORD)。
这样,原本有规律的字母序列,变成了看似随机的串。
三行、四行……更多栅栏
当然,栅栏的“栏杆”数量可以任意。比如,用三行加密 WEAREDISCOVERED:
第一行:W . . . R . . . I . . . E .
第二行:. E . D . S . C . V . R .
第三行:. . A . . . O . . . D . .
按行读取:
第一行:W R I E
第二行:E D S C V R
第三行:A O D
得到密文:WRIE EDSCVR AOD(合并为 WRIEEDSCVRAOD)。
行数就是栅栏的“深度”,也是这个密码的密钥。
解密:重新搭起栅栏
解密同样需要知道行数。把密文字母按行数依次放回栅栏,再按之字形读出原文。
以两行密文 WAEICVEERDSORD 为例,假设我们知道深度为2。先计算字母总数:14个。两行应大致均分:第一行7个,第二行7个。
把密文前7个字母(W A E I C V E)放到第一行,后7个(E R D S O R D)放到第二行。然后按之字形读取:先取第一行第一个,再第二行第一个,再第一行第二个,再第二行第二个……得到:W E A R E D I S C O V E R D。加上空格:WE ARE DISCOVERED。
栅栏密码的安全吗?
栅栏密码的密钥只有“行数”这一种可能,而行数通常不会超过明文长度。对于短文本,尝试几种行数就能暴力破解。比如上面的密文,你只需试2行、3行、4行……很快就会得到有意义的英文。
此外,栅栏密码虽然保留了所有字母,但破坏了单词的边界和顺序,所以它比凯撒密码略强一点——至少不能直接读出来。但在计算机面前,它仍然脆弱不堪。
历史的踪影
栅栏密码据说在古代曾被用于传递简短军情,因为它简单快速,不需要任何工具。甚至在20世纪的一些间谍小说中,也能见到它的身影。不过,它更多是作为一种智力游戏流传至今——许多报纸的“密码解谜”栏目里,栅栏密码都是常客。
动手试试
- 用两行栅栏加密:
HELLO WORLD(去掉空格)。 - 用三行栅栏加密:
CRYPTOGRAPHY。 - 破解下面这段密文(深度未知):
HLOOLELWRD。(提示:试试深度2)
如果你会Python,可以写一个简单的加密函数:
def rail_fence_encrypt(text, rails): |
栅栏密码是换位密码中最简单的一种。它让我们看到,仅仅改变顺序,也能藏住信息。但真正的密码学远不止于此——下一节,我们将走进更复杂的矩阵换位,看看如何用表格和密钥把信息彻底“揉”乱。