Cifra de César em Python

Uma introdução a criptografia e uma forma simples de aprender uma linguagem.

Fernando Souza
Vacatronics

--

By Matt_Crypto — http://en.wikipedia.org/wiki/File:Caesar3.png, Public Domain, https://commons.wikimedia.org/w/index.php?curid=30693472

Quando estamos tentando aprender uma linguagem de programação nova, normalmente nos deparamos com problemas ou algoritmos que nos ajudam nesse processo. Por se tratar de uma forma bem simples de criptografia (por favor, não use isso no dia a dia), é um bom projeto para alguém que está começando a aprender uma nova linguagem.

Definição

A Cifra de César é uma famosa e bem antiga implementação de criptografia. Basicamente pega uma sentença e reorganiza as letras baseado em um deslocamento de letras do alfabeto.

Por exemplo, com uma troca de 4 posições, o A se torna E, B se torna F, e assim por diante. Ao chegar no fim do alfabeto, se retorna ao início (por exemplo, Z se torna D).

Então, a seguinte mensagem:

Cifra de cesar

Ficaria do seguinte modo:

Gmjve hi giwev

A mensagem se torna mais difícil de ler e permite mensagens serem enviadas um pouco mais imperceptíveis.

Algoritmo

Vamos mostrar os passos para implementar esse código.

  • Passo 1: identificar o caractere dentro da sentença.
  • Passo 2: achar a posição desse caractere dentro do alfabeto.
  • Passo 3: pegar o caractere que está na posição + chave dentro do alfabeto.

Nota: caso o (posição + chave) > 26, volte pra posição inicial.

Nota 2: como o português possui caracteres com acento, vamos implementar um alfabeto um pouco maior, considerando esses casos.

Nota 3: para decodificar uma mensagem, basta pegar o caractere na posição — chave dentro do alfabeto.

  • Passo 4: criar uma nova sentença com os novos caracteres no lugar dos antigos.
  • Passo 5: repetir até que o final da sentença seja atingido.
  • Passo 6: retornar o resultado.

Código

Então, vamos começar a codificar os nossos passos. Vamos criar uma função que receba a string com a nossa frase, a chave que vamos usar (um inteiro como offset) e o modo (encriptar, valor igual a 1, ou decriptar, valor igual a 0):

def caesar(data, key, mode):

Vamos declarar então o nosso alfabeto:

alphabet = 'abcdefghijklmnopqrstuvwyzàáãâéêóôõíúçABCDEFGHIJKLMNOPQRSTUVWYZÀÁÃÂÉÊÓÕÍÚÇ'

Nota: esse nosso alfabeto tem bem mais do que 26 letras, já que considera tanto as maiúsculas quanto as minúsculas, assim como os caracteres que podem aceitar acentos.

Depois, temos que encontrar o caractere da string de entrada dentro desse alfabeto, fazendo um loop para varrer toda a cadeia da sentença.

new_data = ''
for c in data:
index = alphabet.find(c)
if index == -1:
# Caractere não achado
new_data += c
else:
# Tratar caractere

Caso o caractere não tenha sido achado, vamos retornar o caractere original (isso inclui espaços, pontos, etc). Você pode incluir esses caracteres dentro do alfabeto original e fazer uma cifra mais completa.

Agora, precisamos achar a posição do nosso novo caractere de acordo com a chave que temos e o modo (encriptar ou decriptar):

new_index = index + key if mode == 1 else index - key

Como essa conta pode passar do número total do nosso alfabeto, temos que garantir que esse valor está dentro do intervalo. Para isso, vamos usar a operação módulo:

new_index = new_index % len(alphabet)

Depois vamos adicionar o novo caractere, que está na posição que calculamos, para a nossa nova string:

new_data += alphabet[new_index:new_index+1]

Ao fim do loop, só precisamos retornar o novo dado:

return new_data

Para testar, basta chamarmos nossa função com os parâmetros corretos:

key = 5
original = 'a ligeira raposa marrom saltou sobre o cachorro cansado'
print(' Original:', original)
ciphered = caesar(original, key, MODE_ENCRYPT)
print('Encriptada:', ciphered)
plain = caesar(ciphered, key, MODE_DECRYPT)
print('Decriptada:', plain)

E teremos a seguinte saída:

  Original: a ligeira raposa marrom saltou sobre o cachorro cansado
Encriptada: f qnljnwf wfutyf rfwwtr yfqztà ytgwj t hfhmtwwt hfsyfit
Decriptada: a ligeira raposa marrom saltou sobre o cachorro cansado

O código completo:

Resumo

E assim é como você implementa um simples algoritmo de encriptação. Claro que isso é totalmente inseguro e não deve ser usado em nenhuma aplicação real. Mas é divertido pra começar a aprender uma linguagem e brincar um pouco.

Muito obrigado pela leitura!

--

--

Fernando Souza
Vacatronics

Enthusiast of programming, electronics, technology and beer, not necessarily in that order. BuyMeACoffee: buymeacoffee.com/ustropo