Criptografia: cifra rail fence em Python

A cifra rail fence (ou cerca de trilhos, aquelas, em geral de madeira, que servem para dividir terrenos) é um algoritmo onde os caracteres são distribuídos sobre uma cerca virtual num movimento de zig-zag.

O procedimento começa com a quantidade de rails (ou trilhas) que se deseja utilizar para cifrar a informação que será a chave da cifra. Definido o número de trilhas começamos a preenchê-la de cima para baixo e, quando chegamos à última trilha, voltamos a subir para a primeira trilha, fazendo este processo até o fim da mensagem. Como exemplo vamos utilizar a mensagem: atacaremos ao amanhecer.

Primeiro, vamos remover os espaços em branco: atacaremosaoamanhecer. Escolhemos o número de trilhas, por exemplo, 4. E criamos uma tabela com 4 linhas e 21 colunas (quantidade de caracteres da frase).

| | | | | | | | | | | | | | | | | | | | | | - 1
| | | | | | | | | | | | | | | | | | | | | | - 2
| | | | | | | | | | | | | | | | | | | | | | - 3
| | | | | | | | | | | | | | | | | | | | | | - 4

Começamos então a preencher a partir da primeira linha e primeira coluna. Para cada novo caracter vamos preenchendo a próxima coluna na linha abaixo do caracter anterior até chegar à última linha:

|a| | | | | | | | | | | | | | | | | | | | | - 1
| |t| | | | | | | | | | | | | | | | | | | | - 2
| | |a| | | | | | | | | | | | | | | | | | | - 3
| | | |c| | | | | | | | | | | | | | | | | | - 4

Chegando à última linha, começamos a subir, ou seja, preenchendo a próxima coluna na linha acima:

|a| | | | | |e| | | | | | | | | | | | | | | - 1
| |t| | | |r| | | | | | | | | | | | | | | | - 2
| | |a| |a| | | | | | | | | | | | | | | | | - 3
| | | |c| | | | | | | | | | | | | | | | | | - 4

Chegando à primeira trilha o processo se repete até o final da mensagem:

|a| | | | | |e| | | | | |a| | | | | |c| | | - 1 - aeac
| |t| | | |r| |m| | | |o| |m| | | |e| |e| | - 2 - trmomee
| | |a| |a| | | |o| |a| | | |a| |h| | | |r| - 3 - aaoaahr
| | | |c| | | | | |s| | | | | |n| | | | | | - 4 - csn

Depois de preenchida a tabela, a cifragem se faz com a leitura dos caracteres por linha iniciando da primeira. Assim, a frase cifrada será AEACTRMOMEEAAOAAHRCSN.

CÓDIGO

Abaixo o código da classe Railfence, salvo no arquivo railfence.py. Como as outras cifras, espaços em branco são descartados e a classe não trata caracteres especiais.

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

BitBin
TESTES


>>> from railfence import Railfence
>>> Railfence().encrypt('atacaremos ao amanhecer', 4)
'AEACTRMOMEEAAOAAHRCSN'
>>> Railfence().decrypt('AEACTRMOMEEAAOAAHRCSN', 4)
'atacaremosaoamanhecer'

Fontes:
http://en.wikipedia.org/wiki/Rail_Fence_Cipher
http://www.numaboa.com.br/criptografia/transposicoes/417-rail-fence

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: cifra rail fence 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