APS 2 - Algebra Linear e Teoria da Informação - 2021.1
- Introdução
- Funcionamento do Enigma
- Implementação
- Funções disponíveis
- Equações implementadas
- Como rodar
- Como instalar a biblioteca
- Como rodar a API
- Demonstração da biblioteca
Essa é uma biblioteca em Python que possibilita a criptografia e descriptografia de mensagens por meio do algoritmo Enigma. Ela foi criada com o intuito de atender à demanda da APS 2 da disciplina de Álgebra Linear e Teoria da Informação, ministrada pelo professor Tiago Fernandes Tavares, no curso de Ciência da Computação do Insper.
O algoritmo Enigma é uma cifra de substituição polialfabética que usa uma série de rotores para codificar letras em uma mensagem. Cada rotor é uma permutação dos caracteres do alfabeto, e a cifra é construída fazendo com que a mensagem passe pelos rotores em uma ordem específica.
A cifra Enigma é baseada em um conjunto de equações matemáticas que determinam como os caracteres da mensagem são substituídos. As equações que governam a criptografia e a decriptografia são altamente não lineares e complexas.
Esta biblioteca implementa a cifra Enigma usando matrizes de permutação para representar os rotores. A cifra é construída aplicando a matriz de permutação correspondente a cada rotor em ordem. A biblioteca também inclui funções para codificar mensagens como matrizes usando one-hot encoding, bem como funções para converter essas matrizes de volta em mensagens legíveis.
para_one_hot(msg)
: Transforma a mensagem em matriz usando one-hot encoding.para_string(M)
: Converte uma matriz one-hot encoding em uma string legível.cifrar(msg, P)
: Aplica uma cifra simples em uma mensagem recebida como entrada e retorna a mensagem cifrada.de_cifrar(msg, P)
: Recupera uma mensagem cifrada, recebida como entrada, e retorna a mensagem original.enigma(msg, P, E)
: Faz a cifra Enigma na mensagem de entrada usando o cifrador P e o cifrador auxiliar E.de_enigma(msg, P, E)
: Recupera uma mensagem cifrada como Enigma assumindo que ela foi cifrada com o usando o cifrador * P e o cifrador auxiliar E.
Para cifrar uma mensagem usando Enigma, a matriz de permutação de cada rotor é aplicada à mensagem em ordem. Isso é feito da seguinte maneira:
A criptografia com Enigma envolve uma série de operações realizadas em uma mensagem de texto, incluindo permutações e substituições de letras. A implementação deste repositório utiliza duas matrizes de permutação, P e E, para realizar a cifra Enigma.
A função enigma recebe como entrada uma mensagem de texto, a matriz P e a matriz E, e retorna a mensagem cifrada. Para cada letra da mensagem, a função realiza as seguintes operações:
-
Transforma a mensagem em uma matriz one-hot encoding.
matriz_msg = para_one_hot(msg)
-
Multiplica a coluna da respectiva letra na matriz da mensagem pela matriz da permutação P.
letra_cifrada = P @ coluna_letra
-
Concatena a matriz resultante à matriz final da mensagem cifrada.
matriz_enigma = np.concatenate((matriz_enigma, letra_cifrada), axis=1)
-
Multiplica a matriz de permutação P pela matriz E.
P = E @ P
Ao final das operações, a função retorna a mensagem cifrada em texto.
A decriptografia com Enigma segue o mesmo processo da criptografia, porém com a ordem das matrizes de permutação invertida. A função de_enigma recebe como entrada uma mensagem cifrada, a matriz P e a matriz E, e retorna a mensagem original. Para cada letra da mensagem cifrada, a função realiza as seguintes operações:
- Transforma a letra cifrada em uma matriz one-hot encoding.
- Multiplica a matriz da letra pela matriz inversa de P.
- Concatena a matriz resultante à matriz final da mensagem 4.original.
- Multiplica a matriz de permutação P pela matriz E.
Ao final das operações, a função retorna a mensagem original em texto.
As funções auxiliares para a biblioteca de criptografia enigma incluem limpa_mensagem
, que transforma uma mensagem em minúsculas, remove acentos e substitui caracteres especiais por "_", e cria_matriz
, que recebe uma chave, realiza uma rotação e cria uma matriz de codificação usando o novo alfabeto.
Para rodar o demo da biblioteca Enigma, siga as instruções abaixo:
- Certifique-se de ter o Python 3 instalado em seu computador.
- Para instalar a biblioteca, execute o seguinte comando no terminal:
pip install git+https://github.com/liviatanaka/criptografia_Enigma
- Certifique-se de que o Python 3 ou superior está instalado no seu computador.
- Clone ou faça o download do repositório no seu computador.
- Acesse a pasta raiz do projeto no terminal.
- Instale as dependências da biblioteca com o comando:
pip install -r requirements.txt
- Execute o seguinte comando para rodar o demo:
python app.py
Isso iniciará o servidor Flask e o demo estará disponível no endereço http://localhost:5000. Para demonstração rápida, consulte o arquivo teste_api.ipynb.
Para aprender a usar a biblioteca enigmalille, consulte o arquivo teste_biblioteca.ipynb. Nele, você encontrará exemplos de como cifrar e decifrar diferentes tipos de mensagens usando as funções disponíveis, incluindo:
- Mensagens comuns
- Mensagens contendo caracteres que não pertencem ao alfabeto
- Mensagens vazias