Criptografia: Bastão de Licurgo (scytale) em Python

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.

Scytale

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()

BitBin
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

Sobre Fábio Medeiros

Meu nome é Fábio Medeiros. Cearense de nascença e com muito orgulho (daí o nome do blog, uma referência à minha terra). Sou formado em Tecnologia em Telemática, pelo CEFET-CE. Escrevi alguns artigos sobre programação JavaME e dispositivos portáteis (PDA) para a revista WebMobile.
Esse post foi publicado em Criptografia e marcado , , . Guardar link permanente.

Uma resposta para Criptografia: Bastão de Licurgo (scytale) em Python

  1. Pingback: Criptografia: cifras de transposição e cifras de substituição | siriarah

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s