O Bastão de Licurgo ou scytale (σκυτάλη, bastão) ou cítala é uma técnica de cifragem utilizada pelos soldados espartanos, embora alguns estudiosos sugiram que isto seja apenas um mito.[1][2][3]
Todavia, seu processo consistia em se enrolar uma tira de tecido sobre um bastão de largura definida e sobre esta tira escrevia-se a mensagem. Finda a mensagem, a tira era desenrolada e enviada como um cinto por um mensageiro.
No destino a tira devia ser enrolada num bastão de largura igual ao qual a mensagem foi escrita; sendo o bastão da mesma largura a mensagem se revelava. O algoritmo da cifra, neste caso, é o enrolar da tira no bastão e a chave, a sua largura.
Uma forma de visualizar a distribuição da mensagem é transpô-la para uma tabela. Para isso, dividimos o tamanho da mensagem pelo número de linhas (o que equivale à sua largura) e obtemos a quantidade de colunas. Tomemos como exemplo a mensagem: ‘o ataque será realizado amanhã‘. Desprezando-se os espaços em branco e trocando-se os caracteres especiais, teremos a seguinte mensagem a ser cifrada: ‘oataqueserarealizadoamanha‘. Sendo o tamanho do texto de 26 caracteres e a largura do bastão (chave) 4, e a divisão não é inteira, o número de colunas deve ser 7, assim:
(preenchimento) → |o|a|t|a|q|u|e| |s|e|r|a|r|e|a| |l|i|z|a|d|o|a| |m|a|n|h|a| | |
E, como a divisão não foi inteira, ficaram dois espaços na tabela que eu resolvi preencher com as letras do alfabeto:
(cifragem) ↓ |o|a|t|a|q|u|e| |s|e|r|a|r|e|a| |l|i|z|a|d|o|a| |m|a|n|h|a|A|B|
Perceba que o preenchimento da tabela se dá da esquerda para a direita e de cima para baixo, mas a sua cifragem se faz de cima para baixo e da esquerda para a direita. Assim, o texto cifrado será:
OSLMAEIATRZNAAAHQRDAUEOAEAAB
CÓDIGO
Abaixo o código da classe Scytale em Python:
class Scytale:
def encrypt(self, texto, key):
''' (Scytale, str, int) -> str
Cifra o texto com a cifra scytale utilizando
a chave key.
'''
cifrado = ''
texto = texto.replace(' ', '')
qtd_ch = len(texto)
col = qtd_ch // key
if qtd_ch % key > 0:
col += 1
i = ord('A')
while len(texto) < key * col:
texto += chr(i)
i += 1
for i in range(col):
for j in range(0, qtd_ch, col):
cifrado += texto[i + j]
return cifrado.upper()
def decrypt(self, texto, key):
''' (Scytale, str, int) -> str
Decifra o texto cifrado com a cifra Scytale
usando a chave key.
'''
texto_plano = ''
texto = texto.replace(' ', '')
for i in range(key):
for j in range(0, len(texto), key):
texto_plano += texto[i + j]
return texto_plano.lower()
TESTES
O código foi salvo no arquivo scytale.py
>>> from scytale import Scytale
>>> Scytale().encrypt('o ataque sera realizado amanha', 4)
'OSLMAEIATRZNAAAHQRDAUEOAEAAB'
>>> Scytale().decrypt('OSLMAEIATRZNAAAHQRDAUEOAEAAB', 4)
'oataqueserarealizadoamanhaab'
[1] http://en.wikipedia.org/wiki/Scytale
[2] http://www.numaboa.com.br/criptografia/transposicoes/322-bastao-de-licurgo
[3] http://www.civilwarsignals.org/pages/crypto/cryptotl.html


Comentários