Esse é um projeto da matéria de Algebra Linear e Teoria da Informação do Insper para o curso de Ciência da Computação.
O projeto consiste em reproduzir, com funções em python e manipulação de matrizes, a máquina enigma de codificação de mensagens feita pelos alemães na Segunda Guerra Mundial.
A função para_one_hot recebe uma string e retorna uma matriz de zeros e uns, onde cada letra da string é representada por uma linha da matriz, e cada coluna da matriz representa uma letra do alfabeto. A letra da string é representada por um 1 na coluna correspondente a ela no alfabeto, e 0 nas demais colunas.
Através da utilizacão de uma string alfabeto, que contém todas as letras do alfabeto, é possível percorrer cada letra da mensagem recebida e verificar se ela está presente na string alfabeto, se estiver, nós buscamos o índice correspondente em uma matriz identidade com o número de linhas e colunas igual ao tamanho da string alfabeto e adicionamos a linha correspondente em uma lista, após adicionar todas as linhas correspondete na lista, nós transformamos a lista em uma matriz com "np.array" e retornamos sua matriz transposta.
A função to_string recebe uma matriz de zeros e uns e retorna uma string, onde cada linha da matriz é representada por uma letra da string, e cada coluna da matriz representa uma letra do alfabeto. A letra da string é representada por um 1 na coluna correspondente a ela no alfabeto, e 0 nas demais colunas.
Para a função to_string, nós utilizamos a mesma string alfabeto para percorrer cada linha da matriz transposta e verificar se ela contém um 1, se contém, nós adicionamos a letra correspondente na string que será retornada.
A função cifrar recebe uma string e uma matriz de zeros e uns, e retorna uma string, onde cada letra da string é representada por uma linha da matriz, e cada coluna da matriz representa uma letra do alfabeto. A letra da string é representada por um 1 na coluna correspondente a ela no alfabeto, e 0 nas demais colunas.
A função cifrar recebe uma string e uma matriz permutação,primeiramente a string é transformada em uma matriz one hot, através da função para_one_hot, em seguida, é feita uma multiplicão de matrizes entre a matriz one hot da mensagem recebida e a matriz permutação, onde utilizamos o método "np.roll()" para embaralhar os elementos da matriz. Depois, essa matriz resultante é transformada em string com a função para_string e essa nova string é retornada.
A função decifrar recebe uma string e uma matriz de zeros e uns, e retorna uma string, onde cada letra da string é representada por uma linha da matriz, e cada coluna da matriz representa uma letra do alfabeto. A letra da string é representada por um 1 na coluna correspondente a ela no alfabeto, e 0 nas demais colunas.
A função decifrar recebe uma string e uma matriz permutação,primeiramente a string é transformada em uma matriz one hot, através da função para_one_hot, em seguida, é utilizado o método "np.linalg.solve()", que realiza a multiplicação entre a matriz da mensagem recebida e a matriz inversa da matriz permutação. Depois, essa matriz resultante é transformada em string com a função para_string e essa nova string é retornada.
A função enigma recebe uma string e uma lista de matrizes de zeros e uns, e retorna uma string, onde cada letra da string é representada por uma linha da matriz, e cada coluna da matriz representa uma letra do alfabeto. A letra da string é representada por um 1 na coluna correspondente a ela no alfabeto, e 0 nas demais colunas.
A função enigma recebe uma string, uma matriz permutação e uma matriz auxiliar. Para cada coluna da matriz da mensagem recebida é feito uma multiplicação com a matriz permutação n vezes e pela matriz auxiliar n+1 vezes, onde n é o número da coluna da matriz da mensagem recebida. Depois, a matriz resultante é transformada em string com a função para_string e essa nova string é retornada.
A função de_enigma recebe uma string e uma lista de matrizes de zeros e uns, e retorna uma string, onde cada letra da string é representada por uma linha da matriz, e cada coluna da matriz representa uma letra do alfabeto. A letra da string é representada por um 1 na coluna correspondente a ela no alfabeto, e 0 nas demais colunas.
A função de_enigma recebe uma string, uma matriz permutação e uma matriz auxiliar. Para cada coluna da matriz da mensagem recebida é feito uma multiplicação com a matriz inversa da matriz permutação n vezes e pela matriz inversa da matriz auxiliar n+1 vezes,com o intuito de chegar novamente a matriz original. Depois, a matriz resultante é transformada em string com a função para_string e essa nova string é retornada.
Para rodar o projeto e testar cada função, basta acessar e rodar o arquivo demo.py, nesse arquivo você pode visualizar cada passo da codificação e decodificação de uma mensagem.
POST /post/enigma
Parâmetro | Tipo | Descrição |
---|---|---|
mensagem |
json |
retorna a mensagem codificada |
POST /post/de-enigma
Parâmetro | Tipo | Descrição |
---|---|---|
mensagem codificada |
json |
retorna a mensagem decodificada |
Para rodar a api basta acessar o arquivo teste_api.ipynb e rodar a primeira célula para rodar as funções que acessam a api, em seguida rode as outras duas células que contém os testes das rotas /post/enigma e /post/de-enigma , que retornam as mensagens codificadas e decodificadas respectivamente.
Instale insper_enigma com pip
pip install git+https://github.com/st4pzz/package_enigma
from insper_enigma import *