buuctf:篱笆墙的影子

【原理】

栅栏密码

【目的】

掌握栅栏密码加密方式以及解密方式

【环境】

Windows

【工具】

在线解密

【步骤】

本题主要考察栅栏密码的熟悉程度以及对基本加密解密的了解,希望你可以通过此题来熟悉栅栏密码的加密解密方式

栅栏在线解码网站栅栏加密/解密 - Bugku CTF平台

即可得到flag

 

什么是栅栏密码?

一、核心定义

栅栏密码是一种古典置换密码,通过将明文按特定规则排列成“栅栏”形状(如Z型或W型),再按行或列读取字符生成密文。其核心原理是改变字符排列顺序而非替换字符,属于非对称加密的早期形式。

二、加密原理

1. 物理排列规则  

   • 想象一个有K根平行横栏的栅栏,明文字符按“之”字形路径写入轨道:  

     ◦ 第1行从左到右 → 第2行从右到左 → 第3行从左到右...  

   • 示例(K=3):  

明文:HELLOWORLD  

轨道分布:  

H . . . E . . . L . . . D  

. E . L . O . W . R . L .  

. . L . . . . . . . . . .  

     密文读取:HLOOL EWRD(去除空格后为HLOOLEWRD)。

2. 数学建模  

   • 位置映射函数:第i个字符的轨道号r由周期函数确定:  

   • 密文生成:按轨道顺序拼接字符,如轨道0→轨道1→轨道2。

三、加密解密流程

步骤

加密过程

解密过程

输入

明文P、密钥K(栏数)

密文C、密钥K

处理

1.按Z型填充K行轨道

2. 按行读取字符

1. 根据K计算每行字符数

2. 按列填充轨道

3. 按Z型路径重组明文

输出

密文C(如HLOOLEWRD)

明文P(需与原始明文长度一致)

Python实现示例(K=3加密):

def rail_fence_encrypt(text, rails):

    rail = [[] for _ in range(rails)]

    direction = 1  # 1=down, -1=up

    current = 0

    for char in text:

        rail[current].append(char)

        current += direction

        if current == rails-1 or current == 0:

            direction *= -1

    return ''.join([''.join(r) for r in rail])

四、变种与增强

1. W型栅栏密码  

   • 将明文按W型排列(非对称轨道),增加破解难度。例如:  

明文:CRYPTOGRAPHY  

W型轨道:  

C   R   I   T   Y  

R P G O P   H   A  

T   O   G   R   A  

密文:CRYPYRPTOGRAPAH  

   • 密钥不仅限于长度因数,可扩展至任意整数。

2. 动态栏数加密  

   • 分段使用不同栏数,如前半段K=2、后半段K=3,提升复杂度。

五、安全性分析

维度

特点

密钥空间

理论最大密钥为L-1(L为明文长度),但实际有效密钥通常≤√L

抗攻击性

易受频率分析攻击(单栏时等同明文统计)

应用场景

主要用于教学演示,实际中已被维吉尼亚密码等替代

 

解题过程:
1.进入题目界面,发现了一堆文字:
星星还是那颗星星哟月亮还是那个月亮山也还是那座山哟梁也还是那道梁碾子是碾子缸是缸哟爹是爹来娘是娘麻油灯呵还吱吱响点的还是那么丁点亮哦哦注意:得到的f1ag请包上f1ag提交

2.下载压缩包并解压

3.发现了一串不知名密文

felhaagv{ewtehtehfilnakgw}

 

4.分析:

结合一下题目:篱笆墙的影子,篱笆墙==》栅栏

5.观察一下密文是否符合栅栏密码格式?

felhaagv{ewtehtehfilnakgw}

根据flag提交格式,flag{},找目标:

felhaagv{ewtehtehfilnakgw}

这很明显,就是k=2的“z”型栅栏密码

fe lh aa gv {e wt eh te hf il na kg w}

密钥空间分析

栅栏高度k

密钥空间大小

破解难度

k=2

n-1种可能

★☆☆☆☆

k=3

(n²-1)/3

★★☆☆☆

