Criptografia: Cifra de Trithemius ou Tabula Recta em Python

No século XV o monge alemão Johannes Trithemius desenvolveu um cifra de criptografia polialfabética. Descrita em um de seus livros, o terceiro volume de uma série, esta cifra recebe o nome de Tabula Recta.

A Tabula Recta consiste numa tabela de 26×26 preenchida da seguinte maneira: a primeira linha (1) é preenchida com o alfabeto latino em ordem alfabética. A segunda linha (2) é o mesmo alfabeto só que deslocado uma casa para a esquerda. A terceira linha (3) é deslocada em mais uma casa e assim por diante até chegarmos a 25 deslocamentos. No 26º deslocamento o ciclo se reinicia voltando-se à configuração inicial da primeira linha (1).

  |A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|
-------------------------------------------------------
 1|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|
 2|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|
 3|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|
 4|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|
 5|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|
 6|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|
 7|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|
 8|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|
 9|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|
10|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|
11|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|
12|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|
13|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|
14|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|
15|O|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|
16|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|
17|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|
18|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|
19|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|
20|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|
21|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|
22|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|
23|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|
24|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|
25|Y|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|
26|Z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|

Para cifrar uma mensagem basta começar com a primeira letra da mensagem e a primeira linha da tabela (a linha não numerada corresponde ao alfabeto plano, as demais são os alfabetos cifrados). Para cada letra adicional da mensagem pulamos para a linha seguinte até chegarmos ao final das linhas da tabela onde o ciclo se reinicia. Tomemos por exemplo a palavra guerra.

primeira letra - G
primeira linha - G -> G
segunda letra - U
segunda linha - U -> V
terceira letra - E
terceira linha - E -> G
quarta letra - R
quarta linha - R -> U
quinta letra - R
quinta linha - R -> V
sexta letra - A
sexta linha - A -> F

Assim, a palavra guerra, cifrada, fica GVGUVF. Observe que na cifra de Trithemius a primeira letra da mensagem não sofre alteração, o que facilita na decifragem da mensagem caso a pessoa saiba que foi utilizada esta cifra.

CÓDIGO

Abaixo há a classe Trithemius (salva no arquivo trithemius.py) e um arquivo para teste da cifra (arquivo teste_trithemius.py). A classe ignora espaços em branco e não trata caracteres especiais.

Classe Trithemius

# -*- coding: utf-8 -*-
import string

class Trithemius(object):
    '''
    Classe de cifra Trithemius
    '''
    def __init__(self):
        self.plain = string.ascii_uppercase
        self.cipher = string.ascii_uppercase

    def shift(self):
        '''
        Desloca o alfabeto cifrado em uma casa.
        '''
        self.cipher = self.cipher[1:] + self.cipher[:1]

    def encrypt(self, text, decrypt=False):
        '''
        Cifra text com a cifra de Trithemius.
        Se decrypt é True, decifra ao invés de cifrar o text.
        '''
        text = text.replace(' ', '')
        ret_text = ''
        for char in text.upper():
            if decrypt:
                idx = self.cipher.find(char)
                ret_text += self.plain[idx]
            else:
                idx = self.plain.find(char)
                ret_text += self.cipher[idx]
            self.shift()
        self.cipher = string.ascii_uppercase
        return ret_text

    def decrypt(self, text):
        '''
        Decifra text com a cifra de Trithemius.
        '''
        return self.encrypt(text, True)

BitBin

Arquivo para teste

# -*- coding: utf-8 -*-
from trithemius import Trithemius
import sys

versao = sys.version_info[0]

if versao == 2:
	leitura = raw_input
elif versao == 3:
	leitura = input

txt_in = leitura('Texto a ser cifrado: ')

trit = Trithemius()
txt_cifrado = trit.encrypt(txt_in)
print('Texto cifrado: {0}'.format(txt_cifrado))
print('Texto plano: {0}'.format(trit.decrypt(txt_cifrado)))

TESTE

Abaixo reproduzo a saída dos testes feito com a palavra guerra.

Texto a ser cifrado: guerra
Texto cifrado: GVGUVF
Texto plano: GUERRA

FONTES
http://www.numaboa.com.br/criptografia/substituicoes/polialfabeticas/805-trithemius
http://www.numaboa.com.br/criptografia/historia/347-segredo-trithemius
http://www.numaboa.com.br/criptografia/criptoanalise/1055-analise-trithemius
http://en.wikipedia.org/wiki/Tabula_recta
http://en.wikipedia.org/wiki/Trithemius_cipher

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 de Trithemius ou Tabula Recta em Python

  1. Pingback: Criptografia: cifra de Vigenère em Python | 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