CTF之栅栏密码的传统型、W型与偏移量
概念
定义
栅栏密码(Rail Fence Cipher)是一种古老的加密方法,它的基本原理是将明文按“栅栏”模式排列,形成一系列斜线,最后按行顺序读取字符来生成密文
栅栏密码使用一个或多个栅栏(即行数)来改变明文的排列方式,使得原文的结构被打乱,从而增加解密的难度
加密时,明文的字母按照栅栏数分布在多个行中,读取每行字符并按顺序拼接得到密文,栅栏数越多,加密的效果越复杂
解密时则需要知道栅栏数和偏移量,然后逆向排列字符恢复原文
如何加密
- 确定栅栏数和偏移:在加密之前,首先需要选择栅栏数(即行数)和偏移量(即从第几个栅栏开始)
- 将明文分配到栅栏上:明文中的字符会被按行分配到指定数量的栅栏中,字符按从上到下、从左到右的方式沿着栅栏逐行分布
- 按行读取字符:按照栅栏的行顺序将字符拼接,得到加密后的密文
- 输出密文:最终的密文是按照行顺序拼接后的字符序列
如何解密
解密过程是加密过程的逆向操作
- 确定栅栏数和偏移:解密时,首先需要知道加密时使用的栅栏数和偏移量
- 根据密文重构栅栏:根据密文的长度和栅栏数,重新构建栅栏矩阵
- 根据偏移量,可以确定字符的正确位置
- 按列读取字符:按照栅栏的列顺序读取字符,重建出原始的明文
传统型(Z型)
加密原理
- 把将要传递的信息中的字母从上往下从左往右排成N行
- 从左往右从上往下按顺序读取,从而形成一段密码
一般来说,传统型栅栏加密的栅栏数能整除明文的字符数
示例
明文: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型
加密原理
- 把将要传递的信息中的字母从上往下从左往右以W的形状排成N行,这里令N=3
- 如果有偏移量F,则明文字符从上往下从左往右以W的形状排列时,需要先跳过前F个位置
- 从左往右从上往下按顺序读取,从而形成一段密码
示例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