# -*- coding: utf-8 -*-
from cipher import Cipher
""" Implementacao da Cifra Scytale """
class Scytale(Cipher):
def encrypt(self, plaintext, key):
''' Cifra o texto com a cifra scytale utilizando a chave key. '''
square = []
plaintext = self.format_str(plaintext)
idx = 0
lines = len(plaintext) // key
if len(plaintext) % key:
lines += 1
for lin in range(lines):
square.append([])
for col in range(key):
if len(plaintext) > idx:
square[lin].append(plaintext[idx])
else:
square[lin].append('')
idx += 1
ciphertext = ''.join([square[lin][col] for col in range(key) for lin in range(lines)])
return ciphertext
def decrypt(self, ciphertext, key):
''' Decifra o ciphertext com a cifra Scytale usando a chave key. '''
idx = 0
ciphertext = self.format_str(ciphertext)
lines = len(ciphertext) // key
if len(ciphertext) % key:
lines += 1
# quantidade de colunas completas
spaces = len(ciphertext) % key
square = [['' for col in range(key)] for lin in range(lines)]
for col in range(key):
for lin in range(lines):
if len(ciphertext) > idx:
if not spaces and lin >= lines - 1:
# executa caso a coluna ao seja completa
square[lin][col] = ''
idx -= 1
else:
square[lin][col] = ciphertext[idx]
idx += 1
if spaces:
spaces -= 1
plaintext = ''.join([square[lin][col] for lin in range(lines) for col in range(key)])
return plaintext