Criptografia: Cifra ou disco de Alberti em Python

Leon Battista Alberti foi um autor, artista, arquiteto, poeta, sacerdote, linguista, filósofo e criptógrafo italiano que descreveu em um tratado (De Componendis Cifris ou De Cifris, 1466), uma técnica criptográfica que fazia uso de dois discos (um fixo e outro móvel) para cifrar e decifrar mensagens.

Como dito, os discos de Alberti são compostos por dois discos: um fixo e outro móvel. No disco fixo fica o alfabeto plano e no disco móvel fica o alfabeto cifrado. Alberti descreve dois métodos para cifragem/decifragem com os discos.

Disco de Alberti

Disco de Alberti

Para melhor exemplificar utilizaremos o disco da imagem acima, onde o disco fixo é o mais externo (com os caracteres maiúsculos) e o disco móvel é o disco interno (com os caracteres minúsculos).

Primeiro Método

Neste primeiro método escolhe-se um caracter do disco móvel que será utilizado como chave, por exemplo, a letra k. A cifragem se dá adicionando-se letras maiúsculas à mensagem a ser cifrada. Quando o usuário encontrar uma letra maiúscula no texto, a chave do disco móvel deve ser movida até que esta fique embaixo da letra maiúscula da mensagem. Agora, as demais letras são cifradas com as letras correspondentes ao disco móvel. Encontrando-se outra letra maiúscula, o disco móvel é deslocado até que a chave k fique abaixo da letra maiúscula no alfabeto plano e continua-se cifrando assim, até a mensagem acabar.

Como exemplo, vamos cifrar a mensagem ‘O sargento é o traidor’. Primeiro, todas as letras maiúsculas são convertidas em minúsculas, os espaços em branco são removidos e os caracteres especiais são trocados. Assim, a mensagem ficará ‘osargentoeotraidor’. Escolhemos a chave, neste caso a letra k, e qual será a letra inicial que será relacionada à chave. Para facilitar, escolhemos a letra B, como mostrado na imagem. Assim, a nossa mensagem deve começar com a letra B, ‘Bosargentoeotraidor’. Se adicionarmos outras letras maiúsculas na mensagem, o disco móvel deverá ser deslocado até que a chave, k, corresponda àquela letra. A mensagem final ficará assim: ‘BosargentoPeoStraidor’. Para cifrar checamos a letra minúscula da mensagem no disco fixo (com letras maiúsculas) e vemos qual é a letra correspondente no disco móvel (letras minúsculas). Abaixo um passo a passo:

Primeira iteração k -> B

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - g k l n p r t v z & x y s o m q i h f d b a c e

texto plano   - B o s a r g e n t o P e o S t r a i d o r
texto cifrado - B y q g m t p x i y P

Segunda iteração k -> P

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - o m q i h f d b a c e g k l n p r t v z & x y s

texto plano   - B o s a r g e n t o P e o S t r a i d o r
texto cifrado - B y q g m t p x i y P h g S

Terceira iteração k -> S

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - x y s o m q i h f d b a c e g k l n p r t v z &

texto plano   - B o s a r g e n t o P e o S t r a i d o r
texto cifrado - B y q g m t p x i y P h g S l g x h o a g

Nossa mensagem cifrada será ByqgmtpxiyPhgSlgxhoag.

Segundo Método

O segundo método muda um pouco, pois ao invés de se usar letras, usam-se os números que existem no disco fixo. Desta vez escolhe-se como chave um caracter do disco fixo como índice e uma letra do alfabeto cifrado para posição inicial. Ao se encontrar um número na mensagem a ser cifrada, a letra do disco móvel correspondente ao número no disco fixo é movida até corresponder com a letra escolhida como índice no disco fixo. E a cifragem continua assim até o fim da mensagem. Vamos utilizar a mesma mensagem do primeiro método: ‘O sargento é o traidor’. Trocamos todos os caracteres maiúsculos por minúsculos, removemos os caracteres em branco e trocamos os caracteres especiais. No final ficamos com a mensagem ‘osargentoeotraidor’.

Escolheremos a letra D no disco fixo como índice e a letra p no disco móvel como caracter inicial de cifragem. Adicionaremos alguns números (entre 1 e 4) e os inseriremos nos locais que desejarmos na mensagem a ser cifrada. A mensagem final será ‘Dosar1gento4eotra2idor’. Abaixo o passo a passo para cifragem:

Primeira iteração p -> D

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - k l n p r t v z & x y s o m q i h f d b a c e g

texto plano   - D o s a r 1 g e n t o 4 e o t r a 2 i d o r
texto cifrado - D s i k q 1

