Rating:

# Tux Kitchen

>I need to bake it!

## Problem

The function works as follows:

1) Get a random key

2) Create a random list of numbers based on the key and 3 other random constants that is as long as the flag

3) Multiply each number by the order of the character of the flag

4) Xor each resulting number by ```MY_LUCKY_NUMBER``` then add ```MY_LUCKY_NUMBER * len(flag)``` to the last number in the list

## Solving

All we need is to reverse the last function, which is trivial. After this, we know that each number is a random number ```r_n``` multiplied by the order of the character. The point here is that ```r_n``` never matters since, over several runs, it will change but the order of the character wont.

So over 5 runs we will have, at position 0:

```
f_0_0 = r_0_0 * ord(f[0])
f_0_1 = r_0_1 * ord(f[0])
f_0_2 = r_0_2 * ord(f[0])
f_0_3 = r_0_3 * ord(f[0])
f_0_4 = r_0_4 * ord(f[0])
```

Here ```f_0_k``` is the reversed number at position 0 and ```r_0_k``` the random number for round ```k``` at index 0. What we see is that those 5 nubers will have ```ord(f[0])``` as a common multiple. Therefore all we need is to get a large enough sample size, calculate the gcd for each position.

Original writeup (https://github.com/Gdasl/CTFs/blob/master/HSCTF6/Crypto/Tux%20Kitchen/Tux%20Kitchen.md).