class Railfence:
def __railfence_id(self, tam, key):
''' (Railfence, int, int) -> list of int
Retorna um lista de inteiros com a posicao da linha que o caracter do texto ira ocupar, variando de 0 ate key - 1.
'''
j = 0
inc = 0
idx = []
for i in range(tam):
if j == key - 1:
inc = -1
elif j == 0:
inc = 1
idx.append(j)
j += inc
return idx
def encrypt(self, texto, key):
''' (Railfence, str, int) -> str
Retorna o texto plano cifrado na cifra rail fence com a chave key.
'''
texto = texto.replace(' ', '')
tam = len(texto)
idx = self.__railfence_id(tam, key)
cifrado = ''
for i in range(key):
for z in range(tam):
if idx[z] == i:
cifrado += texto[z]
return cifrado.upper()
def decrypt(self, texto, key):
''' (Railfence, str, int) -> str
Retorna o texto plano para um texto cifrado com a cifra rail fence com a chave key.
'''
texto = texto.replace(' ', '')
tam = len(texto)
idx = self.__railfence_id(tam, key)
idx_sorted = sorted(idx)
texto_plano = ''
for i in range(tam):
for j in range(tam):
if idx[i] == idx_sorted[j] and idx[i] > -1:
texto_plano += texto[j]
idx[i] = -1
idx_sorted[j] = -1
return texto_plano.lower()