O objetivo deste projeto é mostrar ao usuário duas apicações de criptografia diferentes: cifra de Vigenère e o método RSA.
O arquivo app.py é a raiz do projeto, responsável por dar início a aplicação, utilizando a biblioteca flask para rodar aplicação em uma página html.
É o template base da aplicação. Contém a nav e footer do projeto. Seu main será sibstituído pelos decodores.
Apresenta no main da aplicação, uma mensagem de boas-vindas e um texo que explica o objetivo do projeto e como ele irá funcionar.
Irá utilizar uma serie de deslocamentos alfabéticos (assim como na Cifra de César) baseado em única chave, tratando-se, portanto, de um método de criptografia de chave simétrica.
Neste projeto, o método de Viginére ira aceitar apenas letras (maiúsculas ou minúsculas). Não será possível utilizar números ou caracteres expeciais.
A desencriptação sempre irá retornar o texto em caixa alta.
Um arquivo csv (file_vigenere.csv no programa) contem todos os caracteres possíveis.
A função table_vigenere() irá construir uma tabela e utilizar esses caracteres como cabeçalhos de linhas e colunas. Os valores da tabela serão os mesmos caracteres, mas o vetor de B será o vetor de A, com a alteração de que a primeira posição de A passa a ser a última posição de B. Veja o exemplo abaixo:
A função vigenere_encrypt() irá repetir a palavra chave até que ela possua o mesmo tamanho do texto que será criptografado. Cada letra da palavra chave servirá como índice de linha para cada letra do texto que a ser criptografado, as letras do texo a ser criptografa serão os índeces de coluna.
Utiliza um conjunto de chaves assimétricas, sendo duas chaves públicas e três chaves privadas. O código das funções utilizadas neste método está no arquivo _rsa.py na pasta raiz do projeto. Trata-se de criptografia de chaves assimétricas com inúmeras possibilidades de combinações diferentes, logo, seu processamento é mais lento que o método anterior.
A encriptação começa a partir da escola de duas chaves privadas, arbitrarias, mas precisam ser necessariamente dois números primos. Quanto maior o algarismo, mas difícil se torna a decriptação.
No código chamaremos essas duas chaves de:
key_one = 883 # 1ª Chave privada
key_two = 997 # 2ª Chave privada
A primeira chave pública é dada pelo produto das chaves privadas. No código:
product_of_keys = key_one * key_two # Mais conhecido como 1ª Chave pública
A segunda chave pública também é arbitrária, mas precisa obedecer às seguintes regras:
- 1 < segunda chave pública < φ(n)
- m.d.c( φ(n), segunda chave pública) = 1
- segunda chave pública = número primo
A função public_key() será responsável por retornar uma lista com as duas chaves públicas de acordo com a regras acima.
A terceira chave privada será o inverso multiplicativo modular da segunda chave pública. No código, a function responsável por retornar esse valor será private_key()
A formula da encriptação é 'x' = ('Número da letra ** '2ª Chave pública') % '1ª Chave pública’ e será dada pela function criptografar()
A fórmula da decriptação é 'x' = ('Número criptografado ** '3ª chave privada') % '1ª Chave pública’ e será dada pela function descriptografar()
O código está aberto e disponível para colaboração e sugestões de melhorias. Sinta-se livre para enviar pull requests com modificações e correções.
Qualquer dúvida ou sugestão, não hesite em entrar em contato | @oleoespindola