The first function
shuffle1() swaps the first half of the flag with the second half of the flag.
The second function
shuffle2() swaps the output of
shuffle1() further by swapping the the subsequent halfs in a set order.
The output of
shuffle2() is then encrypted using
encrypt() which just xors it with the given key list.
The final output is encoded to bytes and printed out.
Reversing the order of the encryption will provide with the flag.
Here is the solver for the challenge