达芬奇密码--buuctf密码学

题目描述

达芬奇一直是一个有争议的画家,科学家。。。小明为了研究他,从网上找到了名画蒙娜丽莎,一天深夜,小明突然从蒙娜丽莎背后的天空中看到了一串神秘的数字。顺带告诉小明达芬奇家窗台上有一串数字是关键。小明千里迢迢找到了这串数字,请将这个送分题做出来,亲,包邮哦(答案是一串32位十进制数字)
注意:得到的 flag 请包上 flag{} 提交

文件内容

达芬奇隐藏在蒙娜丽莎中的数字列: 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
记录在达芬奇窗台口的神秘数字串:
36968853882116725547342176952286

分析发现神秘数字串为32位,数字列也有32个数字,而flag也为一串32位10进制字符串。猜测神秘数字串可能为密文c,且和数字列存在一一映射的关系。

熟悉斐波那契数列的老哥就会发现,这32个数字包含了1 1 2 3 5 8 13 ......
写个脚本将斐波那契数列打印出来

def fib_loop_for(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a
for i in range(1,33):
    print(fib_loop_for(i))
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

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  

c="36968853882116725547342176952286"

对比发现,数字列的确为斐波那契数列的变形。

那么flag应该就是根据斐波那契数列变形而变形的。我们只需要将其逆转就可以了。

0位的1就在斐波那契数列第0位,所以3的位置不变,还在第0位。
1位的233的位置在斐波那契数列第12位,所以6应该移到第12位。

我们需要从数字列中挨个取出数字,查询其在斐波那契数列中的位置,将密文c对应位置的数字,移到相应的位置即可。
附上python脚本:

def fib_loop_for(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a
key="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".split(" ")
dic=[]
c="36968853882116725547342176952286"
m="*"*32
m=list(m)
for i in range(1,33):
    print(fib_loop_for(i),end=" ")
    dic.append(fib_loop_for(i))
print(dic)
for i in range(32):
    index = dic.index(int(key[i]))
    print(i,index,c[i])
    m[index]=c[i]
print("".join(m))
#7*995588256861228614165223347687
#flag:37995588256861228614165223347687

注意数字列中的第2个1在第24位,由于string.index()函数在查询下标的时候,会从右往左查询,故而第24位的1所对应的数字7,覆盖了第0个位置的1所对应的数字3。所以第1个位置没有数字,还是*。所以得到两种结果,因为不确定到底那个1所对应的数字是3。

#73995588256861228614165223347687
#37995588256861228614165223347687
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值