Segunda iteração 1 (a) -> D

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - f d b a c e g k l n p r t v z & x y s o m q i h

texto plano   - D o s a r 1 g e n t o 4 e o t r a 2 i d o r
texto cifrado - D s i k q 1 g c p x r 4

Terceira iteração 4 (h) -> D

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - m q i h f d b a c e g k l n p r t v z & x y s o

texto plano   - D o s a r 1 g e n t o 4 e o t r a 2 i d o r
texto cifrado - D s i k q 1 g c p x r 4 f k t p m 2

Quarta iteração 2 (y) -> D

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - z & x y s o m q i h f d b a c e g k l n p r t v

texto plano   - D o s a r 1 g e n t o 4 e o t r a 2 i d o r
texto cifrado - D s i k q 1 g c p x r 4 f k t p m 2 q y d c

Assim, a mensagem cifrada será Dsikq1gcpxr4fktpm2qydc.

Terceiro Método

Afora os dois métodos citados por Alberti, podemos criar um outro método que utilizaria um sistema de deslocamento automático sem que precisemos inserir outros caracteres na mensagem, bastaria somente escolher a letra inicial do disco fixo, a letra inicial do disco móvel e um número de deslocamento automático. Este número de deslocamento indicaria quantas casas o disco móvel seria deslocado, para a direita ou esquerda, a cada cifragem de um caracter. Para facilitar vamos utilizar uma mensagem menor : ‘perigo’. Escolhemos a letra O do disco fixo, a letra c do disco móvel e o número 2 como chave de deslocamento.

Primeiro caracter (p)

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - y s o m q i h f d b a c e g k l n p r t v z & x

texto plano   - p e r i g o
texto cifrado - e

Segundo caracter (e)

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - & x y s o m q i h f d b a c e g k l n p r t v z

texto plano   - p e r i g o
texto cifrado - e o

Terceiro caracter (r)

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - v z & x y s o m q i h f d b a c e g k l n p r t

texto plano   - p e r i g o
texto cifrado - e o a

Quarto caracter (i)

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - r t v z & x y s o m q i h f d b a c e g k l n p

texto plano   - p e r i g o
texto cifrado - e o a s

Quinto caracter (g)

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - n p r t v z & x y s o m q i h f d b a c e g k l

texto plano   - p e r i g o
texto cifrado - e o a s &

Sexto caracter (o)

DISCOS
FIXO  - A B C D E F G I L M N O P Q R S T V X Z 1 2 3 4
MÓVEL - k l n p r t v z & x y s o m q i h f d b a c e g

texto plano   - p e r i g o
texto cifrado - e o a s & s

A mensagem cifrada será eoas&s.

CÓDIGO

Abaixo o código da classe que implementa os três métodos acima descritos e também com funções que nos permitem adicionar alfabetos personalizados e de tamanho variado, não nos limitando ao alfabeto do disco da imagem no início do post. O código foi salvo no arquivo alberti.py.

class Alberti:
	def shift(self, shift):
		''' (int) -> None
		Desloca o disco movel a quantidade de elementos em shift.
		'''
		shift = -shift
		self.movable_disk = self.movable_disk[shift:] + self.movable_disk[:shift]

	def set_fixed_disk(self, plain_alphabet):
		''' (str) -> None
		Configura o alfabeto do disco fixo com o texto de plain_alphabet.
		'''
		self.fixed_disk = plain_alphabet.upper()

	def set_movable_disk(self, cipher_alphabet):
		''' (str) -> None
		Configura o alfabeto do disco movel com o texto de cipher_alphabet.
		'''
		self.movable_disk = cipher_alphabet.lower()

	def set_keys(self, fixed_key, movable_key):
		''' (char, charstr) -> None
		Configura as chaves do disco fixo e do disco movel;
		Desloca o disco movel de acordo com as chaves.
		'''
		self.set_fixed_key(fixed_key)
		self.set_movable_key(movable_key)
		fixed_id = self.fixed_disk.find(self.fixed_key)
		movable_id = self.movable_disk.find(self.movable_key)
		shift = fixed_id - movable_id
		self.shift(shift)

	def encrypt(self, plaintext, shift = 0, decrypt = False):
		''' (str, [int], [bool]) -> str
		Cifra o plaintext com a cifra de Alberti.
		'''
		ciphertext = ''
		for ch in plaintext:
			if ch.isupper():
				#letra maiuscula
				self.set_keys(ch, self.movable_key)
			elif ch.isdigit():
				#numero
				movable_key = self.movable_disk[self.fixed_disk.find(ch)]
				self.set_keys(self.fixed_key, movable_key)
			else:
				#letra minuscula
				if decrypt:
					#decifrando
					i = self.movable_disk.find(ch)
					ch = self.fixed_disk[i].lower()
				else:
					#cifrando
					i = self.fixed_disk.find(ch.upper())
					ch = self.movable_disk[i]
				if shift:
					#deslocamento
					self.shift(shift)
			ciphertext += ch
		return ciphertext

	def decrypt(self, ciphertext, shift = 0):
		''' (str, [int]) -> str
		Decifra utilizando a cifra de Alberti.
		'''
		#return self.encrypt(ciphertext, shift, True)
		text = ''
		plaintext = self.encrypt(ciphertext, shift, True)
		for ch in plaintext:
			if ch.islower():
				text += ch
		return text

	def set_fixed_key(self, fixed_key):
		''' (char) -> None
		Configura a chave do disco fixo.
		'''
		self.fixed_key = fixed_key.upper()

	def set_movable_key(self, movable_key):
		''' (char) -> None
		Configura a chave do disco movel.
		'''
		self.movable_key = movable_key.lower()

