31
31
32
32
escolha_disponiveis = [1 , 2 , 3 , 4 , 5 , 6 ]
33
33
34
+ PRIMEIRA_COLUNA = 0
35
+ ULTIMA_COLUNA = 4
36
+
37
+ PRIMEIRA_LINHA = 0
38
+ ULTIMA_LINHA = 4
39
+
34
40
35
41
def preparar_mensagem (mensagem ):
36
42
mensagem = mensagem .lower ()
@@ -67,40 +73,158 @@ def achar_localizacao_caracter(caracter, tabela_cifra):
67
73
return {"linha" : i , "coluna" : j }
68
74
69
75
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
73
95
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 = ''
74
108
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 } '
75
116
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
76
129
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 ()
79
136
80
- print ('caracter_atual' , caracter_atual )
81
- print ('proximo_caracter' , proximo_caracter )
137
+ mensagem_final += ' '
138
+
139
+ counter += 2
82
140
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
85
155
)
86
156
87
- localizacao_proximo_caracter = achar_localizacao_caracter (
88
- proximo_caracter , tabela_cifra
157
+ localizacao_segundo_caracter = achar_localizacao_caracter (
158
+ segundo_caracter , tabela_cifra
89
159
)
90
160
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' ]
93
166
94
167
# 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
+
99
208
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
101
217
102
218
counter += 2
103
219
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
+
104
228
105
229
def requisitar_escolha ():
106
230
print (
@@ -123,10 +247,14 @@ def requisitar_escolha():
123
247
def main ():
124
248
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'
125
249
250
+ print ('Alfabeto inicial: ' , alfabeto )
251
+
126
252
tabela_cifra = preparar_tabela_cifra (alfabeto )
127
253
128
254
mensagem_a_cifrar = 'E ESTA CIFRA E INQUEBRAVEL'
129
255
256
+ print ('Mensagem inicial: ' , mensagem_a_cifrar )
257
+
130
258
mensagem_a_cifrar = preparar_mensagem (mensagem_a_cifrar )
131
259
132
260
escolha = requisitar_escolha ()
@@ -165,6 +293,13 @@ def main():
165
293
166
294
escolha = requisitar_escolha ()
167
295
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
+
168
303
if escolha == 5 :
169
304
print (alfabeto )
170
305
0 commit comments