Skip to content

Commit 83a5d41

Browse files
committedSep 30, 2021
Implement rules and finish cypher
1 parent 5dc2d76 commit 83a5d41

File tree

1 file changed

+153
-18
lines changed

1 file changed

+153
-18
lines changed
 

‎playfair.py

+153-18
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@
3131

3232
escolha_disponiveis = [1, 2, 3, 4, 5, 6]
3333

34+
PRIMEIRA_COLUNA = 0
35+
ULTIMA_COLUNA = 4
36+
37+
PRIMEIRA_LINHA = 0
38+
ULTIMA_LINHA = 4
39+
3440

3541
def preparar_mensagem(mensagem):
3642
mensagem = mensagem.lower()
@@ -67,40 +73,158 @@ def achar_localizacao_caracter(caracter, tabela_cifra):
6773
return {"linha": i, "coluna": j}
6874

6975

70-
def cifrar(mensagem, tabela_cifra):
71-
print(mensagem)
72-
print(tabela_cifra)
76+
def achar_proxima_letra_linha(linha, coluna, tabela_cifra, decifrar=False):
77+
operacao = -1 if decifrar else 1
78+
coluna_limite = PRIMEIRA_COLUNA if decifrar else ULTIMA_COLUNA
79+
proxima_coluna = ULTIMA_COLUNA if decifrar else PRIMEIRA_COLUNA
80+
81+
if coluna != coluna_limite:
82+
# Letra no meio da matriz (andar uma coluna para a direita)
83+
proxima_letra = tabela_cifra[linha][coluna + operacao]
84+
else:
85+
# Letra na última coluna (ir para coluna inicial ou final)
86+
proxima_letra = tabela_cifra[linha][proxima_coluna]
87+
88+
return proxima_letra
89+
90+
91+
def achar_proxima_letra_coluna(linha, coluna, tabela_cifra, decifrar=False):
92+
operacao = -1 if decifrar else 1
93+
linha_limite = PRIMEIRA_LINHA if decifrar else ULTIMA_LINHA
94+
proxima_linha = ULTIMA_LINHA if decifrar else PRIMEIRA_LINHA
7395

96+
if linha != linha_limite:
97+
# Letra no meio da matriz (andar uma coluna para a direita)
98+
proxima_letra = tabela_cifra[linha + operacao][coluna]
99+
else:
100+
# Letra na última linha (ir para linha inicial ou final)
101+
proxima_letra = tabela_cifra[proxima_linha][coluna]
102+
103+
return proxima_letra
104+
105+
106+
def formatar_mensagem_cifrada(mensagem):
107+
mensagem_final = ''
74108
counter = 0
109+
while counter < len(mensagem):
110+
letra1 = mensagem[counter]
111+
letra2 = mensagem[counter + 1]
112+
letra3 = mensagem[counter + 2]
113+
letra4 = mensagem[counter + 3]
114+
115+
mensagem_final += f'{letra1}{letra2}{letra3}{letra4}'
75116

117+
mensagem_final = mensagem_final.upper()
118+
119+
mensagem_final += ' '
120+
121+
counter += 4
122+
123+
return mensagem_final
124+
125+
126+
def formatar_mensagem_decifrada(mensagem):
127+
mensagem_final = ''
128+
counter = 0
76129
while counter < len(mensagem):
77-
caracter_atual = mensagem[counter]
78-
proximo_caracter = mensagem[counter + 1]
130+
letra1 = mensagem[counter]
131+
letra2 = mensagem[counter + 1]
132+
133+
mensagem_final += f'{letra1}{letra2}'
134+
135+
mensagem_final = mensagem_final.upper()
79136

80-
print('caracter_atual', caracter_atual)
81-
print('proximo_caracter', proximo_caracter)
137+
mensagem_final += ' '
138+
139+
counter += 2
82140

