一、题目场景(CTF基础真题)

 

比赛给出密文:oasehruyt,提示为2栏栅栏加密,需要解密还原明文获取flag。

栅栏密码属于换位类古典加密,不改变原有字符,仅打乱字符排布顺序,是CTF初赛高频考点。

 

二、加密原理

 

将明文字符上下分行排布,先横向书写,再纵向拼接形成密文。

以两栏为例:奇数位字符分为第一行,偶数位字符分为第二行,最后两行串联输出密文。

 

三、手动解密逻辑

 

1. 统计密文总长度,均分拆分为两组字符。

 

2. 按照一取一行、穿插组合的规则,重构原始明文。

本次密文长度为10位,拆分重组后解密明文为:oursheyat。

 

四、Python通用解密代码def rail_decrypt(cipher, rails=2):

    length = len(cipher)

    step = 2 * rails - 2

    plain = [''] * length

    index = 0

    for i in range(rails):

        point = i

        flip = True

        while point < length:

            plain[point] = cipher[index]

            index += 1

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

                point += step

            else:

                if flip:

                    point += step - 2*i

                else:

                    point += 2*i

                flip = not flip

    return ''.join(plain)

 

ciphertext = "oasehruyt"

print(rail_decrypt(ciphertext,2))

五、CTF做题总结

 

栅栏密码难度偏低,常作为签到题出现。栏目数未知时,可以编写爆破脚本,遍历2–10栏逐一尝试解密。古典密码核心难点在于识别加密类型,后续可结合凯撒、维吉尼亚密码组合出题。

 

更多推荐