Implementação de Protocolos Criptográficos. Manuel DI Universidade do Minho Setembro de

Documentos relacionados
Criptografia Aplicada LESI / LMCC Exame de Recurso Fevereiro de 2008

Criptografia. Criptografia de Chave Pública. Manuel Barbosa (mbb at dcc.fc.up.pt) 2018/2019

[Magee 1999] Concurrency State Models and Java Programs, Jeff Magee, Jeff Kramer, John Wiley 1999.

Autenticação por par de. chaves assimétricas. Bruno Follmann

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Segurança Informática em Redes e Sistemas

Criptografia. Aula 4: Autenticação de mensagens e canais seguros. Manuel Barbosa (mbb at dcc.fc.up.pt) 2018/2019

Segurança em Sistemas Operacionais

Extensões à JCA. Manuel DI Universidade do Minho Setembro de

Sockets e Threads em Java

Engloba os criptossistemas clássicos. Outros nomes: (Criptografia...)

4 ÍNDICE Exemplo de redundância e distância de unicidade... 41

Sincronização e Comunicação entre Processos

AULA 08 CRIPTOGRAFIA E SEGURANÇA DE DADOS CRIPTOGRAFIA ASSIMÉTRICA CHAVES E ALGORITMOS 03/03/2016 PROF. FABIANO TAGUCHI

Criptografia. Aula 4: Cifras simétricas a partir de cifras por blocos. Manuel Barbosa (mbb at dcc.fc.up.pt) 2018/2019

Segurança e Auditoria de Sistemas. Autenticação

INE5680 SEGURANÇA DA INFORMAÇÃO E DE REDES Prova 1 04/10/2013 Turmas A e B Prova A NOME : MATRÍCULA :

Tópicos de Ambiente Web Segurança

InputStream e OutputStream para ler/ escrever bytes e das classes abstractas Reader e Writer para ler /escrever caracteres (texto).

Sockets: Sumário. Resumo das Propriedades de UDP e de TCP

IPSEC. IP Security Protocol. *Utilize este material para fins educativos e não comerciais*

Apresentação: André Luiz Marasca

Mecanismos Criptográficos Esquemas

SEGURANÇA CRIPTOGRAFIA E SEGURANÇA DE DADOS. As funções de cifra são consideradas totalmente seguras se:

Nome: Nº de aluno: Exame 1ª chamada (perguntas impar) / Repescagem 1º teste / Repescagem 2º teste SRC /07/04 1º teste

[Magee 1999] Concurrency State Models and Java Programs, Jeff Magee, Jeff Kramer, John Wiley 1999.

Capítulo 8. Segurança de redes

Java Cryptography Architecture (JCA)

Exemplo da (in)segurança de um site sem HTTPS

Criptografia Simétrica e Assimétrica, Hash, e Assinatura Digital

CERTIFICAÇÃO DIGITAL COM JAVA. Cléber da Silveira.

Criptografia. Módulo I Terminologia. M. B. Barbosa 2005/2006. Departamento de Informática Universidade do Minho

Departamento de Informática

PLANO DE DISCIPLINA DISCIPLINA: Segurança da Informação

TOCI08 Segurança em Redes de Computadores Módulo 08: Criptografia Assimétrica RSA e ECC

OTES07 Segurança da Informação Módulo 05c: Criptografia Assimétrica RSA e ECC

Criptografia. Criptografia de Chave Pública. Manuel Barbosa (mbb at dcc.fc.up.pt) 2018/2019

Abordagens para a. Distribuição de Chaves

Informática. Segurança da Informação

Endereçamento Aberto

Comunicação entre Processos

Introdução aos Protocolos de Estabelecimento de Chave

Modelos para Autenticação e. Mecanismos para Autenticação

Segurança de Redes de Computadores. Ricardo José Cabeça de Souza

Criptografia Aplicada LESI / LMCC

M3D4 - Certificados Digitais Aula 2 Certificado Digital e suas aplicações

Segurança Informática em Redes e Sistemas

Desvendando os mistérios do criptossistema RSA. Grasiele Cristiane Jorge. Pós-Doc - IMECC - UNICAMP

Comunicação entre processos

A R R A Y S E E X C E P T I O N S P R O F. M E. H É L I O E S P E R I D I Ã O

Segurança conceitos básicos. Sistemas Distribuídos

AULA 5: Criptografia e Esteganografia

