PETRUS ROMANUS

CRIPTOGRAFAR UTILIZANDO MATRIZES
Abaixo temos uma aplicação das operações com matrizes: criptografar e descriptografar.
Poderia ter feito de um modo mais simples, mas resolvi operar montando as matrizes propriamente ditas, como se estivesse fazendo no papel. Trata-se de um projeto mais pedagógico, mostrando para os estudantes como a multiplicação de matrizes pode ter aplicações em áreas diversas.
from numpy import matrix
letras = [" ","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"]
numeros = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"]
#segue função codificar
def codificar():
men = input(str('Mensagem: '))
sep_cod = [] #separar números dois a dois
exb_cod = [] #exibir código final
E = matrix([[3, 1], [2, 1]]) #embaralhar
if len(men) % 2 == 1: #completar com espaço para a quantidade ser par
men = men + " "
cod = men
for i in range (0, 27):
cod = cod.replace(letras[i], numeros[i])
for i in range (0, len(men)*2, 2):
sep_cod.append(int(cod[i:i+2]))
print('\nCódigo primário: ')
print('%s\n' %(cod))
A = matrix([ #matriz que recebe o código inicial
sep_cod[0:len(men)//2],
sep_cod[len(men)//2:len(men)]
])
print('Matriz A contendo o código primário: ')
print(A)
C = E * A #matriz com código embaralhado
print('\nMatriz C com código embaralhado: ')
print(C)
for i in range (0, 2):
for j in range (0, len(men)//2):
if (len(str(C[i, j])) == 1):
exb_cod.append("0" + str(C[i, j])) #completa o início com zero
else:
exb_cod.append(str(C[i, j]))
print('\nDepois do embaralhamento: ')
print(exb_cod)
print('\nPara envio: ')
for i in range (0, len(men)):
print('%s' %(exb_cod[i]), end=' ')
print('\n')
#fim de codificar
#função decodificar
def decodificar():
I = matrix([[1, -1], [-2, 3]]) #inversa, desembaralhar
cod = str(input('Informe o código: '))
sep_cod = cod.split(" ") #quebra a string em várias outras
decod = [] #lista que receberá o código primário
exibe = "" #receberá a mensagem decodificada
for i in range (0, len(sep_cod)):
sep_cod[i] = int(sep_cod[i]) #converter em inteiros
A = matrix([ #matriz que recebe o código a ser decodificado
sep_cod[0:len(sep_cod)//2],
sep_cod[len(sep_cod)//2:len(sep_cod)]
])
print('\nMatriz A contendo o código: ')
print(A)
D = I * A #decodificando
print('\nMatriz D: ')
print(D)
for i in range (0, 2):
for j in range (0, len(sep_cod)//2):
if (len(str(D[i, j])) == 1):
decod.append("0" + str(D[i, j])) #completa o início com zero
else:
decod.append(str(D[i, j]))
print('\nO código primário é: ')
print(decod)
for i in range (0, len(decod)):
exibe = exibe + decod[i]
for g in range (0, 27):
exibe = exibe.replace(numeros[g], letras[g])
print('\nMensagem decodificada: ')
print(exibe)
print('')
#fim de decodificar
#abaixo, início do programa
while True:
print('1. Codificar')
print('2. Decodificar')
print('3. Sair\n')
escolha = int(input('Escolha: '))
if escolha == 1:
codificar()
elif escolha == 2:
decodificar()
elif escolha == 3:
break
Exemplos de funcionamento:

Codificando a palavra "pedro"

Decodificando o código numérico 66 30 12 50 25 08 (que é a palavra "pedro")