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:

  1. 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.
  2. 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:

  1. Alice -> Bob : g^x
  2. Alice <- Bob : g^y, SB(g^x, g^y)
  3. 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: