# Apontamentos & Miscellaneous ###### tags: `lectures` :::info :warning: Atenção, estes apontamentos avulsos tirados aquando das aulas não substituem, de maneira alguma, os apontamentos teóricos e guias laboratórias práticos disponibilizados no _Moodle_. ::: --- ## Apontamentos Teóricos ### CriptoLOGIA LOGIA é a ciência; pode ter várias partes: Criptografia - é a parte que se preocupa com manter mensagens secretas. Criptoanálise - é a parte que se preocupa com quebrar os mecanismos da Criptografia. **DISCLAIMER:** Hoje em dia, a Criptografia já suplanta em muito as cifras. Como se constroí uma cifra? 1. especifica-se o modelo de ataque; (fazer de conta que as coisas vão correr mal para sabermos o que é preciso) ``` +---------+ TCP/IP +----------+ |_browser_| <-------------------------------> | servidor | +---------+ +----------+ ``` * Podemos ter um atacante que instala software no computador da vitima; * Podemos ter um atacante que escuta e altera comunicações; * Podemos ter um atacante que tem acesso ao servidor; 2. Propõe-se uma construção que evite/resolva os ataques; * E.g., todas as comunicações vão ser cifras com AES-128-CBC, e mantidas corretas com HMAC-SHA256; 3. Defende-se/prova-se que o comprometimento da construção proposta corresponde a resolver um problema tido como intratável até à data. E.g., o caso do RSA (Rivest Shamir Adleman): $N = p \times q$ ### Cifras de Chave Simétrica * A chave para cifrar é a mesma que é usada para decifrar. ``` +----------+ chave de cifra -----> | cifra | texto-limpo --------> | | -----> criptograma +----------+ ``` **Definição** Definem-se por 2 algoritmos: ENC: $k \times m \rightarrow c$ DEC: $k \times c \rightarrow m$ $DEC(k, ENC(k, m)) = m$ * O algoritmo de cifra é um algoritmo aleatório; * O algoritmo de decifra é deterministico. #### Cifras de Chave Simétrica Contínuas * Exemplos canónicos: _Rivest Cipher 4_ (RC4); muito utilizada no _Wired Equivalent Privacy_ (WEP), o primeiro protocolo usado para cifrar comunicações _wireless_. Este algoritmo está desencorajado, mas é um bom exemplo canónico. * Só são tipicamente usadas dessa forma: contínua. * São boas para cifrar comunicações em curso. #### Cifras de Chave Simétrica por Blocos * Exemplos canónicos: _Data Encryption Standard_ (DES), o antecessor do _Advanced Encryption Standard_ (AES). O núcleo destas cifras funciona por blocos. * Estas cifras podem ser usadas de várias formas: modos de cifra. Alguns modos de cifra transformam cifras de chave Simétrica por blocos em cifras de chave Simétrica contínuas. * Os modos mais conhecidos são: * ECB - _Electronic Code Book_ (desencorajado); Só se deve utilizar para cifrar 1 bloco de informação, no máximo. No caso do AES, o bloco é de 128 bits. ``` |-------|-------|-------|---4444| v v v ... E(k,b1) E(k,b2) E(k,b3) v v v ... |ccccccc|ccccccc|ccccccc|ccccccc| v v v ... D(k,c1) D(k,c2) D(k,c3) v v v ... |-------|-------|-------|---| ``` * CBC - _Cipher Block Chaining_ (bom para cifrar ficheiros em disco); ``` |-------| -------| -------|---4444| v -XOR v v ... E(k,b1)| E(k,b2) E(k,b3) v . v v ... |ccccccc| ccccccc| ccccccc|ccccccc| ``` * CTR - _CounTeR Mode_ (bom para cifrar comunicações em curso). ``` b1 b2 b3 ... |-------|-------|-------|---4444| xOR xOR xOR ... E(k,001)E(k,010)E(k,011) v v v ... |ccccccc|ccccccc|ccccccc|ccccccc| E(k,IV 001) = 00101 E(k,010) = 10010 E(k,011) = 11011 E(k,100) = 01010 E(k,101) = 00110 ``` * Isto é para cifrar ``` texto-limpo 100010110101001010101100011010101 xOR 0010110010110110101000110 criptograma 1010011111100100000011110 ``` * Para decifrar ``` E(k,001) = 00101 E(k,010) = 10010 E(k,011) = 11011 E(k,100) = 01010 E(k,101) = 00110 criptograma 1010011111100100000011110 xOR 0010110010110110101000110 texto-limpo 1000101101010010101011000 1000101101010010101011000 ``` A _Advanced Encryption Standard_ (AES) escolhe uma cifra (Rijdael) que opera sobre blocos de 128 bits. Quando usamos o _CounTeR Mode_, ciframos um contador com 128 bits. Normalmente, metade desse contador começa num numero aleatório. ``` --------------- ... -------------------------- |<-- 128 bits -->| |<-- 64 bits -->|<-- 0000000000000001 -->| |<-- vetor inicia.-->|<-- contador -->| ``` #### Vantagens do _Counter Mode_ * Só usa um algoritmo tanto para cifrar como para decifrar; * Não precisa de _padding_; * Suporta pré-processamento da _stream_ de cifra; * Pode ser usada para cifrar/decifrar enquanto os dados são gerados ou carregam; * Suporta processamento paralelo. #### Desvantagens do _Counter Mode_ * As cifras de chave simétrica continuas são maneáveis, o que significa que, se alguém alterar um bit do criptograma, mesmo sem o decifrar, está a alterar o mesmo bit no texto-limpo. ### Cifras de Chave Pública (a.k.a. Cifras Assimétricas) Nas cifras de chave pública: * Existem 2 chaves (Pública e outra Privada); * A chave pública é usada para cifrar; * A chave privada é usada para decifrar. **Definição** Definem-se por 3 algoritmos: GER: $p \rightarrow pk, sk$ ENC: $pk \times m \rightarrow c$ DEC: $sk \times c \rightarrow m$ Propriedade principal: $DEC(sk, ENC(pk, m)) = m$ ### Funções de _Hash_ As funções de _Hash_ são funções que transformam um _input_ de qualquer tamanho num _output_ de tamanho fixo. Estas funções são tipicamente muito eficientes. ``` +---------+ mensagem ---> | função | ----> output de tamanho fixo | de hash | [e aparentemente aleatório] +---------+ ``` * São eficientes de calcular; * Têm um _output_ de tamanho fixo; (se adicionarmos o qualificador "Criptográficas") * Resistência a colisões; * Resistência à descoberta de um texto original; SHA256(f1) f1 * Resistência à descoberta de um segundo texto original. Ficheiro f1 SHA256(f1) f2 SHA256(f1) #### Exemplos Canónicos de Funções de _Hash_ * CRC32 - _Cyclic Redundancy Check_ é uma função de _Hash_. #### Exemplos Canónicos de Funções de _Hash_ Criptográficas * MD5 - _Message Digest 5_, que tem 128bits de _output_ (desencorajado); * SHA1 - _Sardinha Hash Algorithm_ 1, tem _output_ de tamanho 160bits (desencorajado); * SHA256 - _Sardinha Hash Algorithm_ 256, que tem _output_ de tamanho 256bits; * SHA512 - _Sardinha Hash Algorithm_ 256, que tem _output_ de tamanho 512bits; * SHA3-x - _Sardinha Hash Algorithm_ 3, que tem _output_ de tamanho xbits. #### Utilidades das Funções de _Hash_ * São usadas para derivar chaves de cifra; ``` Covilhã Lisboa | K | | k1 = SHA256(K || 'a') | k1 = SHA256(K || 'a') | k2 = SHA256(K || 'b') | k2 = SHA256(K || 'b') | k3 = SHA256(K || 'c') | k3 = SHA256(K || 'c') | k4 = SHA256(K || 'd') | k4 = SHA256(K || 'd') ``` * São usadas para guardar representações de palavras-passe; * Funções de _Hash_ são usadas para garantir integridade. * _Blockchains_ utilizam funções de _Hash_. ```sequence Participant Alice Participant Microondas Participant Bob Note left of Alice: f1, h1=SHA256(f1) Note right of Bob: f1' h1 Note right of Bob: h2=SHA256(f1') Note right of Bob: h1==h2? tudo bem! Note right of Bob: caso contrário erro! ``` ```sequence Participant Alice Participant Claire Participant Bob Note left of Alice: f1, h1=SHA256(f1) Note over Claire: f1', h3=SHA256(f1') Note right of Bob: f1' h3 Note right of Bob: h2=SHA256(f1') Note right of Bob: h3==h2? tudo bem! Note right of Bob: caso contrário erro! ``` ### Códigos de Autenticação de Mensagens (da Origem da Informação) * São mecanismos da Criptografia Moderna e Simétrica cujo propósito é proteger mensagens contra a alteração aleatória ou maliciosa! ```sequence Participant Alice Participant Claire Participant Bob Note left of Alice: k1 Note right of Bob: k1 Note left of Alice: k1, f1, s1=HMAC(k1,f1) Note over Claire: f1' s1' Note over Claire: s1'?=HMAC(??,f1') Note right of Bob: f1', s1' Note right of Bob: s2=HMAC(k1,f1') Note right of Bob: s1==s2? tudo bem Note right of Bob: caso contrário erro! ``` * Existem várias construções para estes tipos de códigos, nomeadamente HMAC e ECBC-MAC. #### HMAC - _Hash based Message Authentication Code_ Este mecanismo combina funções de _Hash_ e chaves de integridade. $\text{HMAC-SHA256}(k,m) = \text{SHA256}(opad \oplus k || \text{SHA256}(ipad \oplus k || m ) )$ No caso de usarmos SHA256(m), o HMAC-SHA512: * Quantos bits tem o _output_? 512 * Quantas vezes é aplicada a função de _Hash_? Duas vezes. #### MAC e Cifra Imagine que, durante a análise dos requisitos de segurança, chegaram à conclusão de que precisam de 1. Confidencialidade e 2. Integridade contra ataques de homem no meio ativos. Para preencher o requisito 1., precisam de cifras! Para preencher o requisito 2., precisam de MACs (ou assinaturas digitais). **Q.:** Como devo combinar os dois mecanismos? - [x] Cifro primeiro e depois calculo o MAC do criptograma - _Encrypt then MAC_. - [ ] Calculo primeiro o MAC e depois cifro o ficheiro junto com o MAC - _MAC then Encrypt_. - [ ] Calculo primeiro o MAC, cifro só o ficheiro e junto os dois antes de enviar - _MAC and Encrypt_. #### Ataques de Homem no Meio Referem-se tipicamente dois grantes tipos de Ataques de Homem no Meio: * **Ataques de homem no meio ativos,** em que o atacante pode (i) escutar a comunicação e (ii) alterar a comunicação **antes** de chegar ao destino; * **Ataques de homem no meio passivos,** em que o atacante pode (i) escutar a comunicação (PONTO). ### Protocolos de Acordo de Chaves * Servem para trocar segredos de Criptografia (chaves de cifra, de integridade, etc.) entre duas entidades sem que necessariamente elas se encontrem fisicamente. * O protocolo de acordo de chaves mais conhecido é o Protocolo de Acordo de Chaves Diffie-Hellman. #### Problema do Logaritmo Discreto Considere que $P$ é um número primo muito grande ($> 2^{1024}$). Considerem também que há um número chamado $g$, que gera todos os números entre 1 e P-1 se fizermos o seguinte cálculo: $g^i \bmod P$, em que $i \in \{1,...,P-1\}$. O problema do logaritmo discreto específica que, nas condições enunciadas no parágrafo anterior, sabendo o valor de $P$ e $g$ e o resultado de $X=g^x \bmod P$, é impossível descobrir $x$. I.t., sabendo $P,g,X$, é impossível descobrir $x$ em tempo útil. #### Protocolo de Acordo de Chaves Diffie-Hellman ```sequence Participant Alice Participant Claire Participant Bob Note left of Alice: g, P Note right of Bob: g, P Note left of Alice: gera x entre [1, P-1] Note left of Alice: X=g^x mod P Alice->Bob: X Note right of Bob: gera y entre [1, P-1] Note right of Bob: Y=g^y mod P Bob->Alice: Y Note left of Alice: k=Y^x mod P=(g^y)^x mod P Note right of Bob: k=X^y mod P Note over Claire: g, P, X, Y Note over Claire: x=? Note over Claire: X=g^x mod P Note over Claire: y=? ``` > Claire **nunca** vai descobrir o $x$ nem o $y$ **Alerta Vermelho!** Isto só funciona em casos de ataque de homem no meio **passivo**. #### Protocolo de Acordo de Chaves Diffie-Hellman em Cenário de Ataque de Homem no Meio Ativo ```sequence Participant Alice Participant Claire Participant Bob Note left of Alice: g, P Note over Claire: g, P Note right of Bob: g, P Note left of Alice: gera x entre [1, P-1] Note left of Alice: X=g^x mod P Alice->Claire: X Note over Claire: X Note over Claire: gera z entre [1, P-1] Note over Claire: z=g^z mod P Claire->Bob: Z Note right of Bob: gera y entre [1, P-1] Note right of Bob: Y=g^y mod P Bob->Claire: Y Note over Claire: Y Note over Claire: gera w entre [1, P-1] Note over Claire: W=g^w mod P Claire->Alice: W Note over Claire: K1=X^w mod P Note over Claire: K2=Y^z mod P Note left of Alice: K1=W^x mod P Note right of Bob: K2=Z^y mod P ``` ### Cifras de Chave Pública As cifras de chave pública são definidas por um terno (três) de algoritmos: * Um algoritmo para cifrar; * Outro para decifrar; * Um para gerar chaves. #### ElGamal ```sequence Participant Alice Participant Bob Note over Alice, Bob: Algoritmo de geração de chaves ElGamal Note left of Alice: P >2^1024, g Note left of Alice: gera x entre [1, P-1] Note left of Alice: X=g^x mod P Note left of Alice: sk=x, pk=(g,P,X) Note over Alice, Bob: Algoritmo de cifra Note right of Bob: pk=(g,P,X) Note right of Bob: gera y entre [1, P-1] Note right of Bob: Y=g^y mod P, K=X^y mod P Note right of Bob: c1=AES(H(K),m) Note right of Bob: t=MAC(H(H(K)),m) Note left of Alice: Y, c1 Note over Alice, Bob: Algoritmo de decifra Note left of Alice: K=Y^x mod P Note left of Alice: m=AES^-1(H(K),c1) Note left of Alice: Verificar o MAC ``` #### _Rivest Shamir Adleman_ (RSA) As cifras de chave pública são definidas por um terno (três) de algoritmos: * Um algoritmo para gerar chaves pk, sk 1. Geramos dois números primos grandes $p$, $q$ (> $2^{1024}$); 2. $N = p \times q$, $phi = (p-1) \times (q-1)$; > Se eu souber o número N, e souber que é o produto de dois números primos extremamente grandes, não consigo encontrar os dois números em tempo útil. 3. Encontra dois números $e$ e $d$ que preencham a seguinte condição $e \times d \bmod phi = 1$ Assume-se $e = 3$, e encontra-se o número $d$ que preenche aquela condição. 4. Devolver a chave pública e a chave privada $pk = (e, N), sk = d$ :::info O algoritmo para gerar as chaves é o mais complicado dos três! ::: * Um algoritmo para cifrar (algoritmo em modo livro de escola); Bob pede à Alice a chave pública **dela** (porque ele quer enviar uma mensagem para ela)! $m$ $c = m^e \mod N$. * Outro para decifrar; Para decifrar, a Alice simplesmente faz o seguinte cálculo $m = c^{sk} \mod N$ Por que é que isto acontece? $m = c^{sk} \mod N = m^{e^d} \mod N = m^{e \times d} \mod N = m^1 \mod N = m$ :::warning **Infelizmente,** por omissão, a RSA é **determinística** e suscetível a ataques de texto limpo escolhido adaptativamente. Se cifrar o número 2 com a chave pública agora, e a cifra der 25. Mais tarde, se voltar a cifrar o número 2 com a mesma chave pública, volta a dar 25. Mais, se o que nós estamos a cifrar pertencer a um **espaço muito pequeno**, qualquer atacante pode obter o texto-limpo. ::: ```sequence Participant Alice Participant Claire Participant Bob Note left of Alice: sk, pk=(N,e) Note over Claire: pk=(N,e) Note right of Bob: pk=(N,e), c=2^e mod N Note over Claire: c Note over Claire: c = ??^e mod N Note over Claire: c ?= 1^e mod N Note over Claire: c ?= 2^e mod N (já encontrei!) Note over Claire: c ?= 3^e mod N Note over Claire: c ?= 4^e mod N Note left of Alice: c, m=c^sk mod N ``` Portanto, o modo de cifra que foi explicado em cima, só deve ser usado diretamente se o que estivermos a cifrar for: 1. Aleatório; 2. De um espaço de mensagens grande (> 128 bits)! #### Tipos de *Padding* usados no Contexto da RSA :::info Os *paddings* usados no contexto da RSA procuram resolver um problema bastante específico: o facto do RSA ser determinístico. ::: :::warning Quando se aplica *padding*, este aplica-se antes de cifrarmos; o que significa que, quando decifrarmos, temos de voltar a retirar o *padding*. ::: * *Public Key Cryptography Standard* (PKCS) 1.5 ``` EM = 0x00 || 0x02 || PS || 0x00 || M. ``` * *Optimal Assymetric Encryption Padding* (OAEP) 1. Primeiro gera-se um número aleatório $r$; 2. Passa-se o número aleatório pela função de hash $h_1=H_1(r)$; 3. O resultado é xORed com o número que queremos cifrar (preenchido com zeros); 4. O resultado do passo 3 é passado pela função hash $h_2=H_2(m\oplus h_1)$; 5. $X = m\oplus h_1$ e $Y=H_2(m\oplus h_1) \oplus r$ No final ciframos o número constituido por $X || Y$. #### Problema Geral da Criptografia de Chave Pública A "coisa boa" da criptografia de chave pública é que eu agora despreocupo-me com o secretismo de uma chave. O problema é que posso não ter sempre a certeza de que uma chave é de determinada entidade (confiança). ```sequence Participant Alice Participant Claire Participant Bob Note left of Alice: vamos usar RSA Note right of Bob: vamos usar RSA Note left of Alice: pkA, skA Note right of Bob: pkB, skB Note over Claire: pkC, skC Note right of Bob: pkC=(e,N) Note right of Bob: c=m^pkC mod N Note over Claire: c ``` Os dois mecanismos que vão salvar a situação são as assinaturas digitais e os certificados de chave pública. ### Assinaturas Digitais **Definição** Definem-se por 3 algoritmos: GER: $p \rightarrow pk, sk$ SIGN: $sk \times m \rightarrow s$ VERI: $pk \times s \times m \rightarrow$ verifica (1/true), não verifica (0/false) Propriedade que tem de preencher: $\text{VERI}(pk, \text{SIGN}(sk, m), m) = \text{true}$ :::info Existem várias formas de construir assinaturas digitais. A maior parte dessas formas, combinam funções de _hash_ criptográficas com cifras de chave pública. ::: :::warning Quando estamos a falar de cifras de chave pública, para cifrar usamos a chave pública do destino. Para decifrar usamos a chave privada do destino. Quando estamos a falar de assinaturas digitais, usamos a chave privada da origem para fazer a assinatura; e usamos a chave pública de quem faz a assinatura para verificar a assinatura. ::: :::warning Um par de chaves pública e privada usadas para cifrar costuma ser diferente do par de chaves usadas para assinaturas digitais. Mais, é possível também usar criptografia de chave pública e assinaturas digitais para autenticação de entidades. Neste caso, o par de chaves para autenticação é tipicamente diferente dos outros pares de chaves. No final podemos ter: 1. Um par de chaves para cifrar e decifrar; 2. Um par de chaves para assinatura digital; 3. Um par de chaves para autenticação. ::: **Q.:** Que chave usa o Bob para cifrar uma mensagem para a Alice? - [x] Chave pública da Alice. - [ ] Chave privada da Alice. - [ ] Chave pública do Bob. - [ ] Chave privada do Bob. **Q.:** Que chave usa a Alice para decifrar uma mensagem para a Alice? - [ ] Chave pública da Alice. - [x] Chave privada da Alice. - [ ] Chave pública do Bob. - [ ] Chave privada do Bob. **Q.:** Que chave usa o Bob para criar uma assinatura digital a enviar para a Alice? - [ ] Chave pública da Alice. - [ ] Chave privada da Alice. - [ ] Chave pública do Bob. - [x] Chave privada do Bob. **Q.:** Que chave usa a Alice para verificar uma assinatura digital feita pelo Bob? - [ ] Chave pública da Alice. - [ ] Chave privada da Alice. - [x] Chave pública do Bob. - [ ] Chave privada do Bob. **Q.:** Será que a Alice, ou qualquer outra entidade, tem sempre forma de verificar uma assinatura digital? - [x] Sim, tem sempre forma, porque a chave usada é a chave **pública** do Bob. - [ ] Pode haver casos em que não. **Q.:** Pode a Alice fazer uma assinatura em nome do Bob? - [ ] Sim, sem problema. - [x] Não, impossível. **Q.:** Quais são os algoritmos implícitos às questões anteriores? * Construção de assinaturas digitais. * Verificação de assinaturas digitais. * (geração de chaves) **Q.:** Quantos algoritmos compõem um esquema de assinatura digital? - [ ] 1 - [ ] 2 - [x] 3 - [ ] infinitos - [ ] -5 **Q.:** Quantos são os _inputs_ de um algoritmo de construção de assinatura digital? - [ ] 1 - [x] 2, ficheiro a assinar, chave privada - [ ] 3 - [ ] infinitos - [ ] -5 **Q.:** Quantos são os _outputs_ de um algoritmo de construção de assinatura digital? - [x] 1, sai a assinatura - [ ] 2 - [ ] 3 - [ ] infinitos - [ ] -5 **Q.:** Quantos são os _inputs_ de um algoritmo de verificação de assinatura digital? - [ ] 1 - [ ] 2 - [x] 3, ficheiros cuja assinatura quero verificar, a própria assinatura e a chave pública da entidade que fez a assinatura. - [ ] infinitos - [ ] -5 **Q.:** Quantos são os _outpus_ de um algoritmo de verificação de assinatura digital? - [x] 1, um booleano a informar se a assinatura está válida ou não. - [ ] 2 - [ ] 3 - [ ] infinitos - [ ] -5 #### Construção de Esquemas de Assinatura Digital Existem vários, mas um dos mais utilizados recorre a RSA e a SHA512 (utiliza uma cifra de chave pública e uma função de _hash_ criptográfica). `RSAwithSHA512`: * O algoritmo de geração de chaves é igual ao do RSA. * O algoritmo de construção da assinatura digital é simples: F é o ficheiro para o qual queremos calcular a assinatura digital; s = RSA(skB, SHA512(F)) F,s,pkB * O algoritmo de verificação é simples: F,s,pkB 1. O verificador decifra a assinatura $h_1=RSA^{-1}(pkB,s)$; 2. O verificador calcula também o valor de hash do ficheiro $h_2=SHA512(F)$; 3. Verifica se os dois valores de *hash* são iguais: Se sim, a assinatura está boa! Caso contrário, a assinatura está inválida. Se o resultado for _"se sim, a assinatura está boa!"_, isto significa que: 1. Só pode ter sido o Bob a assinar aquele documento (**autenticidade**). 2. O Bob nunca pode vir mais tarde dizer que não ele que assinou (**não repúdio**), caso contrário, está a admitir negligência. 3. Que o documento não tem erros! 4. Se alguém alterasse o documento, teria de ser feita uma assinatura nova (**unicidade**). 5. Ninguém, para além do dono da chave secreta pode construir uma assinatura digital válida (**dificuldade de falsificação**). Se o resultado for _"assinatura inválida"_, devemos imediatamente descartar o ficheiro. **Q.:** É verdade que dois ficheiros muito semelhantes podem ter assinaturas digitais iguais ou muito semelhantes? - [ ] Sim, é verdade. - [x] Não, é completamente mentira. :::info Na verdade, é curioso reparar que esta propriedade é interessante do ponto de vista prático: Cada documento tem a sua própria assinatura, mesmo que feita pela mesma chave. ::: :::warning Uma assinatura digital é mais potente que um MAC. Uma assinatura digital é tipicamente um mecanismo da criptografia de chave pública; um MAC é um mecanismo da criptografia de chave simétrica. ::: ### Certificados Digitais e _Transport Layer Security_ (TLS) HTTPS é HTTP sobre TLS **Q.:** O que é um certificado Digital? É um documento digital. **Q.:** Para que serve um certificado Digital? Um certificado certifica ou dá uma certeza. Uma certeza é a ligação de dois conceitos. Normalmente um certificado digital liga um ``` hackmd.io pkHack... assinatura digital (de alguém em quem nós confiamos) (válido) ``` Riscos ao não usar TLS (não é cifrada nem correta): * Não é cifrada; * Não tem MACs. **Q.:** Os certificados digitais são públicos? - [x] Sim, são. - [ ] Não, não são. Xiuuu!! **Q.:** Um certificado digital tem uma assinatura digital? - [x] Pois claro que tem. - [ ] Não, não tem. **Q.:** O que contém um certificado digital? - [x] Nome da entidade a quem é passado o certificado; - [x] Tem a chave pública dessa entidade; - [x] Nome da entidade que passa o certificado; - [x] Assinatura digital da entidade que passa o certificado; - [ ] Assinatura digital da entidade a quem é passado o certificado :sob:; - [x] Quando foi emitido; - [x] Quando expira, santinho! **Q.:** Pode um certificado digital conter chaves privadas? - [x] Chiça penico! - [ ] Pode. - [ ] Pode, em determinadas ocasiões! Os certificados que estão guardados na nossa máquina são as raízes da confiança. Algumas entidades passam certificados a outras, que por sua vez passam certificados a entidades mais pequenas. **Q.:** Quais os tipos de autenticação suportadas no TLS? - [x] Autenticação do servidor. - [ ] Autenticação do cliente. - [x] Autenticação mútua. - [x] Sem autenticação. ```sequence Browser->Servidor: Hello Servidor->Browser: Hello Servidor->Browser: Certificado Note left of Browser: Verifica os certificados Note left of Browser: Gera um segredo Note left of Browser: Deriva 4 chaves Browser->Servidor: RSA(pkServidor, segredo) Note right of Servidor: Decifra segredo Note right of Servidor: Deriva 4 chaves Note left of Browser: Gera um nonce Browser->Servidor: nonce Note right of Servidor: Calcula assinatura Servidor->Browser: signature Note left of Browser: Verifica a assinatura Note left of Browser: k1 para cifrar Note left of Browser: k2 para MAC Note right of Servidor: k3 para cifrar Note right of Servidor: k4 para MAC ``` ### Autenticação de Entidades https://hackmd.io/hCFOMgXcTC6fawoh1WrIPQ?view ### SSH https://hackmd.io/jzCGs_cCQKmjOvUvjieWIw?view ### Criptografia em Curvas Elípticas https://hackmd.io/9ewQ_Bn1SpKcxfbBCi-4ig?view ### Proteção em Sistemas Operativos https://hackmd.io/ohXz79uMTnOjuT_-ej8ePA?view ### Vulnerabilidades em Aplicações Web https://hackmd.io/QnkQdUvcRLCOEHNpvSxNMQ?view ### Vulnerabilidade de _Buffer Overflow_ https://hackmd.io/2aInj-w-Q_W1Lc19UDCQDQ?view ### Proteção Dinâmica e Corridas https://hackmd.io/vd_j-_FwS4S4GrTr4v3JxA?view --- ## Aulas Práticas ### Laboratório 10 https://hackmd.io/Eu0NmYDqRB-qwJ7xA0KHMg?view ### Laboratório 9 https://hackmd.io/kf92neWvQ5610H8lEdx31A?view ### Laboratório 8 https://hackmd.io/00zMex7bQUy9PhNpXD4ufg?view ### Laboratório 7 https://hackmd.io/430J3od_T9Kvz0RA3_ETkg?view ### Laboratório 6 https://hackmd.io/-xhQyMd0SFCmsoRb-d06Nw?view ### Laboratório 5 https://hackmd.io/tWhqpBRwRfSNNEViuITPvA ### Laboratório 4 https://hackmd.io/ZOo0I_tjRoWflSB7obgXFw?view --- ### Laboratório 3 #### Geração de Números Pseudo Aleatórios ##### Tarefa 1 `openssl rand 10` (gera 10 bytes aleatórios). `openssl rand -hex 10` (sequência pseudo-aleatória -> cada 2 caracteres hex são 1 byte). **Q.:** Qual o comando que gera exatamente 10 caracteres hexadecimais? `openssl rand -hex 5` > [10 caracteres hexadecimais são 5 bytes] **Q1.:** Qual deve ser o valor da entropia calculada para bytes produzidos com o comando anterior? - [x] Deve ser próximo do máximo. #### Tratamento e Armazenamento de Palavras-Passe ##### Tarefa 2 No meu caso, eram apenas dois! **Q2.:** Sabe a password de *root* do computador do laboratório? - [x] Sim, é `labredespc` ##### Tarefa 3 Calcular representação de uma _password_ no computador: ```shell= openssl passwd -6 -salt YTEdZjE3Q/z ``` Calcular a representação da _password_ superman com o salt "LoisLane": ```shell= openssl passwd -6 -stdin -salt LoisLane superman #colocar no stdin ``` **Q3.:** Um método arcaico de _password cracking_: - [x] Sim. 1. Roubar o ficheiro `/etc/shadow`; 2. Identificar o algoritmo, ler o _salt_ e a representação R; 3. _Loop_: * 1 tentava _password_ 1, 2, 3, 4, ..., fim dicionário de passes; * 2 calculava representação com openssl com o _salt_ lido e aquela _password_; * 3 verificava se a representação era igual a R. * Se sim, tinha encontrado a password; imprimia e fazia exit; #### Teste de Comunicações TLS ##### Tarefa 4 `openssl s_client -connect www.google.com:443 -tls1_2` `openssl s_client -connect www.google.com:443 -tls1_3` **Q4.:** Qual o tamanho do segredo mestre (Master-Key) trocado no estabelecimento da ligação? - [x] 50 bytes para TLS1.2 - [x] 32 bytes para TLS1.3 (usa curvas elípticas) **Q5.:** Qual é o algoritmo de cifra utilizado para efeitos de confidencialidade da ligação? - [x] AES, TLS1.3 - [ ] 3DES - [ ] RSA - [x] Salsa20, TLS1.2 - [ ] RC4 **Q6.:** Qual é o algoritmo usado para troca de chaves de sessão? - [x] ECDHE - Eliptic Curve Diffie-Hellman Key Exchange, para ambos **Q7.:** Qual é a função de hash usada para cálculo do código da origem da informação? - SHA384 no TLS1.3 - POLY1305 no TLS1.2 (para o google) **Q8.:** Quantos certificados fazem parte da cadeia de certificação deste site? - [x] 3 certificados **Q9.:** Quantos certificados fazem parte da cadeia de certificação do site da UBI (www.ubi.pt:443)? - [x] 3 certificados ##### Tarefa 5 **Q10.:** Os certificados foram verificados com sucesso? - [x] Não. **Q11.:** Caso tenha respondido _não_ à questão anterior, qual acha ser a causa do insucesso? Por outras palavras, qual foi o primeiro erro que obteve? - [x] _unable to get local issuer certificate_ **Q12.:** Experimentou fornecer ao `openssl` uma localização dos certificados que considera como sendo de confiança SIM! :smile_cat: ```shell= openssl s_client -connect www.ubi.pt:443 -verify 4 -CApath /etc/ssl2/certs/ ``` ##### Tarefa 6 **Q13.:** Verificou (observação humana) que a página foi, de facto, descarregada após inserir a instrução anterior? - [x] A página foi descarregada. ##### Tarefa 7 **Q.:** A página da UBI pode ser obtida sem ligação segura? - [x] Mais ou menos ##### Tarefa 8 `openssl s_client -connect www.ubi.pt:443 -msg -tls1_2` O `-msg` mostra cada uma das mensagens TLS que são trocadas. Número de mensagens: 9 **Q14.:** O número de mensagens bate certo com o que é especificado, e.g., na wikipedia em http://en.wikipedia.org/wiki/Transport_Layer_Security? - [x] Sem tirar nem por. #### Simular um Servidor TLS ##### Tarefa 9 **Q15.:** Dos três tipos de autenticação suportados pelo SSL/TLS, qual o tipo que é forçado pelo comando antes inserido? - [x] Ligação Anónima (sem autenticação). **Q16.:** Qual a porta em que o servidor que colocou a correr fica a correr? - [x] 4433. ##### Tarefa 10 ```shell= openssl s_server -nocert -cipher ADH:@SECLEVEL=0 openssl s_client -connect localhost:4433 -cipher ADH:@SECLEVEL=0 ``` **Q17.:** Consegue comunicar tipo _chat?_ - [x] Sim, consigo. ##### Tarefa 11 Ver se o tráfego da rede está cifrado: `sudo tcpdump -X -i lo` **Q18.:** As mensagens enviadas usando `openssl` vão cifradas ou em texto limpo? - [x] Vão cifradas (pelo menos eu não as consigo ver no terminal usando o tcpdump. ##### Tarefa 12 **Q19.:** Se lhe pedissem a sua opinião de especialista, diria que o OpenSSL é capaz de fornecer as funcionalidades de servidor HTTPS? - [x] Dá. - [x] E já agora também cantava como se fosse o Bono dos U2? ```shell= openssl s_server -CAfile server.pem -key serverkey.pem -WWW ``` > Coloca o servidor a correr e serve páginas HTML com HTTPS **Q20.:** Já experimentou aceder com o comando openssl `s_client`? Funciona? - [x] Sim e sim. **Q21.:** É possível aceder à página `index.html` (e site) usando um _browser?_ - [x] Mas é claro que sim! **Q22.:** Qual é a opção do `openssl s_server` que lhe permite devolver uma página depois de obter um pedido HTTPS válido através do openssl `s_client` (ou e.g., de um *browser*)? - [x] `-WWW` - [x] `-HTTP` --- ### Laboratório 2 #### Prova de Trabalho – Mining Bitcoins **Q1.:** Quantos bits devolve o SHA256? - [x] Depende do tamanho do ficheiro de entrada. ##### Tarefa 1 **Q2:** Como se compila o código incluido antes? Podem ser as 2 primeiras, dependendo das distribuições. > cc sha1sum.c -lcrypto > ./a.out 111111111111 **Q3.:** O que faz o código anterior? 5ª opção. ##### Tarefa 2 **Q4.:** Observando o segundo bloco de código incluído antes, de quantos bits iguais a 0 é que o procedimento vai andar à procura? - [x] 16 bits. ##### Tarefa 3 **Q5.:** Quanto tempo demora o programa a executar? - [x] 0,01s ##### Tarefa 4 0,25s **Q6.:** Em comparação com o anterior, quanto tempo mais demora este programa a executar? Devia ser 256 vezes mais. **Q7.:** Sempre que se adiciona um novo bit igual a 0, qual é o decremento da performance? - [x] A performance passa para metade. ##### Tarefa 5 **Q8.:** Partindo do princípio de que precisava de aproximadamente 3 segundos para encontrar hashes com os primeiros 24 bits iguais a 0, de quantos dias precisaria para minerar 25BTC? 3s ------------ 2^24 bits iguais a 0 ? ------------- 2^70 bits iguais a 0 R: 2211106232532992.0 seg / (60* 60 *24) = 2443359172.8355556 dias só com 1 PC. **Q9.:** Nas condições da questão anterior, de quantos computadores iguais ao seu precisaria para calcular um valor de hash que valesse 25BTC em 8,6 minutos (que é o tempo médio atual para se minerar 25BTC)? +/- 409 milhares de milhões. **Q10.:** Um mineiro de Bitcoins gasta dinheiro verdadeiro no processo de mineração? - [x] Sim, gasta. (eletricidade, equipamento,...) **Q11.: Quem é que paga a eletricidade do mineiro, enquanto o computador deste procura valores de hash intensivamente?** 1ª opção. #### 2 Cifras de Chave Pública ##### Tarefa 6 `openssl rsa` é a parte que lida com **gestão de chaves públicas e privadas RSA** no `openssl`. Quando o `openssl` gera chaves, estas ficam codificadas num formato chamado BASE64. A BASE64 tem: * todos os carateres do alfabeto em minúsculas 26; * todos os carateres do alfabeto em maiúsculas 26; * Todos os digitos 10; * o `+` e `/`. Usa-se o BASE64 porque se acredita que ao codificarmos desta forma, todos os caracteres passam todos os _routers_ e _switches_ na Internet. :::warning Quando usamos `openssl rsa`, o `openssl` julga sempre que vamos dar-lhe uma chave privada, por omissão; o que significa que temos de explicitamente dizer-lhe que será dada uma chave pública, caso seja essa a situação usando a opção `-pubin`. ::: `openssl rsa -in pk1.pem -pubin -text` **Q12.:** Tamanho do módulo: 1024. **Q13.:** O tamanho da chave parece-lhe seguro para utilizações atuais? - [x] Está quase a sair de moda, mas sim. (>2048 bits) - [ ] Não, é muito grande. - [ ] Não, é muito pequena. :::warning O RSA pode acabar imediatamente se o computador quantico aparecer. ::: **Q14.:** O que significa o acrónimo RSA? - [x] Nenhuma das anteriores (correta seria Rivest Shamir Adleman). **Q15.:** Num sistema criptográfico de chave pública, que chave utilizaria para cifrar uma mensagem para um(a) colega seu(ua)? - [ ] A minha chave pública. - [ ] A minha chave privada. - [x] A chave pública do(a) colega. - [ ] A chave privada do(a) colega. ##### Tarefa 7 `openssl rsautl` é a parte do `openssl` que lida com cifras de chaves pública RSA. Resolução da tarefa: ```shell= echo -n "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001" > numero.txt openssl rsautl -inkey pk1.pem -pubin -in numero.txt -out numero2.rsa -raw diff numero.rsa numero2.rsa echo -n "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002" > numero.txt openssl rsautl -inkey pk1.pem -pubin -in numero.txt -out numero2.rsa -raw diff numero.rsa numero2.rsa ... echo -n "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006" > numero.txt openssl rsautl -inkey pk1.pem -pubin -in numero.txt -out numero2.rsa -raw diff numero.rsa numero2.rsa ``` **Q17.:** Qual foi o número cifrado? - [ ] 1 - [ ] 2 - [ ] 3 - [ ] 4 - [ ] 5 - [x] 6 - [ ] 7 - [ ] 8 - [ ] 9 - [ ] 0 :::warning :warning: Não decifrámos nada! Cifrámos foi 6 vezes! ::: **Q18.:** É seguro usar o RSA em modo livro de escola para cifrar valores pequenos? - [x] Não é seguro... **Q19.:** Qual o *padding* aplicado, por omissão, quando se usa `openssl` para cifrar com RSA? - [ ] Optimal Assymetric Encryption Padding (OAEP). - [x] Public Key Cryptography Standards (PKCS) 1.5. - [ ] Nenhum. #### 3 Assinatura Digital ##### Tarefa 8 `echo "O Eduardo levaria uma valente coça se jogasse CoD comigo" > es-feio.txt` ##### Tarefa 9: Crie um par de chaves RSA `openssl genrsa -out pk-and-sk.pem 1024` **Q20.:** Quantos bits tem o módulo da chave gerada com o comando anterior? 1024. :::warning :warning: Se não soubermos quantos bits tem o módulo de uma pk-and-sk.pem, podemos usar o comando `openssl rsa -in pk-and-sk.pem -text -noout`. ::: **Q.:** Quantos são os _inputs_ do algortimo de geração de chaves pública/privada? - [x] 1, o tamanho do módulo - [ ] 2 - [ ] 3 - [ ] 4 - [ ] 500 **Q21.:** Se quiser assinar o ficheiro es-feio.txt que chave deve utilizar? - [x] A minha chave privada. ##### Tarefa 10: Escreva o comando que permite extrair a chave pública, contida no ficheiro pk-and-sk.pem `openssl rsa -in pk-and-sk.pem -out pk.pem -pubout` ##### Tarefa 11: escreva o comando OpenSSL que permite criar a assinatura digital do ficheiro es-feio.txt com a combinação MD5 e RSA. `openssl dgst -md5 -sign pk-and-sk.pem es-feio.txt > es-feio.MD5withRSA` ##### Tarefa 12 **Q22.:** O que é que falta no comando seguinte para que a verificação seja feita com sucesso?: `openssl dgst -md5 -verify pk.pem -signature es-feio.md5-with-rsa...` . - [x] Falta o `nome` do `ficheiro` para o qual a assinatura foi calculada. `openssl dgst -md5 -verify pk.pem -signature es-feio.MD5withRSA es-feio.txt` **Q23.:** Depois da emissão correta do comando anterior, o que é que lhe diz se uma assinatura digital está ou não está válida? - [x] Depois de emitir o comando, o OpenSSL escreve no ecrã que a assinatura está OK. ##### Tarefa 13 ``` nano es-feio.txt openssl dgst -md5 -verify pk12589.pem -signature es-feio.MD5withRSA es-feio.txt ``` **Q26.:** O que é que o OpenSSL devolve desta vez? `Verification Failure` ##### Tarefa 14 O que é uma assinatura digital no contexto específico desta aula? A assinatura digital é a cifra de um valor de _hash_! Se tentarmos decifrar, por passos uma assinatura digital, devemos encontrar lá dentro um valor de _hash_. ``` openssl dgst -md5 -binary es-feio.txt openssl rsautl -verify -inkey pk12589.pem -pubin -in es-feio.MD5withRSA ``` ##### Tarefa 15 1. Gerar 2 pares de chaves: * Um para cifrar; * Outro para assinaturas digitais. `openssl genrsa ...` 2. Enviar chaves públicas para o(a) colega(a). 3. Um dos dois cria um ficheiro com um poema de Fernando Pessoa, o outro coloca lá 2 oitavas dos Lusíadas. 4. Assine o ficheiro com a chave respetiva, usando a combinação de algoritmos `SHA1withRSA`. `openssl dgst -sha1 -sign ...` 5. Cifre o ficheiro à moda do PGP usando RSA e AES em modo CTR. ```sequence Participant Alice Participant Bob Note left of Alice: fernando.txt Note left of Alice: s=SIGN(pkAS,fernando.txt) Note left of Alice: gera uma chave simétrica K1 Note left of Alice: c1=AES-CTR(K1,fernando.txt) Note left of Alice: c2=RSA(pkB,K1) Alice->Bob: c1,c2,s Note right of Bob: c1,c2,s ``` ```shell= openssl rand ... openssl enc -aes-128-ctr... openssl rsautl ... ``` 6. Envie o ficheiro e a assinatura ao(à) colega. ```sequence Participant Alice Participant Bob Note right of Bob: c1,c2,s Note right of Bob: Decifra K1 Note right of Bob: K1=D-RSA(skB,c2) Note right of Bob: fernando.txt=D-AES-CTR(K1,c1) Note right of Bob: Verifica a assinatura digital ``` ```shell= openssl rsautl -decryt ... openssl enc -d -aes-128-ctr ... openssl dgst -sha1 -verify ... ``` --- ### Laboratório 1 #### 1. Cifras de Chave Simétrica ##### Tarefa 1: Crie o ficheiro confidential.txt com a sequência 111111111111222222222222 (doze 1s e doze 2s) repetida 3 vezes. ```shell= echo -n "111111111111222222222222"> confidential.txt echo -n "111111111111222222222222">> confidential.txt echo -n "111111111111222222222222">> confidential.txt ``` ##### Tarefa 2: Cifre o ficheiro com a cifra RC4, usando a chave em hexadecimal fff22f2fff ```shell= openssl enc -rc4 -K fff22f2fff -in confidential.txt -out confidential.rc4 openssl enc -rc4 -K 'openssl rand -hex 16' -in confidential.txt -out confidential.rc4 ``` - No rc4 a chave é de 128 bits. - -K: diz q a chave de cifra é em hexadecimal. - enc: parte do ssl q trata de criptografia de chave simétrica. ##### Tarefa 3: **Q1.:** Experimentou abrir o ficheiro cifrado? - [x] Sim. ```shell= cat confidential.rc4 hexdump confidential.txt hexdump confidential.rc4 ``` **Q2.:** Quantos caracteres hexadecimais diferentes são produzidos pelo comando anterior para um ficheiro cifrado? No ficheiro não cifrado há 3 caracteres hexadecimais diferentes. No ficheiro cifrado existem 16 chars hexadecimais. -> se a cifra for boa há sempre os 16. **Q3.:** Qual lhe parece ser o valor mais provável para a entropia deste ficheiro? Propriedades das cifras: - Propriedade 1 - Dispersão: Se a cifra for boa, a sua aplicação provoca um criptograma sem propriedades estatísticas notáveis (o mesmo que aparecem todos os caracteres com distribuição normal). Isto também significa que, quando aplicamos uma cifra BOA, o criptograma fica com entropia próxima da máxima. A entropia máxima tem uma fórmula simples: $Emax = log(n)$, em que n é o número total de ocorrências da variável que estamos a analisar que podem ocorrer (nos ficheiros é uma unidade de informação: bits, hexas ou bytes). $ln(n) = log(n) / log(e)$ ```shell= python import math math.ln(256) ---> o py não tem "ln", logo: math.log(256)/math.log(math.exp(1)) -> se o log não estiver na base 10 math.log(256) -> o log neste caso já está na base 10. 2.40 ``` **Q4.:** Se voltar a cifrar o ficheiro que já foi cifrado, vai conseguir ler facilmente o seu conteúdo ou não? - [x] Se cifrar com a mesma chave sim, caso contrário não. ##### Tarefa 4: Volte a cifrar o ficheiro (com a mesma chave) e tente abrir o ficheiro resultante com um editor de texto. Chame ao novo ficheiro confidential.2times.rc4. ```shell= openssl enc -rc4 -K fff22f2fff -in confidential.rc4 -out confidential.2times.rc4 cat confidential.2times.rc4 ``` **Q5.:** O resultado coaduna-se com o que respondeu na pergunta anterior? - [x] Sim. **Q6.:** Que tipo de cifra é a RC4? - [x] Chave simétrica contínua. **Q7.:** O que significa RC4? Rivest Cipher 4 ##### Tarefa 5: Cifre o ficheiro confidential.txt com a cifra AES no modo ECB com a chave de cifra hexadecimal 11232233. O ficheiro resultante deve chamar-se confidential.aes-ecb. Tente visualizar o conteúdo este ficheiro. ```shell= openssl enc -aes-128-ecb -K 11234455 -in confidential.txt -out confidential.aes-ecb cat confidential.aes-ecb hexdump confidential-aes-ecb ``` **Q8.:** Consegue detetar padrões no ficheiro cifrado? A 1º linha é igual à 4ª. **Q9.:** De acordo com a experiência que fez antes, qual é o tamanho do bloco que esta cifra utiliza? - [x] 16 bytes. **Q10.: O modo ECB precisa de vetor de inicialização?** - [x] Não. Os vetores de inicialização servem para aumentar a entropia. **Q11.: Que tipo de cifras concretizam a família de algoritmos especificados pela AES?** Chave simétrica por blocos (entra um bloco de cada vez, e sai um de cada vez também). **Q12.: O que significa AES?** Advanced Encryption Standard. ##### Tarefa 6: **Q13.:** _Challenger/Adversary._ **Q14.:** ```shell= echo "11111111111111111111111111111111" > 1.txt echo "11111111111111111111211111111111" > 2.txt ``` ```shell= openssl enc -aes-128-ecb -K ffffff11112ff1 -in 2.txt -out x.enc ``` ```shell= hexdump x.enc ``` ```shell= openssl enc -aes-128-ecb -K ffffff11112ff1 -in 1.txt -out x.enc ``` ```shell= hexdump x.enc ``` **Q14.:** Canja de galinha se formos o adversário. #### Tarefa 7: Use o seguinte comando para cifrar o ficheiro confidential.txt: `openssl enc --aes-128-cbc -K 11232233 -in confidential.txt -out confidential.aes-cbc` **Q15.:** O comando antes enunciado funcionou? - [x] Não. **Q16.:** Como é que se resolve a situação? Vetor de inicialização. ```shell= openssl enc -aes-128-cbc -K 11232233 -in confidential.txt -out confidential.aes-cbc -iv 001122 ``` **Q17.:** O que significa CBC? _Chiper Block Chaining_. **Q18.:** O que é o CBC? - [x] Modo de utilização de uma cifra. **Q19.:** Se voltar a cifrar o ficheiro que já foi cifrado com --aes-128-cbc, vai conseguir ler facilmente o seu conteúdo ou não? - [x] Acho que não, porque não é uma cifra contínua. ##### Tarefa 8: Volte a cifrar o ficheiro e tente abrir o ficheiro resultante com um editor de texto. Chame ao novo ficheiro confidential.2times.aes-cbc. ```shell= openssl enc -aes-128-cbc -K 11232233 -in confidential.aes-cbc -out confidential.2times.aes-cbc -iv 001122 ``` **Q20.:** O resultado coaduna-se com o que respondeu na pergunta anterior? Impecável. É uma cifra por blocos e não contínua. **Q21.:** Como é que se decifra um ficheiro cifrado no modo CBC? Usando a opção -d. ```shell= openssl enc -aes-128-cbc -d -K 11232233 -in confidential.aes-cbc -out confidential.decifrado -iv 001122 cat confidential.decifrado ``` ##### Tarefa 9: Quando se especifica uma palavra-passe em vez de uma uma chave de cifra (i.e., usar a opção -k em vez de -K), é conveniente definir uma pitada de sal usando a opção -S (para além do iv). **Q22.:** Porquê? -K: chave de cifra hexadecimal. -k palavra-passe. A pitada de sal aumenta a entropia. **Q23.:** Acha que é preciso inserir o mesmo valor do salt quando se vai decifrar o ficheiro, ou basta a palavra-chave e o iv? Cifrar com palavra-passe: ```shell= openssl enc -aes-128-cbc -k pass -in confidential.txt -out cifrado-pass.aes-cbc Podemos usar um algoritmo e o salt : openssl enc -aes-128-cbc -k pass -in confidential.txt -out cifrado-pass.aes-cbc -pbkdf2 -S 112233 ``` Decifrar: ```shell= openssl enc -d -aes-128-cbc -k pass -in cifrado-pass.aes-cbc -pbkdf2 -S 112233 (...mas sem o -S (salt) ele decifra na mesma). ``` R: deixa experimentar...ver o que lá vai dentro. Se não metermos o salt, ele gera um salt automaticamente. #### 2. Maneabilidade ##### Tarefa 10: Crie o ficheiro texto-limpo.txt e coloque lá a mensagem "Enviar 2 euros para o Bob". De seguida, cifre o ficheiro com uma cifra por blocos. ```shell= mkdir Alice mkdir Banco mkdir Claire cd Alice echo "Enviar 2 euros para o Bob" > msg.txt # modo cbc openssl enc -aes-128-cbc -K 0123456789abcdef0123456789abcdef -in msg.txt -out cifrado.aes -iv 0 ``` ##### Tarefa 11 ```shell= mv Alice/cifrado.aes Claire/ # Claire apanha o ficheiro cd Claire cat cifrado.aes # Não consegue ver a msg, mas consegue alterá-la # temos que usar o alterbyte.c, para alterar um byte da msg cc alterbyte.c ./a.out cifrado.aes cifrado-2.aes 8 #8, é o byte que quero alterar cat cifrado.aes # assim parecem iguais cat cifrado-2.aes # assim paracem iguais # por isso fazemos hexdump hexdump cifrado.aes hexdump cifrado-2.aes # vemos que o byte 8 está alterado mv Claire/cifrado-2.aes Banco cd Banco/ openssl enc -aes-128-cbc -d -K 0123456789abcdef0123456789abcdef -in cifrado-2.aes -out decifrado.txt -iv 0 cat decifrado.txt # não dá para ler tudo ``` **Q24.:** Consegue ler a mensagem original? - [x] Não... **Q25.:** Diria que, se alguém alterasse qualquer byte no ficheiro durante a sua transmissão, o recetor iria notar essa alteração? - [x] Sim... ##### Tarefa 12: Apague os ficheiros cifrado.aes, cifrado-2.aes e texto-limpo-2.txt e recomece, desta feita com o modo CounTeR (CTR). ```shell= cd Alice echo "Enviar 2 euros para o Bob" > msg.txt # modo ctr openssl enc -aes-128-ctr -K 0123456789abcdef0123456789abcdef -in msg.txt -out cifrado.aes -iv 0 ``` **Q26.:** Em que tipo de cifra se transforma qualquer cifra por blocos quando se usa este modo? - [x] Simétrica contínua (por isso também não é preciso por o -d, quando é para decifrar...) ##### Tarefa 13 ```shell= mv Alice/cifrado.aes Claire/ # Claire apanha o ficheiro cd Claire cat cifrado.aes # Não consegue ver a msg, mas consegue alterá-la # temos que usar o alterbyte.c, para alterar um byte da msg cc alterbyte.c ./a.out cifrado.aes cifrado-2.aes 8 # 8, é o byte que quero alterar cat cifrado.aes # assim parecem iguais cat cifrado-2.aes # assim paracem iguais # por isso fazemos hexdump hexdump cifrado.aes hexdump cifrado-2.aes #vemos que o byte 8 está alterado mv Claire/cifrado-2.aes Banco cd Banco/ openssl enc -aes-128-ctr -d -K 0123456789abcdef0123456789abcdef -in cifrado-2.aes -out decifrado.txt -iv 0 cat decifrado.txt # dá para ler tudo e a msg parece real ``` **Q27.:** Nota algo estranho no ficheiro decifrado? - [x] Não... **Q28.:** Será que um atacante poderia mudar o texto-limpo sem o conhecer, alterando apenas o criptograma respetivo, e sem ser notado? - [x] Sim... **Q29.:** De 0 a 5, em que 0 é muito má e 5 é muito boa, como classifica o facto de uma cifra ser maneável? - [x] 0. **Q30.:** Usaria uma cifra simétrica contínua para transmitir uma mensagem confidencial sobre um canal que está sujeito a escutas, mas não a alteração das mensagens? - [x] Sim, sem problema. #### 3. Funções de Hash ``` +-+-+-+-+-+ mensagem -->| função |--> output de tamanho fixo | de hash |(e aparentemente aleatorio) +-+-+-+-+-+ ``` ##### Tarefa 14: ```shell= openssl dgst # calcula valores de hash openssl enc # manipula cifras de chave simétrica echo -n "" > vazio.txt # Cria um ficheiro vazio. O -n é para o echo não por o char "new line" touch vazio.txt # Tb cria um ficheiro vazio/altera a data de um ficheiro já vazio openssl dgst -sha1 vazio.txt # está em desuso openssl dgst -sha256 vazio.txt openssl dgst -sha512 vazio.txt openssl dgst -md5 vazio.txt #está em desuso, ñ é segura openssl dgst -md5 # calcula o hash de um ficheiro stdin, ou seja, abre o teclado para escrevermos algo. # Se não escrevermos nada, e imediatamente fecharmos o ficheiro (ctr + d) ele supoe-o como um ficheiro vazio. ``` **Q31.:** Obteve os valores d41d8cd98f00b204e9800998ecf8427e e da39a3ee5e6b4b0d3255bfef95601890afd80709? - [x] Sim. ```shell= openssl dgst -sha1 ``` The quick brown fox jumps over the lazy dog (ctrl + d) ```shell= openssl dgst -sha256 ``` The quick brown fox jumps over the lazy dog (ctrl + d) **Q32.:** O que abrevia a letra S do acrónimo SHA1? *Secure*. **Q33.:** O que tem a dizer acerca da seguinte frase: O autor do RC4 é o mesmo do SHA1 Falsa. O autor do RC4, o Rivest, fez o md5 (fez os mds). ##### Tarefa 15: **Q34.:** Acha que, sabendo isto, consegue descobrir a palavra-passe ou decifrar o raça da frequência? - [x] Canja de galinha... **Q35.:** Acha correto que os autores de sites de cracking de valores de hash usem a palavra decrypt (decifrar) para se referirem ao serviço que disponibilizam? Não, porque eles não estão a decifrar...apenas recorrem a Bases de Dados com muitas palavras e o respetivo valor de *hash*... **Q36.:** Caso tenha respondido canja de galinha na questão anterior, o que é que recomenda que o Professor faça na próxima vez para proteger melhor o documento? - Todos. ##### Tarefa 16: Crie um ficheiro chamado ficheiro.txt com a letra b. ```shell= echo -n "b" > ficheiro.txt ``` **Q37.:** O que é que acontece ao valor de hash do ficheiro, se mudar a letra b pela letra c, no caso em que a função de hash utilizada é de qualidade comprovada? ```shell= echo -n "c" > ficheiro.txt ``` Mudam aproximadamente metade dos bits de acordo com uma distribuição binomial. Traduzir cada caracter para binário: ```python= python bin (0x3733bbd43bd029e3bd660b44a20dac43e9c922e3) ``` A probabilidade de cada bit mudar é de 0,5. SHA1: tem _output_ de 160 bits. Metade são 80 bits. **Q38.:** Que nome se dá ao efeito que provoca a alteração mencionada na questão anterior? Se alterar 1 bit no texto limpo, o valor de *hash* muda aproximadamente em metade: **efeito avalanche/em cadeia**. **Q39.:** Só por curiosidade, quantos bits mudaram no ficheiro quando trocou a letra b pela letra c Não é nenhuma das opções. ##### Tarefa 1 ```shell= md5sum vazio.txt # calcula o valor de hash md5 do ficheiro vazio.txt sha1sum vazio.txt # calcula o valor de hash sha1 do ficheiro vazio.txt ``` #### 4. Códigos de Autenticação de Mensagens ##### Tarefa 18: crie um ficheiro chamado ficheiro.txt com a letra b. De seguida, calcule o Hash based Message Authentication Code (HMAC) para este ficheiro com a função SHA512. **Q40.:** Precisa de alguma informação adicional? Sim, da chave. ```shell= openssl dgst -sha256 -hmac 1122334455 ficheiro.txt > ficheiro.hmac ``` As opções começam com "-..." e os parâmetros não. **Q41.:** Para que é que serve um MAC? 3ª opção: sobre integridade 2ª opção: sobre confidencialidade --> as cifras fazem isto, não o MAC MAC: * Evitar que hajam erros aleatórios ou intencionais **Q42.:** Quantas entidades podem calcular um HMAC? - [x] Só as entidades que possuem a chave. **Q43.:** Quantas entidades podem calcular o valor de hash SHA1 de um ficheiro? - [x] Qualquer entidade envolvida... ##### Tarefa 19: **Q44.:** Quantas chaves de integridade estão envolvidas na geração de um ECBC-MAC? - [x] 2 (k e k1). **Q45.:** O OpenSSL permite calcular este MAC diretamente? - [x] Não, não permite. Calcular o MAC: 1º - cifrar os blocos com o modo AES-CBC com uma chave k1 2º - guardo só o último bloco 3º - cifrar o ultimo bloco com AES-ECB com uma chave k2 ```shell= openssl enc -aes-128-cbc -K 1223344 -iv 0 -in ficheiro.txt | tail -c 16 > bloco.aes ``` * O comando _tail_ mostra os últimos x caracteres de um ficheiro * Neste caso, o _tail -c 16_ mostra os últimos 16 bytes (tamanho de cada bloco) do ficheiro, e guarda-os no ficheiro bloco.aes ```shell= openssl enc -aes-128-ecb -K 22334455 -in bloco.aes -out ficheiro.mac ``` * O ficheiro.mac é o MAC. ##### Tarefa 20 **Q46:** É possível produzir um MAC com o comando openssl dgst que não seja um HMAC? Sim,...