Tags: ctf crypto 

Rating:

let me see the encode code

```
#!/usr/bin/env python
#-*- coding:utf-8 -*-

import random
from flag import flag

def encrypt(msg, perm):
W = len(perm)
while len(msg) % (2*W):
msg += "."
msg = msg[1:] + msg[:1]
msg = msg[0::2] + msg[1::2]
msg = msg[1:] + msg[:1]
res = ""
for j in xrange(0, len(msg), W):
for k in xrange(W):
res += msg[j:j+W][perm[k]]
msg = res
return msg

def encord(msg, perm, l):
for _ in xrange(l):
msg = encrypt(msg, perm)
return msg

W, l = 7, random.randint(0, 1337)
perm = range(W)
random.shuffle(perm)

enc = encord(flag, perm, l)
f = open('flag.enc', 'w')
f.write(enc)
f.close()
```

W is fixed as 7
l is random number
perm is shuffled by random.shuffle()

```
while len(msg) % (2*W):
msg += "."
```

means padding until len(msg) is divided by 14

```
msg = msg[1:] + msg[:1]
```
means move a letter to end of string like below

'abc' -> 'bca'

```
msg = msg[0::2] + msg[1::2]
```
means make string as even letter + odd letter like below.

"abcd" -> "acbd"

```
for j in xrange(0, len(msg), W):
for k in xrange(W):
res += msg[j:j+W][perm[k]]
```
means make result using shuffled perm

so, I coded like this.
```
#Coded by sqrtrev
import itertools

W = 7
perm = range(7)
perm = itertools.permutations(perm)

def decrypt(msg, perm):
W = len(perm)
origin = ''
res = msg
tmp_flag = ''
for j in xrange(0, len(msg), W):
for k in xrange(W):
origin += res[j:j+W][perm[k]]
origin = origin[-1] + origin[:-1]
for i in range(0,35):
tmp_flag += origin[i]+origin[i+35]
origin = tmp_flag
origin = origin[-1] + origin[:-1]
return origin

for x in perm:
f = open("./flag.enc").read()
for i in xrange(0,1338):
f = decrypt(f, x)
if 'ASIS{' in f:
print x, f, i
break
```
the result is

(1, 0, 4, 6, 3, 2, 5) ASIS{1n54n3ly_Simpl3_And_d3lic1Ous_5n4ckS_eVEn_l4zY_Pe0pL3_Can_Mak3}.. 760