顺带告诉小明达芬奇家窗台上有一串数字是关键 说明这串数字是key
猜测是替换密码,用某种方式映射。然后发现密文是32位,key是32位,flag是32位。确实是替换密码。
观察了很久,没发现规律。上网查了才知道是斐波那契数列的变式。明文中有1 2 3 5 8 13...可以看出,写代码列出斐波那契数列前32位,就可以发现确实是这样。
fq = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309]
m = [1, 233, 3, 2584, 1346269, 144, 5, 196418, 21, 1597, 610, 377, 10946, 89, 514229, 987, 8, 55, 6765, 2178309, 121393, 317811, 46368, 4181, 1, 832040, 2, 28657, 75025, 34, 13, 17711]
那么,我们只需将密文中的变化从key还原到flag就知道答案了,而不需要知道变化的规律(卡这想了好久的笨蛋)。
代码思路:
创建一个flag列表,如1 在m中的0位,在fq中的第0位,就把key中的第0位放到flag中的第0位。
如233 在m中的第1位 ,在fq中13位。就把key中的第1位放到flag中的第13位。
即m的j位对应key的j位,fq的i位对应flag的i位。
代码如下:
m = [1, 233, 3, 2584, 1346269, 144, 5, 196418, 21, 1597, 610, 377, 10946, 89, 514229, 987, 8, 55, 6765, 2178309, 121393, 317811, 46368, 4181, 1, 832040, 2, 28657, 75025, 34, 13, 17711]
key = '36968853882116725547342176952286'
fq = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309]
flag = []
for i in range(len(fq)):
for j in range(len(m)):
if fq[i] == m[j]:
flag.append(str(key[j]))
print("".join(flag))
#flag{37995588256861228614165223347687}
因为有两个1,会有3737重复 去掉就好了 也有可能是73 都试试
最后就能得出flag
参考文章:vt.jnxl2023.sierting.com:30664/?