Tags: crypto caesar_shift number_theory 


This one was pretty straight forward. The hardest part was calculating fibbonacci numbers quickly, but luckily, there's a formula for that! It's called [Binet's formula](https://artofproblemsolving.com/wiki/index.php/Binet%27s_Formula). With this, we can create a simple script that reads from the terminal, does the shift, and sends it back to the terminal. The program eventually crashes once it recieves an invalid input from receiving the flag, but hey, at least it gives you the flag ¯\\\_(ツ)_/¯

import struct
import socket
import math
from caesarcipher import CaesarCipher

s = socket.socket()
s.connect(("misc.2020.chall.actf.co", 20300))

def Fib(n): #binet's formula
return int((1/math.sqrt(5))*((((1+math.sqrt(5))/2)**n) - (((1-math.sqrt(5))/2)**n)))

while True:
r = s.recv(1024).decode().strip()
string = r[r.find("Shift") +6: r.find("by")-1 ].strip()
shift = Fib(int(r[r.find("n=") +2:r.find("\\n:")].rstrip()))

result = CaesarCipher(string, offset=shift)
s.send(result.encoded.encode() + b"\n")