corCTF 2021 | fibinary

#corctf2021

fib = [1, 1]
for i in range(2, 11):
    fib.append(fib[i - 1] + fib[i - 2])

def c2f(c):
    n = ord(c)
    b = ''
    for i in range(10, -1, -1):
        if n >= fib[i]:
            n -= fib[i]
            b += '1'
        else:
            b += '0'
    return b

flag = open('flag.txt', 'r').read()
enc = ''
for c in flag:
    enc += c2f(c) + ' '
with open('flag.enc', 'w') as f:
    f.write(enc.strip())

平文の空間が小さいので何をやっても解ける

ct = """10000100100 10010000010 10010001010 10000100100 10010010010 10001000000 10100000000 10000100010 00101010000 10010010000 00101001010 10000101000 10000010010 00101010000 10010000000 10000101000 10000010010 10001000000 00101000100 10000100010 10010000100 00010101010 00101000100 00101000100 00101001010 10000101000 10100000100 00000100100"""

fib = [1, 1]
for i in range(2, 11):
    fib.append(fib[i - 1] + fib[i - 2])

def c2f(c):
    n = ord(c)
    b = ''
    for i in range(10, -1, -1):
        if n >= fib[i]:
            n -= fib[i]
            b += '1'
        else:
            b += '0'
    return b

d = {}

for c in range(0, 256):
    d[c2f(chr(c))] = c

flag = ""
for i in ct.split(" "):
    flag += chr(d.get(i))

print(flag)