README.md 5.62 KB
Newer Older
1
# Trabalho Prático de Redes de Computadores II - CI061 - Turma 2021/ERE3.
Matheus Cavazotti's avatar
readme    
Matheus Cavazotti committed
2
## Troca de chaves com Diffie-Hellman
3
4
### Professor: 
    Elias P. Duarte Jr.
Matheus Cavazotti's avatar
readme    
Matheus Cavazotti committed
5

6
### Autores/Alunos:
Matheus Cavazotti's avatar
readme    
Matheus Cavazotti committed
7
8
    Matheus Cavazotti  - mmc16 GRR: 20163054
    Vinicius G Garcia  - vgg18 GRR: 20186315
9

Matheus Cavazotti's avatar
readme    
Matheus Cavazotti committed
10
11
12
13
14
15
## Sobre a entrega    
- **Especificações:** https://www.inf.ufpr.br/elias/redes/tpRedesII2021ere3.html
- **Data de Entrega:** 06/08/2021
- **Arquivos do Trabalho em:**
  - https://www.inf.ufpr.br/vgg18/CSS/trabalho-redes-2/
  - https://gitlab.c3sl.ufpr.br/mmc16/trabalho-redes-2/
16

Matheus Cavazotti's avatar
readme    
Matheus Cavazotti committed
17
18
## Objetivos: 
O objetivo deste trabalho é um Estabelecimento de Chave Secreta com Diffie-Hellman e Socket. 
19

Matheus Cavazotti's avatar
readme    
Matheus Cavazotti committed
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
## Visão geral

Nós desenvolvemos uma aplicação na forma de dois programas. Um desempenha a função de servidor enquanto o outro a função de cliente. Eles foram feitos utilizando a linguagem Python de maneira síncrona. Ou seja, não faz uso de threads e, por isso, o servidor é capaz de atender apenas a um cliente por vez. Para que seja possível ver o funcionamento dos programas, é necessário primeiro executar `python3 server.py` e então, em outro terminal, executar `python3 client.py` com os argumentos apropriados.

A comunicação entre cliente e servidor é feita pelo protocolo TCP/IP sobre sockets. Para fazer a troca de mensagens ocorrer de maneira mais organizada, criamos um pequeno protocolo de aplicação. Esse protocolo encapsula as mensagens em um formato JSON com dois campo: um para indicar o tipo da mensagem, e o outro que contém a mensagem em si. Através desse protocolo, podemos saber quando uma mensagem contém a chave para efetuar o Diffie-Hellman, ou quando contém apenas texto, por exemplo.


## Funcionamento

Quando o servidor é inicializado, ele faz o *bind* na porta padrão (1234), ou na porta especificada pelo usuário, e espera por uma conexão. O cliente, por sua vez, ao iniciar, gera um número **c** para ser a sua chave secreta e tenta se conectar ao *host* e porta definidos pelo usuário. Quando essa conexão é estabelecida, o servidor gera um número secreto **s**.

À partir desse momento se inicia a troca de chaves segundo o algoritmo de Diffie-Hellman. O servidor espera receber uma mensagem do tipo `"key"` do cliente e só aceitará outro tipo de mensagem depois que a troca de chaves for realizada. Quando o cliente envia a mensagem com a chave, o servidor então responde com a sua respectiva chave. Esse, de fato, é o único momento que o cliente espera receber uma mensagem do servidor. Quando cada um dos processos recebe a chave de seu respectivo interlocutor, a comunicação começa.

Nesse estágio de execução é quando o programa cliente passa a ser interativo. Em outras palavras, tudo o que ocorreu desde o início da execução até o momento foi feito de forma automatizada e transparente para o usuário. O resto do funcionamento dos programas se resume ao seguinte: o usuário digita mensagens no programa cliente, o cliente criptografa essas mensagens e a envia para o servidor, este, por sua vez, descriptografa e exibe ditas mensagens. Esse processo se repete até que o usuário digite o comando para encerrar o programa cliente. Quando isso ocorrer, o servidor voltará a esperar pela próxima conexão.

Um detalhe importante a ser destacado é o fato que as mensagens de texto vêm com um cabeçalho que permite assegurar que ela foi decodificada corretamente.

## Execução

Para executar os programas cliente/servidor, é preciso atender aos seguintes requisitos:
- Ter uma máquina rodando algum sistema operacional Unix
- Ter instalada uma versão recente de Python3 (os programas foram testados em versões >= 3.8.10)
- Ter instalados e acessíveis à `PATH` os seguintes módulos: `coloredlogs`, `pycrypto` e `pycryptodome`.

Para installar os módulos, pode-se executar o comando:

```
> pip install pycrypto pycryptodome coloredlogs
```

Para rodar o servidor, basta executar o seguinte comando:

```
> python3 server.py
```

Esse programa conta com os seguintes argumentos para a linha de comando:
- `-h, --help`: exibe a mensagem de ajuda.
- `-p PORT, --port PORT`: define qual a qual porta o servidor estará escutando.
- `-v, --verbose`: ativa as mensagens de debug.
- `--force-error`: força um erro no cálculo da chave para que haja erro ao decodificar as mensagens.

O programa cliente é muito semelhante ao servidor. Para rodá-lo, é necessário executar o seguinte comando, no qual `HOST` e `PORTA` são o host e a porta nos quais o servidor está ouvindo:

```
> python3 client.py <HOST> <PORTA>
```
Matheus Cavazotti's avatar
Matheus Cavazotti committed
67

Matheus Cavazotti's avatar
readme    
Matheus Cavazotti committed
68
O cliente também conta com os mesmos argumentos de linha de comando que o servidor.
vgg18's avatar
vgg18 committed
69

vgg18's avatar
vgg18 committed
70
71
![Image](https://gitlab.c3sl.ufpr.br/mmc16/trabalho-redes-2/-/raw/master/images/LadoALodoClientServer.png?raw=true)

Matheus Cavazotti's avatar
readme    
Matheus Cavazotti committed
72
73
74
75
76
77
78
79
80
## Testes e Tratamento de Erros
Além de testes de unidade, nós fizemos testes de sistema. Além de averiguar que os programas realmente funcionam, realizamos testes para avaliar como tanto o cliente e o servidor se comportam ao se depararem com erros ou situações pouco comuns. Os casos testados foram os seguintes:
- O cliente não manda a sua chave no começo da comunicação
- O cliente manda uma mensagem sem criptografá-la
- O clienta manda uma mensagem sem o cabeçalho
- O cliente manda uma mensagem vazia
- O cliente manda uma mensagem que não corresponde com o protocolo estabelecido
- O que ocorre quando as chaves simétricas do cliente e servidor não correspondem
- O servidor desconecta inesperadamente
vgg18's avatar
vgg18 committed
81

vgg18's avatar
vgg18 committed
82
Em todos os casos, mensagens de erro são apresentadas ao usuário e os programas abortam apenas em erros relacionados à conexão.
vgg18's avatar
vgg18 committed
83

vgg18's avatar
vgg18 committed
84
![Image](https://gitlab.c3sl.ufpr.br/mmc16/trabalho-redes-2/-/raw/master/images/LadoALodoClientServer.png?raw=true)