Writeup for Fibinary (Crypto) - Crusaders of Rust (cor) CTF (2021) 💜
Challenge Description
Warmup your crypto skills with the superior number system!
Solution
# first 11 numbers in fibonacci sequence (excl zero) - will be used by c2f()
fib = [1, 1]
for i in range(2, 11):
fib.append(fib[i - 1] + fib[i - 2])
print('fib: ' + str(fib))
def c2f(c):
n = ord(c)
b = ''
# looping from 10 to 0 (reverse order through fib)
for i in range(10, -1, -1):
# if our char is greater than current fib[i]
if n >= fib[i]:
# subtract fib[i] from char and add '1' to binary
n -= fib[i]
b += '1'
else:
# if char is smaller, add '0' to binary
b += '0'
return b
flag = 'fake_flag'
enc = ''
# perform encryption on fake flag and print
for c in flag:
enc += c2f(c) + ' '
print('encrypted: ' + str(enc.strip()))
# OK so lets add a decrypt function..
def f2c(b):
c = 0
# loop through byte, incrementing by fib[i] when '1' is found
for i in range(10, -1, -1):
if b[i] == '1':
c += fib[i]
return chr(c)
dec = ''
# loop through the bytes, decrypting each one and returning char
for b in str(enc.strip()).split(" "):
dec += f2c(b[::-1]) # reverse the byte
print('decrypted: ' + dec)