k=4

(n⁴-1)/4

★★★☆☆

注:当k未知时,破解复杂度呈指数级增长

 

6.方法一:在线网站解密

(1)复制粘贴密文

(2)填写栏数(默认2栏)

(3)选择加密

PS:注意此处是反向操作,如果选择“解密”就会出现:

 

最后获得flag:flag{wethinkwehavetheflag}

 

7.方法二:利用python脚本进行解密

核心算法思路

1. 频度分析预判:统计各列字符分布,寻找接近自然语言特征的k值  

2. 卡方检验验证:计算各列分布与英文频率的卡方距离  

3. 动态规划优化:采用Viterbi算法进行路径恢复

def decrypt_rail_fence_k2(ciphertext):

    """

    解密栅栏数为2的栅栏密码

   

    参数:

        ciphertext (str): 待解密的密文

       

    返回:

        str: 解密后的明文

    """

    n = len(ciphertext)

    # 计算第一行(上排)的字符数(向上取整)

    top_count = (n + 1) // 2

   

    # 分割密文

    top_row = ciphertext[:top_count]  # 上排字符

    bottom_row = ciphertext[top_count:]  # 下排字符

   

    # 重建明文

    plain_chars = []

    for i in range(top_count):

        # 添加上排字符

        plain_chars.append(top_row[i])

        # 如果还有下排字符,添加下排字符

        if i < len(bottom_row):

            plain_chars.append(bottom_row[i])

   

    return ''.join(plain_chars)


# 测试解密函数

if __name__ == "__main__":

    # 示例密文

    ciphertext = "felhaagv{ewtehtehfilnakgw}"

   

    # 解密

    plaintext = decrypt_rail_fence_k2(ciphertext)

   

    # 输出结果

    print(f"密文: {ciphertext}")

    print(f"解密结果: {plaintext}")

    print(f"解密结果是否符合flag格式: {'flag{' in plaintext}")

8.运行后结果:

 

密文: felhaagv{ewtehtehfilnakgw}

解密结果: flag{wethinkwehavetheflag}

解密结果是否符合flag格式: True


9.关键技术总结

一、抗攻击策略

1. 多栏混淆:交替使用k=2/k=3组合  

2. 字符替换:在栅栏基础上叠加凯撒移位  

3. 动态调整:根据明文敏感度实时变换k值

二、现代应用场景

1. 物联网通信:轻量级数据传输加密  

2. 视觉隐写:通过栅栏排列隐藏图像信息  

3. 区块链存储:优化哈希碰撞检测效率

 

10.扩展学习资源

1. 经典文献:  

   • Kahn, David (1967). The Codebreakers. Macmillan  

   • Singh, Simon (1999). The Code Book. Fourth Estate  

 

2. 在线平台:  

   • Crypto Corner: https://www.cryptool.org/en/cto/  

   • TutorialsPoint: https://www.tutorialspoint.com/rail-fence-cipher-in-python

 

通过本文的系统学习,你应具备以下能力:  

✅ 独立推导栅栏密码数学模型  

✅ 开发自动化解密工具链  

✅ 应对变种密码题的实战能力  

立即挑战:https://ctf.bugku.com/challenges!

 

版权声明与原创承诺

本文所有文字、实验方法及技术分析均为 本人原创作品,受《中华人民共和国著作权法》保护。未经本人书面授权,禁止任何形式的转载、摘编或商业化使用。

 

道德与法律约束

文中涉及的网络安全技术研究均遵循 合法合规原则:

1️⃣ 所有渗透测试仅针对 本地授权靶机环境

2️⃣ 技术演示均在 获得书面授权的模拟平台 完成

3️⃣ 坚决抵制任何未授权渗透行为

 

技术资料获取

如需完整实验代码、工具配置详解及靶机搭建指南:

请关注微信公众号 「零日破晓」

后台回复关键词 【博客资源】 获取独家技术文档包

 

法律追责提示

对于任何:

✖️ 盗用文章内容

✖️ 未授权转载

✖️ 恶意篡改原创声明

本人保留法律追究权利。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值