[Magee 1999] Concurrency State Models and Java Programs, Jeff Magee, Jeff Kramer, John Wiley 1999.

Criptografia. Aula 4: Autenticação de mensagens e canais seguros. Manuel Barbosa (mbb at dcc.fc.up.pt) 2018/2019

Estrutura de Dados. Introduc a o e Alocac a o de Memo ria. Vilson Heck Junior. Instituto Federal de Santa Catarina

Segurança e Auditoria de Sistemas. Confiança Mútua Assinatura Digital Certificado Digital

Exercícios de Revisão Redes de Computadores Edgard Jamhour. TLS/SSL, VPN PPTP e IPsec

Classes e Objetos POO

Gravação de objetos em arquivos

Segurança da Informação Aula 5 Criptografia. Objetivos e Tipos. Cifras de Bloco e Fluxo

Criptografia. Módulo I Terminologia. M. B. Barbosa 2006/2007. Departamento de Informática Universidade do Minho

A camada de enlace de dados executa diversas funções específicas. Dentre elas

Departamento de Informática Faculdade de Ciências e Tecnologia UNIVERSIDADE NOVA DE LISBOA

Aula teórica 4. Tema 3. Linguagem de Programação Java. Manipulação de informação simples (cont.)

Redes de Computadores

Complexidade de Algoritmos

Entendendo a criptografia e como ela pode ser usada na prática. Italo Valcy Universidade Federal da Bahia CERT.

Reader e Writer para streams de caracteres (texto).

Segurança da Informação Aula 7 Assinaturas Digitais e HASH.

Geração de um certificado SSL (Secure Socket Layer) em RV120W e em RV220W

Aula 12: Memória: Barramentos e Registradores

Segurança de Sistemas de Informação

Por Fernando Koyanagi

Programação com Sockets

Linguagem de Programação III

e-financeira Manual para Compactação e Criptografia de dados

CIÊNCIA DA COMPUTAÇÃO - LINGUAGEM DE PROGRAMAÇÃO II REVISÃO POO

Infraestrutura de Chave Pública - InfoSec. 14 de Junho de 2016

Segurança da Informação Aula 6 Principais Algoritmos Simétricos. Criptografia Assimétrica.

Segurança em Redes - 3

Carlos Rodrigo Tofoli Fernandes. CriptoCore: Um acelerador de exponenciação modular para aplicações criptográficas

Configurando perfis IPSec (auto modo fechando) no RV160 e no RV260

Segurança Sistemas Distribuídos. junho de 2017

Criptografia. Aula 3: Segurança Computacional. Manuel Barbosa (mbb at dcc.fc.up.pt) 2018/2019

Aula 3- Codificação de Canal. October 18, 2017

Sistemas e Plataformas Seguras

Redes de Computadores Aula 23

Transcrição:

Implementação de Protocolos Criptográficos 1

Introdução A operação mais básica num protocolo de comunicação criptográfico é aquele em que apenas se pretende transmitir um item de informação x de uma entidade A para uma entidade B. Pressupõe-se que A e B são processos independentes que podem, ou não, ser executados em máquinas distintas. Assim, o primeiro problema com que nos encontramos consiste em saber como estabelecer um canal de comunicação entre duas entidades. Visto estarmos usar como linguagem de implementação o JAVA, vamos considerar que x pode ser um objecto qualquer. Uma das formas mais frequentes de abordar este problema consiste na utilização de sockets. Os sockets permitem que a comunicação entre processos seja independente da sua localização física e das características particulares do meio de comunicação utilizado. 2

Introdução (cont) Para a implementação desta operação é também necessário garantir que ambos os processos estão sincronizados, i.e. B deve estar disponível para receber x quando A o transmitir. Sincronização a alto-nível - Parte deste problema resolve-se inserindo a operação num protocolo ao qual, por definição, todas as entidades devem obedecer. Assim, B sabe que chegado a um destes passos A lhe transmitirá x, e vice-versa. Sincronização a baixo-nível - A outra parte diz respeito à necessidade de alocar as estruturas de dados para receber a informação e desencadear fisicamente o processo. Para resolver este problema as linguagens disponibilizam, normalmente, primitivas de alto nível que permitem ao processo A desencadear a operação e ao processo B ficar à espera até que A lhe envie alguma coisa, sendo depois estabelecido um canal de comunicação entre os dois processos. No JAVA, estes requisitos são também satisfeitos pelos sockets. 3

