CTF之栅栏密码的传统型、W型与偏移量

概念

定义

栅栏密码(Rail Fence Cipher)是一种古老的加密方法,它的基本原理是将明文按“栅栏”模式排列,形成一系列斜线,最后按行顺序读取字符来生成密文

栅栏密码使用一个或多个栅栏(即行数)来改变明文的排列方式,使得原文的结构被打乱,从而增加解密的难度

加密时,明文的字母按照栅栏数分布在多个行中,读取每行字符并按顺序拼接得到密文,栅栏数越多,加密的效果越复杂

解密时则需要知道栅栏数偏移量,然后逆向排列字符恢复原文

如何加密

  1. 确定栅栏数和偏移:在加密之前,首先需要选择栅栏数(即行数)和偏移量(即从第几个栅栏开始)
  2. 将明文分配到栅栏上:明文中的字符会被按行分配到指定数量的栅栏中,字符按从上到下、从左到右的方式沿着栅栏逐行分布
  3. 按行读取字符:按照栅栏的行顺序将字符拼接,得到加密后的密文
  4. 输出密文:最终的密文是按照行顺序拼接后的字符序列

如何解密

解密过程是加密过程的逆向操作

  1. 确定栅栏数和偏移:解密时,首先需要知道加密时使用的栅栏数偏移量
  2. 根据密文重构栅栏:根据密文的长度和栅栏数,重新构建栅栏矩阵
  3. 根据偏移量,可以确定字符的正确位置
  4. 按列读取字符:按照栅栏的列顺序读取字符,重建出原始的明文

传统型(Z型)

加密原理

  1. 把将要传递的信息中的字母从上往下从左往右排成N行
  2. 从左往右从上往下按顺序读取,从而形成一段密码

一般来说,传统型栅栏加密的栅栏数能整除明文的字符数

示例

明文:THE LONGEST DAY MUST HAVE AN END

加密

N=2,则把将要传递的信息中的字母从上往下从左往右排成两行

T E O G S D Y U T A E N N

H L N E T A M S H V A E D

密文从左往右从上往下按顺序读取

TEOGSDYUTAENN HLNETAMSHVAED

解密

先将密文分为两行

T E O G S D Y U T A E N N

H L N E T A M S H V A E D

再按上下上下的顺序组合成一句话

THE LONGEST DAY MUST HAVE AN END

扩展

  • 在选择行数时可以使多行,这样对于加密强度有所提高
  • 可以在加密之后在使用其他密码进行加密,增加强度

W型

加密原理

  1. 把将要传递的信息中的字母从上往下从左往右以W的形状排成N行,这里令N=3
  2. 如果有偏移量F,则明文字符从上往下从左往右以W的形状排列时,需要先跳过前F个位置
  3. 从左往右从上往下按顺序读取,从而形成一段密码

示例1

明文:HELLOWORLD

加密 - 偏移量为0

把将要传递的信息中的字母从上往下从左往右以W的形状排成3行

H

O

L

E

L

W

R

D

L

O

密文从左往右从上往下按顺序读取

HOL ELWRD LO

所以密文为

HOLELWRDLO

加密 - 偏移量为2

把将要传递的信息中的字母从上往下从左往右以W的形状排成3行,但要先跳过前2个位置

L

O

E

L

W

R

D

H

O

L

密文从左往右从上往下按顺序读取

LO ELWRD HLO

所以密文为

LOELWRDHOL

解密 - 偏移量为0

简而言之,明文密文的字符数量相同,所以只需要将密文按加密的步骤从上到下从左到右以W形状确定位置点,仅仅确定位置点而不真的进行加密

H

L

L

O

E

W

D

O

L

R

由上已知栅栏的所有位置点,之后只需要将加密时的填入顺序逆转过来即可

把密文 HOLELWRDLO 从左往右从上往下填入确定的位置点中

H

O

L

E

L

W

R

D

L

O

