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.
Volta para CookBook.