Rating: 5.0

# ångstromCTF 2020

**category: Crypto**

**Challenge Name: Wacko Images**

**Points: 90**

**Description:**

> How to make hiding stuff a e s t h e t i c? And can you make it normal again? enc.png image-encryption.py
> The flag is actf{x#xx#xx_xx#xxx} where x represents any lowercase letter and # represents any one digit number.

We get an encrypted image and encryption script:

image-encryption.py :
```python
from numpy import *
from PIL import Image

flag = Image.open(r"flag.png")
img = array(flag)

key = [41, 37, 23]

a, b, c = img.shape

for x in range (0, a):
for y in range (0, b):
pixel = img[x, y]
for i in range(0,3):
pixel[i] = pixel[i] * key[i] % 251
img[x][y] = pixel

enc = Image.fromarray(img)
enc.save('enc.png')
```
enc.png :

![enc.png](https://github.com/razicert/ctf-writeups/blob/master/2020/%C3%A5ngstromCTF%202020/Wacko%20Images/enc.png)

**Solution:**

From the script we gather that for correct 'j' the ``` e = (j * 251 + pixel[i]) / key[i] ``` gives us the original value before encryption, so we loop through 'j' in range(0, max(key)) and for each 'e' we check if it's a floating point number or not, if not, it's possibly the right one. We add a few lines to the encryption script and hope we get an image that is close enough to original image.

image-decryption.py :
```python
from numpy import *
from PIL import Image

enc = Image.open(r"enc.png")
img = array(enc)

key = [41, 37, 23]

a, b, c = img.shape

for x in range (0, a):
for y in range (0, b):
pixel = img[x, y]
for i in range(0,3):
for j in range(0,41):
e = (j * 251 + pixel[i]) / key[i]
eint = int(e)
if eint == e:
pixel[i] = e
break
img[x][y] = pixel

flag = Image.fromarray(img)
flag.save('flag.png')
```

flag.png :

![flag.png](https://github.com/razicert/ctf-writeups/blob/master/2020/%C3%A5ngstromCTF%202020/Wacko%20Images/flag.png)

Close enough.

Flag: actf{m0dd1ng_sk1llz}

Original writeup (https://github.com/razicert/ctf-writeups/tree/master/2020/%C3%A5ngstromCTF%202020/Wacko%20Images).