83-
localizacao_caracter_atual = achar_localizacao_caracter(
84-
caracter_atual, tabela_cifra
141+
return mensagem_final
142+
143+
144+
def cifrar(mensagem, tabela_cifra, decifrar=False):
145+
counter = 0
146+
147+
mensagem_cifrada = mensagem
148+
149+
while counter < len(mensagem):
150+
primeiro_caracter = mensagem[counter]
151+
segundo_caracter = mensagem[counter + 1]
152+
153+
localizacao_primeiro_caracter = achar_localizacao_caracter(
154+
primeiro_caracter, tabela_cifra
85155
)
86156

87-
localizacao_proximo_caracter = achar_localizacao_caracter(
88-
proximo_caracter, tabela_cifra
157+
localizacao_segundo_caracter = achar_localizacao_caracter(
158+
segundo_caracter, tabela_cifra
89159
)
90160

91-
print('localizacao_caracter_atual', localizacao_caracter_atual)
92-
print('localizacao_proximo_caracter', localizacao_proximo_caracter)
161+
linha_primeiro_caracter = localizacao_primeiro_caracter['linha']
162+
coluna_primeiro_caracter = localizacao_primeiro_caracter['coluna']
163+
164+
linha_segundo_caracter = localizacao_segundo_caracter['linha']
165+
coluna_segundo_caracter = localizacao_segundo_caracter['coluna']
93166

94167
# Execução das regras da cifra de Playfair
95-
if localizacao_caracter_atual['linha'] == localizacao_proximo_caracter['linha']:
96-
print('Executa primeira regra')
97-
elif localizacao_caracter_atual['coluna'] == localizacao_proximo_caracter['coluna']:
98-
print('Executa segunda regra')
168+
if linha_primeiro_caracter == linha_segundo_caracter:
169+
# Primeira regra
170+
proxima_letra_primeiro_caracter = achar_proxima_letra_linha(
171+
linha_primeiro_caracter,
172+
coluna_primeiro_caracter,
173+
tabela_cifra,
174+
decifrar=decifrar
175+
)
176+
177+
mensagem_cifrada[counter] = proxima_letra_primeiro_caracter
178+
179+
proxima_letra_segundo_caracter = achar_proxima_letra_linha(
180+
linha_segundo_caracter,
181+
coluna_segundo_caracter,
182+
tabela_cifra,
183+
decifrar=decifrar
184+
)
185+
186+
mensagem_cifrada[counter + 1] = proxima_letra_segundo_caracter
187+
188+
elif coluna_primeiro_caracter == coluna_segundo_caracter:
189+
# Segunda regra
190+
proxima_letra_primeiro_caracter = achar_proxima_letra_coluna(
191+
linha_primeiro_caracter,
192+
coluna_primeiro_caracter,
193+
tabela_cifra,
194+
decifrar=decifrar
195+
)
196+
197+
mensagem_cifrada[counter] = proxima_letra_primeiro_caracter
198+
199+
proxima_letra_segundo_caracter = achar_proxima_letra_coluna(
200+
linha_segundo_caracter,
201+
coluna_segundo_caracter,
202+
tabela_cifra,
203+
decifrar=decifrar
204+
)
205+
206+
mensagem_cifrada[counter + 1] = proxima_letra_segundo_caracter
207+
99208
else:
100-
print('Executa terceira regra')
209+
# Terceira regra
210+
proxima_letra_primeiro_caracter = tabela_cifra[linha_primeiro_caracter][coluna_segundo_caracter]
211+
212+
proxima_letra_segundo_caracter = tabela_cifra[linha_segundo_caracter][coluna_primeiro_caracter]
213+
214+
mensagem_cifrada[counter] = proxima_letra_primeiro_caracter
215+
216+
mensagem_cifrada[counter + 1] = proxima_letra_segundo_caracter
101217

102218
counter += 2
103219

220+
if decifrar:
221+
print('Mensagem decifrada: ',
222+
formatar_mensagem_decifrada(mensagem_cifrada))
223+
else:
224+
print('Mensagem cifrada: ', formatar_mensagem_cifrada(mensagem_cifrada))
225+
226+
return mensagem_cifrada
227+
104228

105229
def requisitar_escolha():
106230
print(
@@ -123,10 +247,14 @@ def requisitar_escolha():
123247
def main():
124248
alfabeto = 'Y Q D L G M J X F U V W C P B O S K R E T H N A I'
125249

250+
print('Alfabeto inicial: ', alfabeto)
251+
126252
tabela_cifra = preparar_tabela_cifra(alfabeto)
127253

128254
mensagem_a_cifrar = 'E ESTA CIFRA E INQUEBRAVEL'
129255

256+
print('Mensagem inicial: ', mensagem_a_cifrar)
257+
130258
mensagem_a_cifrar = preparar_mensagem(mensagem_a_cifrar)
131259

132260
escolha = requisitar_escolha()
@@ -165,6 +293,13 @@ def main():
165293

166294
escolha = requisitar_escolha()
167295

296+
if escolha == 4:
297+
mensagem_cifrada = cifrar(mensagem_a_cifrar, tabela_cifra)
298+
299+
cifrar(mensagem_cifrada, tabela_cifra, decifrar=True)
300+
301+
escolha = requisitar_escolha()
302+
168303
if escolha == 5:
169304
print(alfabeto)
170305

0 commit comments

Comments
 (0)
Please sign in to comment.