Implementando Cifra de César em Python – Criptografia

Implementando Cifra de César em Python – Criptografia

Neste tutorial vamos mostrar um algoritmo simples para implementação da famosa Cifra de César em Python.

Cifra de César

A Cifra de César é uma técnica de criptografia bastante simples e provavelmente a mais conhecida de todas.

Trata-se de um tipo de cifra de substituição, na qual cada letra de um texto a ser criptografado é substituída por outra letra, presente no alfabeto porém deslocada um certo número de posições à esquerda ou à direita.

Por exemplo, se empregarmos uma troca de quatro posições à esquerda, cada letra é substituída pela letra que está quatro posições adiante no alfabeto, e nesse caso a letra A seria substituída pela letra E, a letra B por F, a letra C por G, e assim sucessivamente.

Código

A seguir temos o código utilizado em nosso programa. Esse código foi adaptado do livro “Hacking Secret Ciphers with Python“, que pode ser adquirido na Amazon ou lido on-line, sem custo.

# Cifra de César em Python
# Adaptado do livro "Hacking Secret Ciphers with Python", de Al Sweigart
# Licença Creative Commons Attribution-Noncommercial-Share Alike 3.0

# Solicitar o texto a ser encriptado ou decriptado
texto = input('Digite a mensagem a ser encriptada ou decifrada: ')
# Chave a ser utilizada
chave = int(input('Entre com o valor da chave (deslocamento): '))
# Determinar modo de operação (E = encriptar; D = decriptar)
modo = input('Escolha E para encriptar ou D para decriptar o texto: ')
# Conjunto de caracteres válidos no algoritmo
CARACTERES = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
# Variável para armazenar o texto criptografado (ou decifrado)
convertido = ''
# Converter todo o texto em maiúsculas
texto = texto.upper()

# Código que será executado em cada caractere do texto:
for caractere in texto:
    if caractere in CARACTERES:
        num = CARACTERES.find(caractere)
        if modo == 'E':
            num = num + chave
        elif modo == 'D':
            num = num - chave
        # Manipular a rotação se o valor de num for maior do que o comprimento de CARACTERES ou menor que 0
        if num >= len(CARACTERES):
            num = num - len(CARACTERES)
        elif num < 0:
            num = num + len(CARACTERES)
        # Adicionar (concatenar) o caractere correspondente a num na variável convertido
        convertido = convertido + CARACTERES[num] 
    else:
        # Concatenar o caractere sem efetuar criptografia ou decifragem
        convertido = convertido + caractere

# Mostrar o texto encriptado ou decifrado na tela
if modo == 'E':
    print('O texto criptografado é ', convertido)
elif modo == 'D':
    print('O texto decriptado é ', convertido)
else:
    print('Opção inválida')

Funcionamento do Código da Cifra de César em Python

Neste programa nós declaramos três variáveis que receberão dados digitados pelo usuário: texto, chave e modo.

A variável texto irá receber a mensagem que será criptografada (ou decifrada), a variável chave recebe um número (convertido para inteiro) que determina qual será o deslocamento dos caracteres a ser empregado na criptografia, e a variável modo determina se o programa irá encriptar ou decriptar uma mensagem.

Em seguida declaramos a constante CARACTERES, que irá conter um string composta das letras do alfabeto – que são os caracteres válidos a serem utilizados no processo de cifragem e decifragem. Note que apenas caracteres do alfabeto latino estão sendo empregados, mas você pode acrescentar mais caracteres (como letras acentuadas ou números) se desejar.

Finalmente, declaramos a variável convertido, que irá armazenar o texto encriptado ou decriptado que será exibido para o usuário no final do processo.

Com a instrução texto = texto.upper(), a mensagem contida na variável texto é convertida totalmente para maiúsculas, de modo que seus caracteres correspondam exatamente com os caracteres contidos na constante CARACTERES.

Na sequência, entramos em um laço for que será executado para cada caractere contido na mensagem a ser encriptada ou decriptada. Se um caractere da mensagem for encontrado dentro da constante CARACTERES, será aplicado o método String.find(), (CARACTERES.find(caractere)), retornando a posição do caractere dentro da constante (ou seja, número do caractere no alfabeto), e armazenando esse número na variável num.

O valor do caractere será obtido então por um dos métodos seguintes:

  • Se o modo escolhido pelo usuário foi “E” (encriptar”), será a soma do número de sua posição no alfabeto mais a chave de criptografia escolhida – num = num + chave. O valor é armazenado na própria variável num.
  • Se o modo escolhido pelo usuário foi “D” (decriptar”), será a diferença entre o número de sua posição no alfabeto e a chave de criptografia escolhida – num = num – chave. O valor é armazenado na própria variável num.

Logo após temos um condicional if:

if num >= len(CARACTERES):
  num = num - len(CARACTERES)
elif num < 0:
  num = num + len(CARACTERES)
  convertido = convertido + CARACTERES[num] 
else:
  convertido = convertido + caractere