明文从上往下从左往右按顺序读取

HELLOWORLD

解密简洁版 - 偏移量为2

同样模仿加密先确定位置点,再以加密时的填入顺序逆转过来即可

E

D

O

L

R

H

L

L

W

O

把密文 LOELWRDHOL 从左往右从上往下填入确定的位置点中

L

O

E

L

W

R

D

H

O

L

明文从上往下从左往右按顺序读取

HELLOWORLD

好的,到此为止你已经掌握了本文栅栏密码相关的所有内容

以下是从其他角度的一些思考和栅栏数为4的示例,可以跳过不看


解密废话版

已知栅栏数N (N>1),则第一行的字符相隔 2(N-3)+3=2N-3 位,所以如果第一行有K位字符,则总共至少有 (K-1)(2N-3)+K 位字符

比如栅栏数N=3时,K=1至少有1个字符,K=2至少有1*3+2=5个字符,K=3至少有2*3+3=9个字符,K=4至少有3*3+4=13个字符

换句话来说,当总字符数大于 (K-1)(2N-3)+K 而小于 K*(2N-3)+K+1,则第一行有K位字符,结合间隔即可得到第一行字符的分布

底下几行一般只要挨着上一行填即可,只需要注意,假设总字符数减去 (K-1)(2N-3)+K 的差为X,则第一行第K位字符右侧X列都有字符


N=3时,第1行的间隔为2*3-3=3,字符串总字符数为10,大于9小于13,则第1行的字符数为3,且第1行最后一个字符右侧10-9=1列有字符

在第1行每隔3个间隔从左到右填入一个字母,总共填3个,即HOL

H

O

L

在第2行,处于第一行3个字符所在列的左右列,从左至右填上字符,注意第一个字符左列不填,最后一个字符右列先不填,即填入ELWR

H

O

L

E

L

W

R

由于第1行最后一个字符右侧1列有字符,故在第2行最后一个字符右列填入字符,即D

H

O

L

E

L

W

R

D

在第3行,以构成W形状的趋势,在第2行字符的邻列,从左至右填上字符,刚好填写完毕

H

O

L

E

L

W

R

D

L

O

再按从上往下从左往右的顺序组合成一句话

HELLO WORLD

示例2

密文:Fsflipsyanwa3g72,栅栏数为4,偏移量为0

解密

N=4时,第1行的间隔为2*4-3=5,字符串总字符数为16,大于2*5+3=13小于3*5+4=19,则第1行的字符数为3,且第1行最后一个字符右侧16-13=3列有字符

在第1行每隔5个间隔从左到右填入一个字母,总共填3个,即Fsf

F

s

f

在第2行,处于第一行3个字符所在列的左右列,从左至右填上字符,注意第一个字符左列不填,最后一个字符右列先不填,即填入lips

F

s

f

l

i

p

s

由于第1行最后一个字符右侧3列有字符,故在第1行最后一个字符右1列填入字符,即y

F

s

f

l

i

p

s

y

在第3行,以构成W形状的趋势,在第2行字符的邻列,从左至右填上字符,注意最后一个字符邻列先不填,即填入anwa

F

s

f

l

i

p

s

y

a

n

w

a

由于第1行最后一个字符右侧3列有字符,故在第1行最后一个字符右2列填入字符,即3

F

s

f

l

i

p

s

y

a

n

w

a

3

在第4行,以构成W形状的趋势,在第3行字符的邻列,从左至右填上字符,注意最后一个字符邻列先不填,即填入g7

F

s

f

l

i

p

s

y

a

n

w

a

3

g

7

由于第1行最后一个字符右侧3列有字符,故在第1行最后一个字符右3列填入字符,即2

F

s

f

l

i

p

s

y

a

n

w

a

3

g

7

2

再按从上往下从左往右的顺序组合成一句话

Flagnispw7asfy32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Neolock

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

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

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

打赏作者

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

抵扣说明:

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

余额充值