当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/284684.html

相关文章:

  • ota之.加密算法,mcu加密方式
  • 开源 python 应用 开发(八)图片比对
  • Android wifi简单白名单实现逻辑
  • 20250717在荣品的PRO-RK3566开发板的Android13系统下解决点屏出现问题unsupport command data type: 217
  • 通俗的解释一下以太网中的端口号
  • 流式数据处理实战:用状态机 + scan 优雅过滤 AI 响应中的 `<think>` 标签
  • 深入理解CSS定位:绝对定位的包含块机制
  • 退休时间计算器,精准预测养老时间
  • 项目实战(18)-POE分离器
  • Spring底层原理(一)核心原理
  • RCU机制及常见锁的理解
  • 深入理解Java中的Map.Entry接口
  • 【数据结构】单链表的实现
  • python(one day)——春水碧于天,画船听雨眠。
  • Python 网络爬虫 —— requests 库和网页源代码
  • 网络爬虫的介绍
  • Kafka 配置参数详解:ZooKeeper 模式与 KRaft 模式对比
  • 【Android】Span的使用
  • 深入了解linux系统—— 信号的捕捉
  • 卷积神经网络--网络性能提升
  • 如何成为高级前端开发者:系统化成长路径。
  • 初识 二叉树
  • BI Agent vs. 传统BI工具:衡石科技视角下的效率与智能跃迁
  • 亚远景科技助力长城汽车,开启智能研发新征程
  • AI产品经理面试宝典第34天:破解人机社交关系面试题与答法
  • 一台显示器上如何快速切换两台电脑主机?
  • 【vue-2】Vue 3 中的 v-on 指令:全面指南与最佳实践
  • 无线调制的几种方式
  • .NET Framework版本信息获取(ASP.NET探针),获取系统的.NET Framework版本
  • Axure设计设备外壳 - AxureMost 落葵网