Utilização de sockets Na linguagem JAVA a entidade com um papel passivo (neste caso B) deve criar um ServerSocket associado a uma porta lógica da sua máquina e ficar à espera até que um canal de comunicação seja estabelecido. try { ServerSocket ss = new ServerSocket(2000); Socket s = ss.accept(); // comunicar s.close(); } catch (Exception e) { System.out.println("Excepcao: "+e.getmessage()); } 4

Utilização de sockets (cont) No caso do processo A a implementação é mais simples: try { Socket s = new Socket( nome.da.maquina.de.b'', 2000); //comunicar s.close(); } catch (Exception e) { System.out.println("Excepcao: "+e.getmessage()); } Nos slides seguintes assume-se que já se encontra estabelecido o canal de comunicação, através de um objecto do tipo Socket armazenado numa variável s. 5

Utilização de socket (cont) Depois de estabelecido o canal de comunicação, o envio de x é muito simples: cada entidade obtém, a partir do socket, uma stream para transferencia de objectos (de input no caso de B e de output no caso de A). O código necessário para enviar/receber x seria, no caso do processo A: OutputStream os = s.getoutputstream(); ObjectOutputStream oos = new ObjectOutputStream(os); oos.writeobject(x); No caso do processo B teriamos: InputStream is = s.getinputstream(); ObjectInputStream ois = new ObjectInputStream(is); TipoDeX nomeb = (TipoDeX) ois.readobject(); 6

Operações básicas Todos os protocolos criptográficos são construídos a partir de um conjunto de operações básicas, para as quais se pode utilizar a seguinte notação: { x }k - transmissão de um item x cifrado, sendo necessária a chave k para o decifrar. (x) k - assinatura de x com a chave privada k. < x ; y > - transmissão do par composto por x e y. x - transmissão do código de hash de x. De seguida iremos descrever como implementar cada uma destas operações básicas. 7

Operações básicas (cont) Assinaturas e códigos de hash O método apresentado acima para a transmissão de um objecto qualquer x pode ser utilizado sem alteração para enviar assinaturas e códigos de hash, pois estes são simplesmente arrays de bytes. Tuplos A transmissão de um par de informação < x ; y > pode ser decomposta na transmissão de x seguida da transmissão de y, que também podem ser transmitidos com o método já apresentado. 8

Operações básicas (cont) Objectos cifrados Para a transmissão de { x } k também se poderia utilizar o método apresentado, se optássemos por transmitir o array de bytes que resulta da cifragem. No entanto, isso obriga a transformar x num array de bytes antes de poder ser submetido aos mecanismos de cifra apresentados no capítulo anterior. Uma forma mais linear de o fazer consiste em utilizar os SealedObjects disponibilizados pela JCA. Como já foi referido, um SealedObject não é mais do que um cofre onde é guardado um objecto qualquer fechado com uma determinada chave. 9

Operações básicas (cont) Objectos cifrados (cont) Basicamente, estes objectos recebem como parâmetro, aquando da sua instanciação, um outro objecto qualquer e um mecanismo de cifra inicializado no modo de cifrar, e encapsulam o resultado de cifrar o objecto numa variável de instância. Considerando que k é a chave usada para cifrar x, temos o seguinte código para enviar { x } k : OutputStream os = s.getoutputstream(); ObjectOutputStream oos = new ObjectOutputStream(os); Cipher c = Cipher.getInstance("Nome do mecanismo de cifra"); c.init(cipher.encrypt_mode, k'); SealedObject so = new SealedObject(x,c); oos.writeobject(so); 10

Operações básicas (cont) Objectos cifrados (cont) Para recuperar o objecto inicial é necessário passar-lhe como parâmetro o mesmo mecanismo de cifra inicializado no modo de decifrar com a chave respectiva. Quem recebe { x } k deve efectuar as seguintes operações: InputStream is = s.getinputstream(); ObjectInputStream ois = new ObjectInputStream(is); Cipher c = Cipher.getInstance("Nome do mecanismo de cifra"); c.init(cipher.decrypt_mode, k); SealedObject so = (SealedObject) ois.readobject(); TipoDeX x = (TipoDeX) so.getobject(c); 11

Operações básicas (cont) Tuplos cifrados No caso da transmissão de tuplos cifrados é possível simplificar o código, transmitindo em vez de { < x; y > } k, a informação { x } k seguida de { y } k. Se o tamanho do bloco for inferior aos tamanhos de x e y e se utilizarmos o modo de cifra ECB então esta transformação não deverá comprometer a segurança do protocolo. Com esta optimização evita-se a declaração de uma nova classe de objectos para agregar os pares. Caso a operação a realizar sobre o tuplo seja o cálculo de uma cifra com o modo CBC, uma assinatura ou um hash, esta técnica não poderá ser aplicada pois o resultado dessas operações dependem de toda a mensagem. 12

Exemplos Como exemplos da utilização das ferramentas discutidas nas aulas anteriores na a implementação de protocolos criptográficos, vamos analisar três casos: O protocolo Diffie Hellman de acordo de chaves. O protocolo Station to Station de acordo de chaves. O procolo Schnorr de identificação. 13

Diffie-Hellman O protocolo de acordo de chaves Diffie-Hellman assenta no estabelecimento de dois parâmetros da comunidade: um número primo p e um parâmetro? que seja um elemento primitivo de? p. Cada uma das partes U e V gera um número, a U e a V respectivamente, e trocam entre si os valores a módulo p de U a e?.? V A chave K é calculada independentemente por a cada uma das partes como: U a? V mod p. 14

Station-to-Station O protocolo Diffie-Hellman está sujeito a ataques do tipo man-in-themiddle. O protocolo Station-to-Station é uma versão melhorada do protocolo anterior, por forma a incluir uma identificação mutua das duas partes baseada em certificados e assinaturas digitais. Com efeito, dois passos adicionais são incluidos no protocolo Station-to- Station: Troca de certificados de chave pública entre as duas entidades e verificação da sua validade mediante uma Certification Authority. a Troca de informação assinada digitalmente (as sequências? U av?,?? a e? V au?,?? ) e verificação das assinaturas com base nos certificados trocados anteriormente. Apenas depois de completados estes passos com sucesso as entidades confiam no segredo acordado. 15

Schnorr Este esquema de identificação baseia-se na existência de uma Trusted Authority (TA) que escolhe os parâmetros comuns da comunidade: um número primo p grande ; um número primo q, divisor de p-1, também ele grande ; um parâmetro?? Zp, de ordem q. A entidade U que se pretende identificar solicita um certificado da TA para a sua chave pública, calculada? como sendo v?? a mod p, em que a é um número aleatório escolhido por U. 16

Schnorr (cont) O processo de identificação decorre da seguinte forma: U gera um número aleatório 0? k? q-1, que utiliza para calcular? um valor??? k mod. p U envia a V (a entidade que procede à identificação) o seu certificado e o valor anterior. V verifica a validade do certificado e envia a U um valor r gerado aleatóriamente. U calcula y = k + a r mod q, e devolve y à entidade V. Para verificar a identidade de U, V verifica que: y?? y v r mod p 17

KeyAgreement Esta classe da JCE fornece a funcionalidade de um protocolo de acordo de chaves (e.g. Diffie-Hellman) em que se estabelece um segredo partilhado entre duas partes. As chaves envolvidas podem ter a sua origem em qualquer das classes de geração ou transformação de chaves da JCA. Ambas as partes envolvidas têm de obter uma instância desta engine class utilizando o método getinstance. Para a inicialização do objecto utiliza-se o método init, ao qual é necessáro fornecer, no mínimo, a chave que vai ser utilizada no estabelecimento do acordo. Adicionalmente é possível parametrizar o algoritmo de forma específica, bem como fornecer um gerador de números pseudo-aleatórios. 18

KeyAgreement (cont) Os protocolos deste tipo consistem num conjunto de passos/fases que têm de ser completados por ambas as partes. A utilização desta classe consiste em chamar sucessivas vezes o método dophase, que representa este processo. Esta método aceita como parâmetro a chave a ser processada no passo/fase correspondente. Esta chave poderá ser a chave pública de uma das partes, ou uma chave intermédia obtida numa fase anterior como resultado de uma invocação de dophase. Note-se que as partes têm de trocar entre si as suas chaves públicas e, possivelmente, outras chaves intermédias, para se poder prosseguir com o protocolo. 19

KeyAgreement (cont) O método dophase aceita também um parâmetro que indica se o protocolo já está completo, ou se são necessários passos adicionais na sua execução. Quando todos os passos necessários ao agreement são completados por ambas as partes, o método generatesecret permite obter a chave secreta estabelecida: public byte[] generatesecret(); public int generatesecret(byte[] sharedsecret, int offset); public SecretKey generatesecret(string algorithm); 20