Criptografia: Cifra de César em Python

Quase todos já devem ter ouvido falar de criptografia. Se não ouviram, com certeza já utilizaram algum sistema ou serviço que se utilize de criptografia.

Sites de banco, por exemplo, utilizam um protocolo (HTTPS) que utiliza criptografia para garantir a segurança do seu acesso à sua conta; outro exemplo pode ser o acesso ao seu webmail.

Mas o que realmente é criptografia? Criptografia, junção de duas palavras gregas κρυπτός (kriptós – secreto, escondido) e γράφειν (gráfein – escrita), é, resumindo, o uso de técnicas para transformar texto ou dados legíveis em informação ilegível, que não possa ser compreendida. O procedimento básico pode ser mostrado na figura abaixo:

Crypto

Figura 1 – Cifragem e decifragem

O algoritmo desenvolvido que realiza as funções de cifrar ou decifrar recebe o nome de cifra. Toda cifra, para realizar a sua função necessita de uma chave. A chave é uma informação que controla o resultado do algoritmo.

CIFRA DE CÉSAR

Uma das cifras mais conhecidas é a cifra de César, que foi utilizada por Júlio César para se comunicar com suas tropas durante as guerras que travava[1].

Esta cifra é bastante simples, consiste na substituição de uma letra do alfabeto por seu correspondente três casas adiante, ou seja, a letra A é substituída pela letra D, a letra B pela letra E e assim por diante (figura 2). Neste caso, o algoritmo da cifra é a troca de uma letra por outra em uma determinada posição. E a chave, neste caso, é o número 3.

Caesar3

Figura 2 – Cifra de César

CÓDIGO

Abaixo há uma implementação bem simples, em Python, da cifra de César.

class Caesar:
    def __init__(self):
        self.__letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

    def encrypt(self, texto_plano, key = 3):
        '''(Caesar, str, int) -> str

        Retorna o texto_plano cifrado com a cifra
        de Cesar, utlizando a chave key,
        cujo padrao e 3.
        '''
        cipher_text = ''
        texto_plano = texto_plano.upper()
        for ch in texto_plano:
            if ch in self.__letters:
                idx = self.__letters.find(ch) + key
                if idx >= 26:
                    idx -= 26
                cipher_text += self.__letters[idx]
        return cipher_text

    def decrypt(self, texto_cifrado,  key = 3):
        ''' (Caesar, str, int) -> str

        Retorna em texto plano o texto_cifrado decifrado
        com a cifra de Cesar, utilizando a chave key,
        cujo padrao e 3.
        '''
        plain_text = ''
        texto_cifrado = texto_cifrado.upper()
        for ch in texto_cifrado:
            if ch in self.__letters:
                idx = self.__letters.find(ch) - key
                plain_text += self.__letters[idx]
        return plain_text.lower()

BitBin

Vale comentar que esta classe não trata caracteres acentuados e despreza os espaços em branco.

TESTES

O código foi salvo em um arquivo caesar.py

>>> from caesar import Caesar
>>> Caesar().encrypt('teste de texto com a cifra de Cesar')
'WHVWHGHWHAWRFRPDFLIUDGHFHVDU'
>>> Caesar().decrypt('WHVWHGHWHAWRFRPDFLIUDGHFHVDU')
'testedetextocomacifradecesar'

Os métodos da classe recebem outro parâmetro além do texto a ser cifrado ou decifrado. Recebem o valor da chave, que caso não seja passado nenhum valor, será utilizado o valor 3, como no exemplo acima. Abaixo, um exemplo de uma chave diferente de 3:

>>> from caesar import Caesar
>>> Caesar().encrypt('teste de texto com a cifra de Cesar', 21)
'OZNOZYZOZSOJXJHVXDAMVYZXZNVM'
>>> Caesar().decrypt('OZNOZYZOZSOJXJHVXDAMVYZXZNVM', 21)
'testedetextocomacifradecesar'

[1] http://en.wikipedia.org/wiki/Caesar_cipher#History_and_usage

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.

3 respostas para Criptografia: Cifra de César em Python

  1. Pingback: Criptografia: cifras de transposição e cifras de substituição | siriarah

  2. Pingback: Criptografia: Cifra de substituição simples em Python | siriarah

  3. Muito legal para estudo!
    Segue uma versão aprimorada com espaços e aceitando letras maiúsculas e minúsculas, mas ainda não aceitando acento (próximo desafio pra alguém aí!):

    # coding: utf-8
    '''
    Created on 22 de nov de 2016
    
    @author: siriarah atualizado por George Mendonça
    '''
    
    class Cifer(object):
    
        def __init__(self):
            self._alfabeto = ' AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'
    
        def criptografar(self, texto, chave = 4):
            texto_criptografado = ''
           
            for caractere in texto:
                if caractere in self._alfabeto:
                    index = self._alfabeto.find(caractere) + chave
                    if index >= 54:
                        index -= 54
                    texto_criptografado += self._alfabeto[index]
            return texto_criptografado
        
        def descriptografar(self, texto_criptogradado, chave = 4):
            texto = ''
            
            for caractere in texto_criptogradado:
                if caractere in self._alfabeto:
                    index = self._alfabeto.find(caractere) - chave
                    texto += self._alfabeto[index]
            return texto
    
    if __name__ == '__main__':
        cifer = Cifer()
        chave = 5
        c = cifer.criptografar('CENOURA verde', chave)
        print(c)
        dc = cifer.descriptografar(c, chave)
        print(dc)
    

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