Posts Tagged 'python'

Criptografia: Bastão de Licurgo (scytale) em Python

O Bastão de Licurgo ou scytale (σκυτάλη, bastão) ou cítala é uma técnica de cifragem utilizada pelos soldados espartanos, embora alguns estudiosos sugiram que isto seja apenas um mito.[1][2][3]

Todavia, seu processo consistia em se enrolar uma tira de tecido sobre um bastão de largura definida e sobre esta tira escrevia-se a mensagem. Finda a mensagem, a tira era desenrolada e enviada como um cinto por um mensageiro.

Scytale

No destino a tira devia ser enrolada num bastão de largura igual ao qual a mensagem foi escrita; sendo o bastão da mesma largura a mensagem se revelava. O algoritmo da cifra, neste caso, é o enrolar da tira no bastão e a chave, a sua largura.

Uma forma de visualizar a distribuição da mensagem é transpô-la para uma tabela. Para isso, dividimos o tamanho da mensagem pelo número de linhas (o que equivale à sua largura) e obtemos a quantidade de colunas. Tomemos como exemplo a mensagem: ‘o ataque será realizado amanhã‘. Desprezando-se os espaços em branco e trocando-se os caracteres especiais, teremos a seguinte mensagem a ser cifrada: ‘oataqueserarealizadoamanha‘. Sendo o tamanho do texto de 26 caracteres e a largura do bastão (chave) 4, e a divisão não é inteira, o número de colunas deve ser 7, assim:

   (preenchimento)
 → |o|a|t|a|q|u|e|
   |s|e|r|a|r|e|a|
   |l|i|z|a|d|o|a|
   |m|a|n|h|a| | |

E, como a divisão não foi inteira, ficaram dois espaços na tabela que eu resolvi preencher com as letras do alfabeto:

(cifragem)
↓ |o|a|t|a|q|u|e|
  |s|e|r|a|r|e|a|
  |l|i|z|a|d|o|a|
  |m|a|n|h|a|A|B|

Perceba que o preenchimento da tabela se dá da esquerda para a direita e de cima para baixo, mas a sua cifragem se faz de cima para baixo e da esquerda para a direita. Assim, o texto cifrado será:

OSLMAEIATRZNAAAHQRDAUEOAEAAB

CÓDIGO

Abaixo o código da classe Scytale em Python:

class Scytale:
    def encrypt(self, texto, key):
        ''' (Scytale, str, int) -> str
        Cifra o texto com a cifra scytale utilizando
        a chave key.
        '''
        cifrado = ''
        texto = texto.replace(' ', '')

        qtd_ch = len(texto)
        col = qtd_ch // key
        if qtd_ch % key > 0:
            col += 1

        i = ord('A')
        while len(texto) < key * col:
            texto += chr(i)
            i += 1

        for i in range(col):
            for j in range(0, qtd_ch, col):
                cifrado += texto[i + j]
        return cifrado.upper()

    def decrypt(self, texto, key):
        ''' (Scytale, str, int) -> str
        Decifra o texto cifrado com a cifra Scytale
        usando a chave key.
        '''
        texto_plano = ''
        texto = texto.replace(' ', '')
        for i in range(key):
            for j in range(0, len(texto), key):
                texto_plano += texto[i + j]
        return texto_plano.lower()

TESTES

O código foi salvo no arquivo scytale.py

>>> from scytale import Scytale
>>> Scytale().encrypt('o ataque sera realizado amanha', 4)
'OSLMAEIATRZNAAAHQRDAUEOAEAAB'
>>> Scytale().decrypt('OSLMAEIATRZNAAAHQRDAUEOAEAAB', 4)
'oataqueserarealizadoamanhaab'

[1] http://en.wikipedia.org/wiki/Scytale

[2] http://www.numaboa.com.br/criptografia/transposicoes/322-bastao-de-licurgo

[3] http://www.civilwarsignals.org/pages/crypto/cryptotl.html

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) -&gt; 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 &gt;= 26:
                    idx -= 26
                cipher_text += self.__letters[idx]
        return cipher_text

    def decrypt(self, texto_cifrado,  key = 3):
        ''' (Caesar, str, int) -&gt; 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()

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

Livro gratuito (11) – A Byte of Python

Seguindo na onda de livros gratuitos para desenvolvedores Python ([1], [2]), apresento mais um, A Byte of Pyhon, de Swaroop C. H.

Este é um livro mais voltado para iniciantes, possuindo edições que abordam tanto o Python 2.x quanto a versão 3.x. Ambos estão disponíveis tanto para leitura online quanto para download em formato PDF, mas, segundo o autor, o livro que abrange o Python 2.x não terá mais suporte.

E, apesar de o livro estar em inglês, existe também uma edição com tradução em português (Python 3.x) que pode ser lida aqui.

[Atualização 22/11/2012]

O livro agora também está disponível no formato ePub, tanto o original em inglês quanto à sua versão em português.

Boa leitura!

Livro gratuito (10) – Dive Into Python 3

No post anterior, falei do livro Dive Into Python. A grande desvantagem deste livro é não abranger a versão 3 do Python.

Mas seus problemas acabaram :) . O mesmo autor lançou também uma nova edição do livro: Dive Into Python 3, que abrange a versão 3 e suas diferenças da versão 2 da linguagem. Não está disponível para leitura online, mas pode ser baixado em formato HTML ou PDF.

Boa leitura.

Livro gratuito (9) – Dive Into Python

Desta vez a dica é para programadores Python.

Esta tem sido a linguagem que venho utilizando para criar meus scripts para conversão da Bíblia ACF para os diversos formatos que disponibilizo no blog.

O livro Dive Into Python, de Mark Pilgrim, está disponível para leitura online ou pode ser baixado gratuitamente, em diversos formatos de arquivo. Está um pouco desatualizado (a última atualização no livro foi feita em 20/05/2004 e abrange a versão 2 da linguagem), mas ainda é bastante útil para quem deseja aprender sobre programação com a linguagem Python.

Boa leitura.

Livro gratuito (2) – Python para desenvolvedores

Como de costume, recebo por meio de meus RSS, muita coisa. E hoje acabei de ver o lançamento do livro Python para desenvolvedores, por meio do site Aprenda Python.

Python é uma das linguagens de programação que atualmente estou aprendendo, pois acabo utilizando-a tanto no Windows quanto no Ubuntu. É uma linguagem muito boa de se aprender e desenvolver rápidas soluções com ela.

O livro está sendo disponibilizado gratuitamente, e, de acordo com o site, sob uma Licença Creative Commons, que, em um breve resumo, permite copiar, distribuir, exibir e executar a obra, criar obras derivadas, observando-se determinadas condições expostas no site da licença.

Bons códigos :) !


The Ubuntu Counter Project - user number # 21175
Livros só mudam pessoas

Atualizações Twitter

Comentários

The Greek New Testam… em Livros – ePub
Ezequiel em Quem sou eu
Fábio Medeiros em Quem sou eu
Ezequiel em Quem sou eu
Fábio Medeiros em Livros – ePub

Arquivos

Categorias


Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 115 outros seguidores

%d bloggers like this: