Conceitos de Sistemas Criptográficos (TP) - Sumários
MI-CSSI (2008/2009)
Aula 1 - 30/09/2008, 16:00 - 18:00
Ambiente de Desenvolvimento
O objectivo principal desta aula é o de escolher/instalar o ambiente de desenvolvimento
Java que será utilizado durante o curso.
Como actividade de programação (para experimentar o ambiente escolhido), deve desenvolver uma pequena aplicação que leia um ficheiro de texto (nome do ficheiro passado como argumento), e escreva para
stdout
o seu conteúdo com todas as letras maiúsculas.
Aula 2 - 07/10/2008, 16:00 - 18:00
Cifra de ficheiro utilizando JCA/JCE
Pretende-se cifrar o conteudo de um ficheiro. Para tal far-se-á uso da funcionalidade oferecida pela JCA/JCE, em particular a implementação de cifras simétricas.
O objectivo é então o de definir um pequeno programa Java que permita cifrar/decifrar um ficheiro utilizando uma cifra simétrica (e.g. AES no modo CBC). A sua forma de utilização pode ser análoga a:
prog -genkey <keyfile>
prog -enc <keyfile> <infile> <outfile>
prog -dec <keyfile> <infile> <outfile>
Sugestões:
- Para simplificar, pode começar por utilizar uma cifra mais simples (e.g. RC4) e uma chave secreta fixa definida no código na forma de um array de bytes (i.e. implementar somente as opções
-enc
e -dec
). Nesse caso, deverá utilizar a classe SecretKeySpec para a converter para o formato adequado.
- Um segundo passo deverá consistir na implementação da opção
-genkey
. Aí surge o problema de guardar a chave no sistema de ficheiros: vamos começar por adoptar a solução mais simples (e insegura) - guardar a chave directamente num ficheiro.
- Por último, iremos guardar a chave num contentor apropriado (protegido por uma password). Para tal devemos utilizar uma
KeyStore
disponibilizada pela JCA que permita o armazenamento de chaves secretas (tipo "JCEKS" ou "PKCS12").
Algumas classes relevantes:
Aula 3 - 14/10/2008, 16:00 - 18:00
Aplicação de Cifra
Pretende-se adaptar a aplicação desenvolvida para responder aos seguintes requisitos:
- O objectivo é fazer uso da aplicação para cifrar um conjunto de ficheiros (potencialmente grandes);
- A chave utilizada nessas operações de cifra deve estar devidamente protegida;
- Se algum dos ficheiros cifrados for manipulado (alterado), o programa deverá detectar essa ocorrência ao decifrar.
Aula 4 - 21/10/2008, 16:00 - 18:00
Acordo de Chaves
As classes
Cliente,
Servidor e
TServidor implementam uma aplicação que permite a um número arbitrário de
clientes comunicar com
um servidor que escuta num dado
port (e.g. 4567). O servidor atribui um número de ordem a cada cliente, e simplesmente faz o
dump do texto enviado por cada cliente (prefixando cada linha com o respectivo número de ordem).
Quando um cliente fecha a ligação, o servidor assinala o facto (e.g. imprimindo
[n]
, onde
n é o número do cliente).
Exemplo da execução do servidor (que comunica com 3 clientes):
$ java Servidor
1 : daskj djdhs slfghfjs askj
1 : asdkdh fdhss
1 : sjd
2 : iidhs
2 : asdjhf sdga
2 : sadjjd d dhhsj
3 : djsh
1 : sh dh d d
3 : jdhd kasjdh as
2 : dsaj dasjh
3 : asdj dhdhsjsh
[3]
2 : sjdh
1 : dhgd ss
[1]
2 : djdj
[2]
Pretende-se:
- Modificar as respectivas classes por forma a garantir a confidencialidade nas comunicações estabelecidas. Para o efeito, deverá considerar a cifra/modo que considerar mais apropriado.
- Estabelecer o segredo através da execução do protocolo de acordo de chaves Diffie-Hellman. Para o efeito deverá utilizar:
- Classe
AlgorithmParameterGenerator
para gerar os parâmetros P
e G
do algoritmo;
- Classe
KeyPairGenerator
para gerar os pares de chaves ( (x, g^x) e (y,_g^y_) para cada um dos intervenientes);
- Classe
KeyAgreement
que implementa o protocolo propriamente dito.
(obs.: No
JCA Reference Guide está disponível um exemplo com a codificação do protocolo
Diffie-Hellman.)
Algumas classes relevantes:
Aula 5 - 28/10/2008, 16:00 - 18:00
Protocolo Sation to Station
Pretende-se complementar o programa com o acordo de chaves
Diffie-Hellman para incluir a funcionalidade análoga à do protocolo
Station to Station. Recorde que nesse protocolo é adicionado uma troca de assinaturas:
- Alice -> Bob : g^x
- Alice <- Bob : g^y, SB(g^x, g^y)
- Alice -> Bob : SA(g^x, g^y)
Um requisito adicional neste protocolo é a manipulação de pares de chaves de cifras assimétricas (e.g.
RSA). Para tal deve produzir um pequeno programa que gere os pares de chaves para cada um dos intervenientes e os guarde em ficheiros que serão lidos pela aplicação
Cliente/Servidor.
Novas Classes: