/
cifra.py
88 lines (73 loc) · 2.94 KB
/
cifra.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# coding: utf-8
import operator
alfabeto = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
caracteres_especiais = ['?', ',', ':', ' ', '.']
# chave = "WONDERWOMAN"
chave = "MAXIMOFF"
LIMITE_SUPERIOR = 126
LIMITE_INFERIOR = 32
def is_posicao_de_uma_letra(pos):
return (pos >= 65 and pos <= 90) or (pos >= 97 and pos <= 122)
class Cifra():
def definir_lista_circular(self, lista):
while True:
for nodo in lista:
yield nodo
def criptografar_conteudo(self, conteudo):
chave_circular = self.definir_lista_circular(chave)
texto = ""
for caractere in conteudo:
letra_chave = next(chave_circular)
ascii = ord(caractere)
if caractere not in caracteres_especiais and is_posicao_de_uma_letra(ascii):
pos = ascii + alfabeto.index(letra_chave)
if pos > LIMITE_SUPERIOR:
pos -= LIMITE_SUPERIOR
if pos < LIMITE_INFERIOR:
pos += LIMITE_INFERIOR
nova_letra = chr(pos)
else:
nova_letra = caractere
texto += nova_letra
return texto
def descriptografar_conteudo(self, conteudo):
chave_circular = self.definir_lista_circular(chave)
texto = ""
for caractere in conteudo:
letra_chave = next(chave_circular)
ascii = ord(caractere)
if caractere not in caracteres_especiais:
pos = ascii - alfabeto.index(letra_chave)
if pos < LIMITE_INFERIOR:
pos = ascii + LIMITE_SUPERIOR - alfabeto.index(letra_chave) - LIMITE_INFERIOR
nova_letra = chr(pos)
else:
nova_letra = caractere
texto += nova_letra
return texto
# TODO: remover esse método se não for utilizado pra generalizar
def resolve_criptografia(self, conteudo, decrypt=False):
chave_circular = self.definir_lista_circular(chave)
texto = ""
operador = operator.sub if decrypt else operator.add
for caractere in conteudo:
print(caractere)
letra_chave = next(chave_circular)
print(letra_chave)
ascii = ord(caractere)
print(ascii)
if (decrypt and ascii != LIMITE_INFERIOR) or (not decrypt and ascii != LIMITE_INFERIOR and is_posicao_de_uma_letra(ascii)):
pos = operador(ascii, alfabeto.index(letra_chave))
tentativas = 0
while validar_posicao(pos) and tentativas < 3:
pos = posicao_interna
tentativas += 1
print(pos)
nova_letra = chr(pos)
else:
nova_letra = caractere
print(nova_letra)
print("----------------")
texto += nova_letra
return texto