Esse repositório contém um projeto complementar à Iniciação Científica do PICME sobre Estruturas Algébricas e Criptografia, e consiste em um programa para criptografar e descriptografar mensagens ou arquivos de texto e compartilhar segretamente mensagens por sistemas de criptografia de chave pública estudados na IC, mais precisamente: RSA e o Esquema Shamir.
O programa foi feito totalmente em Python e roda no terminal. Instruções para utilização podem ser encontradas abaixo. Os algoritmos para calcular a encriptação, bem como as funções necessárias para isso, foram baseados no livro usado: Algebra for Applications, A. Slinko.
Para rodar o programa, baixe o repositório (isso pode ser feito clicando na seta do botão verde <> Code localizado acima e escolhendo a opção Download ZIP) ou clone-o:
git clone https://github.com/4wardAerial/ic_criptografia.git
Após a instalação, entre na pasta src e abra no terminal. Dentro dela, rode o main.py:
python3 main.py
OBS.: O programa foi testado em Windows e Ubuntu, mas não em outras distros nem em macOS, então não posso garantir que funcione neles (mas deve funcionar, é só Python)
Para selecionar uma opções nos menus, basta digitar o número daquela opção e pressionar Enter. Caso digite uma opção inválida, o sistema vai apenas recusá-la e pedir outra entrada.
Para as entradas e arquivos de mensagem a serem criptografadas ou compartilhadas, essas podem conter apenas os caracteres: a, b, ..., y, z, A, B, ..., Y, Z, 0, 1, ..., 8, 9, , . : ! ? ( ) e espaço.
Para copiar e colar um valor, use o mouse para selecioná-lo e pressione Ctrl + C e Ctrl + V no Windows ou Ctrl + Shift + C e Ctrl + Shift + V no Linux.
Para encerrar o programa, pode fazê-lo pelas opções do menu, clicando no botão X no canto superior direito do terminal ou pressionando Ctrl + C no teclado.
-
Criptografar mensagem: Criptografa a mensagem digitada para a pessoa selecionada, usando as chaves públicas dela. A mensagem corresponde a toda sequência de números digitada, incluindo os espaços.
-
Criptografar arquivo: Criptografa todo o conteúdo do arquivo de texto
msg.txt, localizado na pasta~\arquivos\mensagens, para a pessoa selecionada e salva o resultado em outro arquivo de texto,cyph.txtno mesmo diretório. -
Descriptografar mensagem: Descriptografa a mensagem digitada para o usuário, usando a sua própria chave privada.
-
Descriptografar arquivo: Descriptografa todo o conteúdo do arquivo de texto
cyph.txt, localizado na pasta~\arquivos\mensagens, para o usuário e salva o resultado em outro arquivo de texto,msg.txtno mesmo diretório. -
Gerenciar chaves públicas: Permite que o usuário adicione, remova ou mude pessoas (e suas chaves públicas) do sistema, além de suas próprias chaves. Para adicionar uma nova pessoa, basta digitar seu nome e suas chaves. Caso ela já esteja no sistema, suas chaves públicas são atualizadas para as recém-inseridas. Para remover uma pessoa, basta digitar seu nome e inserir 0 como qualquer uma das chaves.
O sistema começa com os seguintes dados carregados:
Nome Chave pública 'n' Chave pública 'e' Lucas 262925991035088606941229933230703962484209 65537 Alyssa 33055727833500460002449499088102170314572649 65537 Anabela 4711013007790938878139374864507774937997 65537 Leticia 111777757087311284697527464893754543574057 65537 João 4274790255060999669466438070099888371 65537 OBS.: As chaves privadas das pessoas acima não estão armazenadas no sistema, mas foram guardadas abaixo caso seja necessário:
Nome Chave privada 'd' Lucas 62837935785626328843393636080334283176269 Alyssa 27712802082546489378068296278991851489475073 Anabela 1205985401097221135340396725521695843869 Leticia 19525333218419207273412107861800528952033 João 3927455801115902648102102854245339617 -
Criar chaves: Escolhe dois primos aleatórios (dentre os pré-listados num arquivo) e gera o par de chaves públicas (n, e) e a chave privada (d) para o usuário. Caso o usuário queira trocar de chaves, as novas são salvas em um arquivo no sistema, se não, nada muda. A chave privada não é salva e o usuário deve salvá-la por conta própria.
OBS.: Embora o sistema já tenha chaves públicas salvas para o usuário, é necessário que novas sejam geradas para que o novo usuário (você) possa guardar uma nova chave privada correspondente.
João usa seu sistema para criar chaves novas:
(n, e, d) = (4274790255060999669466438070099888371, 65537, 3927455801115902648102102854245339617)
Maria faz o mesmo com seu sistema e gera:
(n, e, d) = (270704023373008444681673490480975121, 65537, 200645721338590789097496227963862785)
Eles então compartilham as chaves públicas (n, e), e João adiciona Maria em seu sistema. Daí, criptografa a mensagem Oi Maria! Aqui eh o Joao :), que resulta em:
267270009290200582326079739699382790 119690501687953434965511702811910125
e manda para Maria. Se Maria, no sistema dela, escolher descriptografar a mensagem acima com a sua própria chave privada, vai obter exatamente a mensagem original! Caso queira confirmar, o sistema já começa com os dados de Maria, então resta apenas copiar a mensagem e sua chave privada.
Para mandar mensagens em arquivos, a ideia é a mesma, a diferença é que João escreveria a mensagem no arquivo msg.txt e passaria para Maria o arquivo cyph.txt.
-
Compartilhar segredo: Separa a mensagem digitada pela pessoa em n arquivos share_1, share_2, ..., share_n localizados na pasta
~\arquivos\shares, de modo que no mínimo k dessas sejam necessárias para reconstruir a mensagem original. Os valores de n e k são escolhidos pelo usuário. -
Reconstruir segredo: Usa todos os arquivos share_i que estiver dentro da pasta
~\arquivos\sharespara reconstruir uma mensagem compartilhada. O usuário tem a opção de escolher quais fragmentos (shares) serão usados e se a reconstrução falhar, será avisado que o hash não correspondeu.
Lucas, Alyssa, Anabela, Leticia e João querem guardar uma mensagem para lerem juntos daqui a 8 anos. Para isso, eles falam para Maria, que não vai participar, anotar o que cada um quer escrever separadamente, de modo que nenhum saiba o que o outro disse. A mensagem final foi Oi gente do futuro! A Alyssa, a Anabela e o Joao acham que o Brasil ja vai ser hexa. Mas o Lucas e a Leticia acham que nao...
Eles não querem que ninguém leia mensagem sozinho antes da hora, então Maria decide usar o sistema para criar 5 shares, de modo que 3 pessoas sejam necessárias para decifrá-la. Assim, um arquivo de texto é entregue para cada amigo; o do Lucas, por exemplo, é:
1
3142233813231192597712907280304037926107008309380421225426075760910611500715381256279013438959961663730700953232030202028655946310792332404737335802683828994318796914860767123825721727372772704554642144022033983046155562515287417545293073784741913939
5018791614232914791324791530293027247579367936213428281072791079362310111421107914792479452410247910121710227926301479247937271028182179191079311018792814277917143310737948102879247947301210287914791079471429181218107910121710227926301479231024738137
E Lucas quer tentar decifrar a mensagem sozinho, então ele usa o sistema para tentar recriar a mensagem com seu único arquivo share_1.txt, mas o resultado é:
vGnCdnb#X(c#,#uEB#Z####C#lmSq#VY##bO#fCcUr#dH#X#g1.###ww#####T#1a nwELBxW#6Cs#Hi 7e##5cCp,hrBr,8JS2lI#kx#uKfT0PQ#F!Jtu.)LF#DD
Desse modo, ele decide esperar o grupo se reunir e, depois de 8 anos, com a share_2 da Alyssa e a share_4 da Leticia no sistema, eles conseguem finalmente revelar a mensagem! Caso queira confirmar, o sistema já começa com os arquivos do exemplo, então tente reconstruir a mensagem usando apenas o fragmento 1 e depois com o 1, 2 e 4.
Esses arquivos encontram-se em ~\arquivos e são essenciais para que o programa funcione.
-
\dados\dados_usuario.txt: Armazena as chaves públicas do usuário em duas linhas separadas. A primeira contém o valor de n, a segunda, de e. -
\dados\dados_publicos.txt: Armazena os nomes e as chaves públicas de outras pessoas separados por vírgula e sem espaços entre eles. -
\shares\share_i.txt: Fragmento do segredo que deve ser distribuído para o usuário i, contém o índice da pessoa, o fragmento propriamente dito e o primo que definiu o campo. -
\shares\verificacao.txt: Armazena o número mínimo de fragmentos necessários para reconstrução do segredo e um hash de comparação, que serve para indicar se a reconstrução foi totalmente correta ou não.
Não é recomendado que se altere o conteúdo desses arquivos manualmente, visto que sua formatação incorreta vai interromper o funcionamento do sistema. Todas as alterações importantes podem ser feitas dentro do próprio programa. Exceto os arquivos share_i.txt, que idealmente devem ser deletados da máquina do distribuidor após passado aos usuários.