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 -ence-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 KeyStoredisponibilizada 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 AlgorithmParameterGeneratorpara gerar os parâmetrosPeGdo algoritmo;
-  Classe KeyPairGeneratorpara gerar os pares de chaves ( (x, g^x) e (y,_g^y_) para cada um dos intervenientes);
-  Classe KeyAgreementque 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: