栅栏密码

实践练习C++17

栅栏密码是一种换位密码。字符沿多条横向“栏杆”上下折返排列,随后按行读取,形成与原文顺序不同的密文。

任务说明

实现栅栏密码的编码与解码。

栅栏密码是一种换位密码,名称来自其排列方式,古希腊已有人使用。

沿假想栅栏的轨道向下写字符,到最底轨后转向上,形成折线,最后逐行读取。

例如,三条轨道编码 WE ARE DISCOVERED FLEE AT ONCE 时,先写成:

W . . . E . . . C . . . R . . . L . . . T . . . E
. E . R . D . S . O . E . E . F . E . A . O . C .
. . A . . . I . . . V . . . D . . . E . . . N . .

再按行读取:

WECRLTEERDSOEEFEAOCAIVDEN

解码时,先确定折线路径,再按行把密文填入。

? . . . ? . . . ? . . . ? . . . ? . . . ? . . . ?
. ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? .
. . ? . . . ? . . . ? . . . ? . . . ? . . . ? . .

第一行有七个位置,填 WECRLTE。

W . . . E . . . C . . . R . . . L . . . T . . . E
. ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? . ? .
. . ? . . . ? . . . ? . . . ? . . . ? . . . ? . .

第二行填 ERDSOEEFEAOC。

W . . . E . . . C . . . R . . . L . . . T . . . E
. E . R . D . S . O . E . E . F . E . A . O . C .
. . ? . . . ? . . . ? . . . ? . . . ? . . . ? . .

最后一行填 AIVDEN。

W . . . E . . . C . . . R . . . L . . . T . . . E
. E . R . D . S . O . E . E . F . E . A . O . C .
. . A . . . I . . . V . . . D . . . E . . . N . .

沿原折线路径读取,即可恢复消息。