1. 背景介绍
在篱笆密码法中,明文由上至下顺序写上,当到达最低部时,再回头向上,一直重复直至整篇明文写完为止。然后,再往右顺序抄写一次。
例:明文为:'WEAREDISCOVEREDFLEEATONCE',篱笆条数3,加密过程如下:
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 . .
例:明文为:'WEAREDISCOVEREDFLEEATONCE',篱笆条数3,加密过程如下:
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
对于篱笆加密,网上是没有很具体的算法。 考虑到这一点,我才将我自己总结出来的具体算法写在博客里。
2.具体算法
2.1.整体思路
首先根据篱笆条数将明文按一定的方式存储到一维数组中,然后按一定的判断条件顺序取出。
2.2.存储
假设我要加密ABCDE...XYZ,用5条篱笆
A0 I9 *10 Q19 *20 Y29 *30
B1 H8 J11 P18 R21 X28 Z31
C2 G7 K12 O17 S22 W27
D3 F6 L13 N16 T23 V26
E4 *5 M14 *15 U24 *25
字符右面的小写的0.1.2.3...31, 代表的是该字符存储一维数组的序号。 这里的规律其实就是:if(i%n==0)存储特殊“*”。 “*”的位置可以不用赋值,为了验证存储是否正确,也可以存一个特殊的字符。
2.3.取出
数据当然是一行一行的取出,在取一行一行的取出的时候,第一列的数据可以不用管。直接取出
这里用i变量来表示字符在数组中的序号。
假设行数用L表示。
2.3.1.取首行
先取序号为0的字符A。 L=1。即:序号为L-1
然后依次取出满足if((i+1)%(2*n) == 0)条件的字符。 这里i+1其中的i。 其实就是L。
本例的n=5。那么当i = 9,i = 19,i = 29的时候,满足以上条件。就被取出了。看2.2的存储表可验证
2.3.2.取中间行
比如第二行,首先取出序号为1的字符B。L=2。即:序号为L-1
然后依次取出满足if((i+2)%(2*n)==0 || (i-1)%(2*n)==0)条件的字符
本来的n=5。那么当i=8,i=11,i=18,i=21,i=28,i=31的时候,字符被取出,看2.2的存储表可验证
第三行的条件则是:if((i+3)%(2*n)==0 || (i-2)%(2*n)==0)
第四行的条件则是:if((i+4)%(2*n)==0 || (i-3)%(2*n)==0)
假设行数用L表示。
取出中间行的规律则是:if((i+L)%(2*n)==0 || (i-(L-1))%(2*n)==0)
2.3.3.取出末行
假设行数用L表示。
首先取出序号为4的字符E, 即:序号为L-1的字符。
然后依次取出满足if((i-4)%(2*n)==0)。 这里的4。其实就是L-1。