Извини, код не фонтан, ну как умею. 
def getnumber(x, y):
    return 4*(int(y)-1)+(int(x)-1)
def encode(text, xkeys, ykeys):
    counter = 0
    newtext = ['' for _ in range(len(text))]
    for y in ykeys:
        for x in xkeys:
            if counter < len(text):
                newtext[getnumber(x, y)] = text[counter]
                counter += 1
    return ''.join(newtext) #ТУТ ПОДГОНЯТЬ УРАВНЕНИЕ ТАК, ЧТОБЫ ПРИ ШИФРОВКИ "ПРИЛЕТАЮВОСЬМОГО" ПОЛУЧАЛОСЬ "ТЮАЕООГМРЛИПОЬСВ"
def decode(text, xkeys, ykeys):
    return) ''.join(text[getnumber(x, y)] for y in ykeys for x in xkeys)