Com este condicional o número obtido é comparado com o comprimento do alfabeto empregado (usando a função len()).

  • Se for maior ou igual, será subtraído de num o valor do comprimento do alfabeto (rotacionado).
  • Se for menor do que zero, o comprimento do alfabeto é somado a num. A variável convertido recebe o caractere presente na posição num do alfabeto (CARACTERES[num]). Em ambos os casos, o valor resultante é armazenado na própria variável num.
  • Se for menor do que o comprimento do alfabeto, porém maior que zero, o caractere é simplesmente concatenado na variável convertido.

Finalmente, a mensagem é exibida na tela com a função print():

if modo == 'E':
  print('O texto criptografado é ', convertido)
if modo == 'D':
  print('O texto decriptado é ', convertido)

Dependendo do modo escolhido a mensagem será diferente.

Testando o código

Vamos testar a cifra de César em Python efetuando a criptografia de uma frase qualquer. Por exemplo, vamos criptografar a frase “Quero uma pizza de calabresa“, usando uma chave de valor de deslocamento igual a 13:

Criptografando mensagem com cifra de césar em Python

Obtivemos o resultado “DHREB HZN CVMMN QR PNYNOERFN“. Vamos testar agora o processo inverso, decifrando essa mensagem com nosso script:

Decifrando mensagens com cifra de césar em pyhton

Como podemos ver na figura anterior, a mensagem foi decifrada corretamente ao fornecermos a chave de rotação utilizada (13) e o modo de decifragem (D).

É isso aí pessoal! Nos próximos tutoriais vamos mostrar como criar outros algoritmos interessantes com Python, incluindo uma implementação para a Cifra de Vigenère.

Até mais!

 

Sobre Fábio dos Reis (1195 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

5 Comentários em Implementando Cifra de César em Python – Criptografia

  1. Nao funciona, só muda uma letra ou duas, e depois nao decripta.

    • Amigo, dê uma revisada em seu código, aqui está funcionando normalmente.
      Temo como você postar o código que você usou aqui?

      • Na verdade está tudo errado mesmo e o código não funciona, há falhas na identação e o algoritmo acaba não funcionando, dê uma revisada nisso, precisa colocar a linha:
        convertido = convertido + CARACTERES[num]
        Apenas uma vez no final do primeiro IF do FOR.

        O código corrigido:

        # Cifra de César em Python
        # Adaptado do livro “Hacking Secret Ciphers with Python”, de Al Sweigart
        # Licença Creative Commons Attribution-Noncommercial-Share Alike 3.0

        # Solicitando o texto a ser encriptado ou decriptado:
        texto = input(‘Digite a mensagem a ser encriptada ou decifrada: ‘)
        # Chave a ser utilizada
        chave = int(input(‘Entre com o valor da chave (deslocamento): ‘))
        # Determinar modo de operação (E = encriptar; D = decriptar)
        modo = input(‘Escolha E para encriptar ou D para decriptar o texto: ‘)
        # Conjunto de caracteres válidos no algoritmo
        CARACTERES = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’
        # Variável para armazenar o texto criptografado (ou decifrado)
        convertido = ”
        # Converter todo o texto em maiúsculas:
        texto = texto.upper()
        # Código que será executdo em cada caractere do texto:
        for caractere in texto:
        if caractere in CARACTERES:
        # Obter o número criptografado ou decriptado do caractere
        num = CARACTERES.find(caractere)
        # Obter o número do caractere
        if modo == ‘E’:
        num = num + chave
        elif modo == ‘D’:
        num = num – chave
        # Manipulando a rotação se o valor de num for maior do que o comprimento de CARACTERES ou menor que 0
        if num >= len(CARACTERES):
        num = num – len(CARACTERES)
        elif num < 0:
        num = num + len(CARACTERES)
        # Adicionar (concatenar) o caractere correspondente a num na variável convertido
        convertido = convertido + CARACTERES[num]
        else:
        convertido = convertido + caractere
        # Mostrar o texto encriptado ou decifrado na tela:
        if modo == 'E':
        print('O texto criptografado é ', convertido)
        if modo == 'D':
        print('O texto decriptado é ', convertido)

  2. def cifraDeCesar(chave,arq):
    ”’
    Codifica um texto segunda as regras da Cifra de Cesar
    :param chave: Chave básica para a códificação
    :param arq: Arquivo que será codificado
    :return: texto codificado
    ”’

    #codificação das eltras minúsculas
    alfaLow = ‘abcdefghijklmnopqrstuvxwyz’
    quebraLow = alfaLow.partition(alfaLow[:chave])
    tradLow = quebraLow[2]+quebraLow[1]

    #codificação das eltras maiúsculas
    alfaUp = ‘ABCDEFGHIJKLMNOPQRSTUVXZ’
    quebraUp = alfaUp.partition(alfaUp[:chave])
    tradUp = quebraUp[2]+quebraUp[1]

    trad = str.maketrans(alfaLow+alfaUp,tradLow+tradUp)

    arquivo = open(arq,’r’)
    return arquivo.read().translate(trad)
    arquivo.close()

    print(cifraDeCesar(3,’clear.txt’))

    • Willian Delmiro // 28/11/2023 em 22:35 // Responder

      o seu tbm tem varias falhas, como identação por exemplo
      e eu executei o seu codigo e ainda assim ele não funciona corretamente

Escreva um comentário

Seu e-mail não será divulgado


*