在解Bugku逆向 RE_Cirno的时候碰到了栅栏密码与字符数不成倍数的情况,找到千千秀字-栅栏密码加密解密可以解,但由于是在服务端解密的,于是尝试用python写了一个自动填充字符的栅栏密码
推导过程
先写随便一串相同原始长度的flag,剩下不够的用 * 补充
abcdefghijklmnopqrstuvwx***
然后手动分割
abcdefghi
jklmnopqr
stuvwx***
从上到下重新排列
ajs
bkt
clu
dmv
enw
fox
gp*
hq*
ir*
再合并
ajsbktcludmvenwfoxgp*hq*ir*
发现最后几位每个两位添加了一个 * ,于是可以把flag分割成这样
fotlleas0gvw{30Cr}ly*rc*nu*
Python解密
用python写一个加解密程序,也适用于所有栅栏密码的加解密
def decode(flag,num):
length = len(flag) # flag的长度
lines = length // num # 判断共有几层并减一
remainder = num * (lines + 1) - length #相差的数量
# 补全flag
result = flag[:length-lines*remainder]
for i in range(remainder-1,-1,-1):
result += flag[length-(i+1)*lines:length-i*lines] + '*'
# 还原flag
lines += 1
arr = [result[i:i+lines] for i in range(0,len(result),lines)]
flag = ''
for i in range(len(arr[0])):
for j in arr:
flag += j[i]
return flag[:length]
def encode(flag,num):
from math import ceil
length = len(flag)
lines = ceil(length / num)
arr = [flag[i:i+num] for i in range(0,lines * num,num)]
flag = ''
for i in range(len(arr[0])):
for j in arr:
try:
flag += j[i]
except:
pass
return flag