# fibinary
[top](https://hackmd.io/tX_tkXceT0WY2Oq_F78qUw)
205pt
Problem
---
Warmup your crypto skills with the superior number system?
```=python
# enc.py
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())
```
Output
---
```
# flag.enc
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
```
Solver
---
flagの文字を10進で表した時の値をnとして、fibonacchi数列の10~0と比べて大きければ1,小さければ0とする長さ11の01の列としてflagの文字ごとに計算して暗号化?している
因みにfib(11)までのfibonacci数列は$\{1,1,2,3,5,8,13,21,34,55,89\}$である。
ex) 文字`c`の時
`c`をAsciiの10進表現に変換すると、`99`であるから`n=99`
b=''
89: n>=89 #n-=89 -> n=10 b+='1'
55: b+='0'
34: b+='0'
$\vdots$
8 : n>=8 #n-=8 -> n=2 b+='1'
$\vdots$
2 : n>=2 #n-=2 -> n=0 b+='1'
1 : b+='0'
1 : b+='0'
=> b='10000100100'
となっている。
これは線型変換なので、逆変換を行う
処理を見ると、01の列の`1`の時にfib(i)をnから引いている
つまり、上の例では$n-89-8-2=0$という処理をしているから、$n=89+8+2=>99$のように逆の処理をすれば良い
```python=
# solver.py
fib = [1,1]
for i in range(2,11):
fib.append(fib[i-1]+fib[i-2])
def dec(c):
m=0
for i in range(0,11):
if c[i]=='1':
m+=fib[10-i]
return m
cipher = open('flag.enc','r').read()
m = ''
for c in cipher.split(' '):
m+=chr(dec(c))
print(m)
```
Flag
---
:tada: corctf{b4s3d_4nd_f1bp!113d}
###### tags: `CTF` `corCTF` `crypto`