Tags: crypto 

Rating:

`seed(randint(1, len(file_name)))` looks pretty unsecure

1. We know filename ('fsegovs_meaoerbma_') => we know it's len (and it is not very big)

2. We know filename before and after shuffling => we can use brute-force attack to get seed

OK, we used it, got to know that seed = 3

Now we need to reverse shuffle

We repeat everyting from shufflin.py, but replace original permutation to reverse one.

After we get original text and there is flag in the last line

solution:

```
from random import *

def replace_keys_and_values_in_list(orig_list):
ans = [-1 for i in range(len(orig_list))]
for i in range(len(orig_list)):
ans[orig_list[i]] = i
return ans

def Shuffle(p, data):
"""
symmetric function
"""
buf = list(data)
for i in range(len(data)):
buf[i] = data[p[i]]
return ''.join(buf)

def main():
file_name = 'fsegovs_meaoerbma_'
data = open(file_name + '.txt', 'r').read()
seed(3)
file_name = list(file_name)
shuffle(file_name)
p = list(range(len(data)))
shuffle(p)
p = replace_keys_and_values_in_list(p)
data = Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,Shuffle(p,data))))))))))))))))))))))))))))))))))))))))
out = open('original_text.txt', 'w')
out.write(''.join(data))
out.close()

main()
```

Original writeup (https://github.com/4p3ls1n/write-ups/tree/master/kksctf_open_2019/Every%20day%20i'm%20shuffling).