BitBin

TESTES

Desta feita, não vou mostrar o uso da classe, mas vou criar um arquivo de teste e importar a classe Alberti para ele e executar a cifragem/decifragem dos exemplos citados no post. Este código teste foi salvo no arquivo alberti_teste.py e deve ser salvo no mesmo diretório do arquivo alberti.py.

from alberti import Alberti
alb = Alberti()

## PRIMEIRO METODO
##alfabeto do disco fixo
alb.set_fixed_disk('ABCDEFGILMNOPQRSTVXZ1234')
##alfabeto do disco movel
alb.set_movable_disk('gklnprtvz&xysomqihfdbace')
##chave do disco movel
alb.set_movable_key('k')
cifrado = alb.encrypt('BosargentoPeoStraidor')
print 'Cifrando/Decifrando com o primeiro metodo da cifra de Alberti'
print 'Texto cifrado - ' + cifrado
print 'Texto decifrado - ' + alb.decrypt(cifrado)
print ''

## SEGUNDO METODO
##chave inicial do disco movel
alb.set_movable_key('p')
print 'Cifrando/Decifrando com o segundo metodo da cifra de Alberti'
cifrado = alb.encrypt('Dosar1gento4eotra2idor')
print 'Texto cifrado - ' + cifrado
##chave inicial do disco movel
alb.set_movable_key('p')
print 'Texto decifrado - ' + alb.decrypt(cifrado)
print ''

## TERCEIRO METODO
print 'Cifrando/Decifrando com o terceiro metodo'
##chaves do disco fixo e do disco movel
alb.set_keys('O', 'c')
cifrado = alb.encrypt('perigo', 2)
print 'Texto cifrado - ' + cifrado
alb.set_keys('O', 'c')
print 'Texto decifrado - ' + alb.decrypt(cifrado, 2)

O arquivo acima, sendo executado, tem como saída o resultado abaixo:

Cifrando/Decifrando com o primeiro metodo da cifra de Alberti
Texto cifrado - ByqgmtpxiyPhgSlgxhoag
Texto decifrado - osargentoeotraidor

Cifrando/Decifrando com o segundo metodo da cifra de Alberti
Texto cifrado - Dsikq1gcpxr4fktpm2qydc
Texto decifrado - osargentoeotraidor

Cifrando/Decifrando com o terceiro metodo
Texto cifrado - eoas&s
Texto decifrado - perigo

Fontes:
http://en.wikipedia.org/wiki/Alberti_cipher_disk
http://en.wikipedia.org/wiki/Alberti_cipher
http://www.numaboa.com.br/criptografia/historia/158-alberti
http://www.numaboa.com.br/criptografia/127-substituicao-polialfabetica/164-alberti

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.

6 respostas para Criptografia: Cifra ou disco de Alberti em Python

  1. Anna Carolina disse:

    Olá Fábio. Tudo bem?

    Estou com algumas mensagens criptografadas que acredito serem confeccionadas utilizando o Disco de Alberti.
    Como sou leiga no assunto, gostaria de ajuda para tentar desvendá-las.
    Você poderia me ajudar ou me indicar alguém que possa?
    Tenho certo urgência… grata desde já.

    • Fábio Medeiros disse:

      Olá Anna, tudo bem. E contigo?

      Há muitas variáveis para se descobrir um texto cifrado com Disco de Alberti, a começar pelo tamanho dos discos e a sequência dos alfabetos utilizados. Você tem algum exemplo do texto cifrado que eu possa ver?

  2. victor disse:

    como que fas esse aqui ikfn fkshnyin! ikfn n vsantvinsan! eglgpnsh! por favor logo

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