篱笆加密算法

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 . .

加密后得到的结果如下:

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。






评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖上都叫我秋博

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值