CTF古典密码——栅栏密码解题思路与Python自动化解密
一、题目场景(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栏逐一尝试解密。古典密码核心难点在于识别加密类型,后续可结合凯撒、维吉尼亚密码组合出题。
更多推荐
所有评论(0)