associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

CriptografiaDidatica

Este é um exemplo didático de como se implementa um algorítmo de criptografia simétrica baseado em chaves. Este algorítmo é extremamente fraco e não deve ser usado para nada além do propósito de ensino. Um criptoanalista não precisaria nem ter conhecimentos de matemática para quebrar a criptografia de uma mensagem cifrada com este método, bastaria a ele um conhecimento do idioma.

Código

   1 # criptografia.py
   2 # -*- coding: iso-8859-1 -*-
   3 #
   4 # Exemplo de um algoritmo de criptografia com chave
   5 # usando o algoritmo criptográfico de Cesar
   6 #
   7 # /!\ Este algorítmo é extremamente fraco e serve
   8 # apenas para demonstração
   9 
  10 maintable = [
  11 " 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.;/áéíóúÁÉÍÓÚàÀãõÃÕüÜ",
  12 "mübõaÚfSÀy,NtvKcJ0ouICHB nT2kzóÕD;Lw/3rlZÉRÃ4ãP6éjiÜAGÍYM8OX5àÓWsVqFUxEpÁQ7hgúá1í9.de",
  13 ".UPeZO/hIxJlzgcáCÀL5õsvE7au1fóÍ,Q8úq9DéãHGXr3jàR ;oyüdíNMÁwiTÜ24tm6nBÕSÓWKÉb0YÃFVAkpÚ",
  14 "fuNDEbmlJ2RÀãovCUGta8AÓ,áXúFYÕWQwh/ rZ1MeSTOPs3yd.IKÜ5BknÃqóíÉ7Íõc4zgÚ9üVjéxHàÁ;0L6ip",
  15 "0É;2vtóQwqaIiKzcBVyG9éãCfsHkmüPFngx/8 WÕeíÜÍDÃULu.ZoMhpbú,NAOÚJ5á7r3ÀSlÓ4T6d1RõàÁjEYX",
  16 "JhYb1OGÁáIKremü78H2Bsgã.õ69P/Qu;AlVWXàzoCf4íDSNZóÜtRkyipÍajÉ ÓqéFMdúLUEn5xTÕ3,0ÃvÚwcÀ",
  17 "ÜãÃHYaQÁi94rGm8ÀxZcàóy2kÚqvU7FouP3VzLXBlgjúÍáIJApWsKtÓCwfdSéíeM0hnbõü1OÕ,T5 ./N6D;ERÉ",
  18 "Zõsd8u1V6aGÀÓÚ/9ÁíÃ2áRH5;X4AvCãWwDüióxÉéjcgJKoyú.eIf7YzhTtUSbBO,mP3pqQÜN0ÍàEkrFlnMLÕ ",
  19 "6;áMua /.ÍcéP2Ysm,ówÁ347í9iJLnpFHK5àeARÜDõúZüÀgQoÓyqkxObÚÉvBlNrXWÕCETIhd8zV10GtSfÃUjã",
  20 "hÉÍ,P7úN;zQõÁocDUàI6rC qOB0ãítMYa8.3pÃyT/2ükdEKxf5éJZÓÜÀRuiH4sASXFó91áwjLGWvlÚngbVÕem",
  21 ]
  22 
  23 def normalize_key(key):
  24     key = [ ord(k) % 10 for k in key ]
  25     return len(key), key
  26 
  27 def crypt(text, key, table):
  28     size, key = normalize_key(key)
  29     text = list(text)
  30 
  31     pos = 0
  32     for char in text:
  33         subtable = table[key[pos % size]]
  34         new_char_position = table[0].find(char)
  35 
  36         if new_char_position < 0:
  37             new_char = char
  38         else:
  39             new_char = subtable[new_char_position]
  40         text[pos] = new_char
  41 
  42         pos += 1
  43 
  44     return ''.join(text)
  45 
  46 def uncrypt(text, key, table):
  47     size, key = normalize_key(key)
  48     text = list(text)
  49 
  50     pos = 0
  51     for char in text:
  52         subtable = table[key[pos % size]]
  53         new_char_position = subtable.find(char)
  54 
  55         if new_char_position < 0:
  56             new_char = char
  57         else:
  58             new_char = table[0][new_char_position]
  59 
  60         text[pos] = new_char
  61 
  62         pos += 1
  63 
  64     return ''.join(text)
  65 
  66 def generate_maintable():
  67     import random
  68     print "maintable = ["
  69     x = list("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,.;/áéíóúÁÉÍÓÚàÀãõÃÕüÜ")
  70     for i in range(10):
  71         print '    "%s",' % (''.join(x))
  72         random.shuffle(x)
  73     print "]"

Exemplo de uso

   1 import criptografia
   2 
   3 mensagem = "Vamos invadir a região amanhã às 15hs GMT"
   4 chave = "mitzuplick"
   5 mensagem_cifrada = crypt(mensagem, chave, maintable)
   6 print "Mensagem original: %s" % (mensagem)
   7 print "Mensagem cifrada: %s" % (mensagem_cifrada)
   8 print "Mensagem de retorno: %s" % (uncrypt(mensagem_cifrada, chave, maintable))

A maintable deve ser a mesma para o processo de criptografia e de decriptografia da mensagem. Para gerá-la basta executar o código abaixo, copiar a saída e colar dentro do código.

   1 import criptografia
   2 criptografia.generate_maintable()

Volta para CookBook.


OsvaldoSantanaNeto