• Nenhum resultado encontrado

2.2 GERENCIAMENTO DE CHAVES

2.2.2 Chaves Públicas

Para contornar o problema das chaves privadas foram desenvolvidas técnicas de Chaves Públicas, também chamado de criptografia assimétrica, que utiliza algoritmos com custo computacional considerável, para que, por meio de uma troca de chave pública, uma chave privada possa ser derivada. A partir daí, a mensagem será cifrada, sem que nenhum observador externo, mesmo que de posse das chaves públicas, possa descobrir suas chaves privadas [Certicom, 2000]. Um exemplo simples desse esquema, utilizando função exponenciação, é apresentado na Figura 1.

15

Figura 1 - Exemplo de criptografia, utilizando a operação módulo (mod), sobre a função exponenciação.

Fonte: Traduzido de Microsoft Developer Network Blog (2010).

O método mais utilizado é a Curva Elíptica Diffie-Hellman (Elliptic Curve Diffie- Hellman, ECDH), que se baseia na Criptografia por Curva Elíptica (Elliptic Curve

Cryptography, ECC). Trata-se de técnicas rápidas, com chaves menores e mais seguras

[Certicom, 2000]. A segurança do método RSA de 1024 bits é equivalente a esquema ECDH com uso apenas de 160 bits de chave e várias operações [Liu et al., 2008].

A ECDH é definida a partir de uma equação de curva elíptica, Equação 1, pertencente ao conjunto dos primos finitos FP:

{ = + ++ , , ∈ � (1)

Os valores das variáveis x, y ∈ FP que satisfazem o sistema acima, considerando

as constantes a, b e P, junto com o ponto no infinito O, formam um grupo que define a curva elíptica sobre FP [Meinerz & Yanoc, 2010].

Uma curva elíptica também pode ser definida para um campo binário, �, dada pela Equação 2.

16

A Figura 2 apresenta um esquema de ECDH entre dois usuários Alice e Bob. Inicialmente, ambos devem conhecer a curva elíptica E e um ponto G pertencente à

E,

Figura 2 - Típica troca de uma chave secreta sobre Diffie-Hellman baseado no problema ECDLP. Onde kA e kB são inteiros sobre TP, G é um ponto com coordenadas inteiras pertencente à curva elíptica E, TA e

TB são as chaves públicas de Alice e Bob respectivamente, e TP a chave privada criada apenas entre Alice

e Bob.

Fonte: Traduzido de Malan et al. (2004).

com coordenadas inteiras pertencentes à FP. Então, cada um escolhe uma chave privada kA e kB, e precisam calcular através de produto vetorial e enviar uma chave pública

derivada TA e TB definida por:

�= �∗ (3)

Em seguida, cada um de posse da chave pública Ti do outro, deve calcular a chave privada TP, realizando a operação descrita por:

{ � �= ∗ = ∗ ∗

�= ∗ = ∗ ∗

(4)

A segurança do Criptografia por Curva Elíptica (Elliptic Curve Cryptography, ECC) é dada pelo teorema de Hasse, que define os limites inferiores e superiores da quantidade de pontos inteiros de uma curva elíptica pertencentes à FP, como descrito

por:

17

Como exemplo, pode-se analisar uma curva elíptica dada por y2 = x3 + 7x + 1

sobre F101, que, quando utilizado o Teorema de Hasse, são encontrados os limites de

quantos pontos possíveis podemos encontrar na curva elíptica [Washington, 2003], como visto asseguir:

+ − √ ≤ # ≤ + + √ (6)

≤ # ≤ (7)

A quantidade de pontos apresentada nas Equações (6) e (7) pode não parecer muito grande, mas analisando outra curva elíptica como y2 = x3 – 10x + 21 sobre F

557,

tem-se as seqguintes equações:

+ − √ ≤ # 7 ≤ + + √ (8)

≤ # 7 ≤ (9)

Sendo assim, a ordem de magnitude para o fator primo P, aconselhada pelo Instituto Nacional de Padrões de Tecnologia dos EUA (National Institute of Standards

Technology, NIST) para obter segurança, deve possuir 163 bits usando o Skipjack como

algoritmo criptográfico, com uma curva elíptica sobre o campo binário, � , e 283 bits para o AES-128 também para � [NIST, 1999].

A criptografia assimétrica, apesar de ser uma técnica robusta e bem difundida, não é garantia de total segurança, ocorrendo na literatura referência a alguns ataques devido à má distribuição de chaves. Esse problema tende a se agravar em redes de sensores sem fio, que não possuem uma capacidade computacional muito grande para trabalhar com grandes chaves [Adj et. Al., 2014].

2.2.3 Gerenciamento de Chaves em RSSFs

Os métodos de gerenciamento de chaves mais importantes utilizados em RSSFs são: chave única, chaves entre pares, chaves híbridas (utilizado pelo ZigBee), servidor

18

confiável (troca de chaves apenas em um dispositivo de confiança), criptografia assimétrica e esquema de pré-distribuição de chaves randômicas [Baronti et al., 2007].

No ZigBee são utilizadas chaves de 128 bits para comunicação broadcast e ponto a ponto [Baronti et al., 2007]. Essas chaves podem ser passadas por meio da utilização de uma chave mestra ou de um dispositivo confiável, chamado centro confiável (trust

center). A especificação ZigBee sugere a utilização de um protocolo de estabelecimento

de chaves simétricas entre dois dispositivos.

Devido a limitações físicas de um sistema embarcado, é indicada a utilização de chaves privadas [Liu et al., 2012]. O gerenciamento de chaves privadas deve ser realizado da seguinte maneira: uma mesma chave será utilizada em toda a rede; uma chave inicial será pré-configurada, permitindo a inicialização da rede sem problemas; o dispositivo mestre é o único que poderá trocar a chave utilizada na rede, através de uma mensagem de broadcast realizada com a chave anterior. Após algumas trocas de mensagens com os instrumentos com a chave anterior, o mestre enviará uma mensagem com nova chave, onde todos executarão a função de expansão de chaves [Baronti et al., 2007].

Alguns trabalhos apresentam implementações otimizadas de algoritmos de chaves públicas para RSSFs. Em Kumar (2006), foi demonstrada a capacidade de implementação de uma ECC segura para microprocessadores de 8-bits utilizando 2 . Liu et al. (2012) propôs um sistema de PKC baseado em autenticação por broadcasting baseado em amortização de assinatura.

2.2.3 Signcryption

Na década de 90 uma metodologia foi apresentada a fim de economizar a quantidade de trocas de mensagens existentes nas técnicas de chaves públicas, baseando-se no Padrão de Assinatura Digital (Digital Signature Standard, DSS), a

19

cartas antigas, onde a mensagem era assinada e colocada em um envelope com um selo único. A Figura 3 apresenta esse modelo.

Figura 3 - Assinatura e selo de uma mensagem.

Fonte: Zheng (1997).

Para isso, é preciso os seguintes parâmetros entre os usuários:  Um grande número primo p;

 Um fator primo q de p - 1;

 Um inteiro g escolhido aleatoriamente de [1,...,q - 1];  Uma função hash cuja saída tenha pelo menos 128 bits;  Uma função hash KH com uso de uma chave k;

 Um par de Algoritmos (E, D) de Criptografia e Descriptografia;

 Uma chave privada escolhida aleatoriamente dentro de [1,..,q - 1] para cada usuário;

 Uma chave pública yi calculada por = � � ;

 Uma mensagem m a ser criptografada.

O remetente deve realizar os seguintes passos para realizar a assinatura, a criptografia e para enviar (r, s, c):

 Encontrar um = ℎ ℎ � � e dividir k em dois k1 e k2;

 Calcular = � ;

 Calcular = / + � ;

20

Para o destinatário realizar a validação e a descriptografia com posse de (r, s, c), deve-se fazer:

 Encontrar um = ℎ ℎ �. � . � ;

 Dividir k em k1 e k2;

 Recuperar m = Dk1(c);

 Aceitar a mensagem m apenas se KHk2(m) for idêntica a r.

Esta técnica foi adaptada com uso do ECC em substituição do DAS e aplicada com sucesso em uma RSSF de forma hierárquica, com eficiência de 40% na comunicação, 23,79 µJ no consumo de energia, 96% no espaço de armazenamento de chave e 75% no total de operações realizadas, em comparação com versões anteriores [Hagras et al., 2011].

Uma vulnerabilidade dessa técnica é o ataque de substituição de chave pública, que consiste em interceptar a mensagem do remetente, substituindo-a com uma mensagem sua para o destino, utilizando uma chave desenvolvida pelo atacante. Ao chegar no destino, o destinatário valida a mensagem, não sendo capaz de identificar a diferença entre o remetente original e o invasor. Este ataque não fere toda a segurança proposta pelos métodos, como descobrir qual a mensagem original enviada pelo remetente, nem sua chave pública, mas permite causar sérios problemas em negociações de mensagens como no comércio público [Hu et al., 2012].

2.3 CLASSIFICAÇÃO DE SEGURANÇA

A Agência Nacional de Segurança dos EUA (National Security Agency, NSA), padroniza a classificação de equipamentos de segurança em quatro tipos (CNSS, 2010):

Tipo 1: Equipamentos classificados ou controlados pela NSA, permitido para o uso em informações classificadas ou sensíveis para o governo dos EUA. Isto significa que nestes equipamentos devem ser usados algoritmos classificados.

21

Tipo 2: Equipamento autorizado pela NSA para informações sensíveis de segurança nacional mas não classificadas. Nesta categoria podem ser usados algoritmos classificados ou não.

Tipo 3: Equipamento não classificado (e não previamente autorizado pela NSA), mas com uso de chave apropriada para transações sensíveis mas não classificadas do governo ou comerciais. Nestes equipamentos podem ser usados algoritmos largamente publicados e com várias implementações conhecidas.

Tipo 4: Equipamento comercial não avaliado, não recomendado para uso governamental tanto pela NSA quanto pelo NIST.

Apesar da segurança não residir apenas no uso de um algoritmo secreto, ela pode ser aprimorada ao usá-los, desde que o seu desenvolvimento e validação sejam realizados em um alto nível de segurança e qualidade técnica.

Um algoritmo criado pela técnica desenvolvida neste trabalho seria classificado inicialmente pela NSA como Tipo 4. Porém, se fosse utilizado internamente pela NSA, reconhecendo a metodologia como sendo capaz de criar algoritmos criptográficos seguros, utilizando-o secretamente para criar seus próprios algoritmos governamentais, seria classificado como Tipo 1 ou Tipo 2.

22

3

ALGORITMOS CRIPTOGRÁFICOS

Nove algoritmos foram escolhidos para comparar com aqueles gerados pela PG, entre eles três dos finalistas do concurso para a escolha do AES: o Rijndael (agora conhecido mais como AES), RC6 e Twofish. Também foram testados os antecessores do AES: o DES e o TDES. Outros algoritmos testados foram o XTEA, XXTEA, Skipjack e o Blowfish, por serem difundidos em RSSFs.

Depois de devidamente explicados, focando em cada uma de suas funções criptográficas, seu funcionamento básico foi testado em um microprocessador do tipo PIC18FK50. Como a quantidade de memória e processamento do microprocessador não é muito adequada para testes mais complexos, um conjunto de testes foi realizado utilizando uma plataforma PC, com sistema operacional Windows 7 64-bits, 8 GB de RAM e Processador Intel Core I5-2520M 2.5 GHz. Estes testes permitirão avaliar preliminarmente o desempenho de cada algoritmo e a qualidade geral da criptografia, implicando limites máximos e mínimos para configurar o algoritmo de PG.

3.1 DES E TDES

O DES (Data Ecryption Standard, Padrão de Criptografia de Dados) foi desenvolvido por Feistel (1973), para IBM e denominado inicialmente Lucifer, sendo transformado no padrão oficial de segurança digital dos Estados Unidos em 1977 e utilizado em larga escala pelas redes de computadores [Feistel, 1973].

O modelo do esquema criptográfico utilizado pelo DES é chamado Rede Feistel e é adotado por diversos outros cifradores. Segue o esquema visto na Figura 4 (a).

23

Figura 4 - (a) DES e (b) Função Feistel do DES.

(a) (b)

Fonte: Traduzido de Matt Crypto, 2014.

Em uma rede de Feistel o dado de entrada Xi, de tamanho n, é dividido em duas ou

mais partes, Ei e Di. Então, a parte direita Di é alterada de acordo com uma função F

(Função Feistel), que pode ser definida por:

: { , }�/ � { , } → { , }�/ (10)

Onde {0,1}k é a sub-chave K

i a ser aplicada naquela rodada, {0,1}n/2 é a parte

direita da palavra a ser alterada, e aplicada uma operação OU, gerando uma nova palavra {0,1}n/2.

O resultado da função F é então combinado com a operação OU exclusivo (XOR de símbolo ⨁). A parte esquerda Ei desse resultado, se tornará a parte Di+1 da próxima

rodada. Já a parte Di se tornará a parte Ei+1 da próxima rodada, formando o Xi+1 final. O

sistema que representa esse esquema é definido por:

��+ = {

�+ = �⨁ �, �� , �+ = �

: �= �/ �� � = �/ ��

24

Onde msbn/2 é a metade mais significativa da palavra e lsbn/2 é a metade menos

significativa da mesma palavra.

O esquema de descriptografia é muito similar a Equação (11), não precisando inverter a função F, apenas realizando a operação na ordem reversa:

��− = { �− = �⨁ �, �� �− = �

(12)

A Figura 4(b) representa o esquema utilizado pelo DES, cuja função Feistel realiza uma expansão da metade da palavra denotada pelo bloco E, que possuí 32 bits, em 48 bits através da duplicação de metade dos bits. Em seguida, realiza um XOR com a sub-chave de 48-bits. O resultado depois é dividido em grupos de 6 bits e permutado através de uma caixa de substituição S-Box (S1, S2, S3, S4, S5, S6, S7 e S8), fornecendo não linearidade ao método. Cada S-Box é diferente entre si e retorna 4 bits, que juntos formam a saída da função Feistel.

Figura 5 – TDES.

Fonte: Traduzido de Institute for Defense and Government Advancement (2012).

O Triple DES (TDES, DES Triplo) possui praticamente o mesmo algoritmo do DES, sendo que é executado três vezes, cada vez utilizando uma chave diferente, como visto na Figura 5. O algoritmo DES testado foi adaptado de um TDES desenvolvido por Tariq (2009).

25

3.2 RIVEST CIPHER 6

O Cifrador Rivest faz parte de uma geração de cifradores criados por Ronald Rivest em 1987, que foi iniciada com o RC2. Ele foi mantido em segredo até 1996, quando foi quebrado, para em 1998 finalmente ser descrito formalmente [Rivest, 1998]. Neste trabalho é utilizado o cifrador mais recente dessa família, o RC6, que foi um dos candidatos finalistas a se tornar o AES.

O RC6 [Rivest et al. 1998], sigla derivada de "Rivest Cipher", é um cifrador para chaves de 128 bits, mas que também pode utilizar chaves de 192 e 256 bits. Seu funcionamento utiliza apenas seis operações básicas:

 A + B: Adição modular de inteiros 2w;

 A - B: Subtração modular de inteiros 2w;

 A XOR B: OU-Exclusivo bit-a-bit de palavras de w-bits;  A X B: Multiplicação modular entre inteiros 2w;

 A << B: Deslocamento de uma palavra A de w-bit para a esquerda por uma quantidade de bits dado pelo valor dos log(w) bits menos significativos de B;  A >> B: Deslocamento de uma palavra A de w-bits para a direita por uma

quantidade de bits dado pelo valor dos log(w) bits menos significativos de B. Utilizando essas operações, onde w é o tamanho da palavra utilizada, o cifrador é montado de acordo com a Figura 6, apresentando uma etapa de inicialização, uma etapa de repetição, executadas geralmente 20 vezes (r = 20), e uma etapa final. O RC6 é derivado do RC5 [Rivest, 1995], podendo ser visto como dois processos de criptografia RC5 em paralelo.

Para a descriptografia, a ordem das operações é invertida, e algumas operações são substituídas por operações inversas (onde houver soma acontecerá subtração, onde houver deslocamento a esquerda haverá deslocamento a direita).

O algoritmo desenvolvido para os testes foi baseado em [Salasio, 1998]. O microprocessador utilizado possui capacidade computacional menor que um PC

26

comum, com palavras de apenas 8-bits, necessitando ser levemente modificado para funcionar de maneira apropriada para um hardware de 8-bits.

A primeira modificação é a adaptação de todas as operações para trabalhar em um dispositivo de 8-bits. Sendo assim, todas as referências às palavras de 32-bits foram mudadas para palavras de 8-bits.

Figura 6 - Cifrador RC6.

Fonte: Elaborado pelo autor.

A soma e subtrações comuns utilizadas no algoritmo original estavam erradas, não se adequaram à operação de soma binária modular. Para isso, foram alteradas para somas e subtrações modulares, permitindo assim a realização adequada das operações.

Devido a problemas na forma de como o compilador utilizado trabalha, foi preciso substituir as funções de deslocamento implementadas, originalmente na forma de macro, para funções propriamente ditas. O desenvolvimento deste algoritmo com mais detalhado pode ser encontrado em [Semente, 2011].

27

3.3 AES

O AES (Advanced Encryption Standard, Padrão de Criptografia Avançada) é o algoritmo escolhido pelo governo americano para proteção de dados trafegados por meios digitais [Daemen & Rijmen, 1998]. Anteriormente conhecido por Rijndael, pode utilizar chaves de 128, 192 e 256 bits.

O Algoritmo considera que grupos de 16 bytes formam um "estado" (state), que, em outros termos, é simplesmente uma matriz 4x4 com cada elemento sendo um byte. A partir de então, realiza quatro operações básicas:

 AddRoundKey: cada byte de um estado é combinado com um byte da chave através da operação XOR (OU Exclusivo), bit a bit. A Figura 7 apresenta essa operação;

 SubBytes: uma substituição não-linear, onde cada byte é substituído por outro de acordo com uma tabela lookup, criada de forma aleatória, como visto na Figura 8;  ShiftRows: os bytes de cada linha sofrem um deslocamento cíclico de 1 byte na

segunda linha, 2 bytes na terceira linha e 3 bytes na quarta linha, como visto na Figura 9;

 MixColumns: cada coluna do estado a(x) é combinada de acordo com uma matriz conhecida c(x) 4x4, que multiplicada pelas colunas do estado retorna uma nova coluna para o estado resultante b(x), como visto na Figura 10. A operação é inversível, bastando multiplicar as colunas do estado b(x) por uma matriz d(x). O resultado será o estado original a(x).

28

Figura 7 - Operação AddRoundKey do Cifrador AES.

Fonte: Elaborado pelo autor.

Figura 8 - Operação SubBytes do Cifrador AES.

Fonte: Elaborado pelo autor.

Figura 9 - Operação ShiftRows do Cifrador AES.

29

Figura 10 - Operação MixColumns do Cifrador AES.

Fonte: Elaborado pelo autor.

De posse dessas quatro operações, o algoritmo pode ser dividido em quatro etapas, onde a terceira etapa é repetida geralmente 20 vezes:

 Etapa 1 - Expansão de chaves baseada em agendamento de chaves Rijndael;  Etapa 2 - Rodada inicial: AddRoundKey;

 Etapa 3 – Rodadas: o SubBytes; o ShiftRows; o MixColumns; o AddRoundKey.

 Etapa 4 - Rodada final (sem mistura de colunas): o SubBytes;

o ShiftRows; o AddRoundKey.

A segurança do algoritmo AES ainda é inquestionável, apesar de várias tentativas de ataque bem sucedidas em uma execução com rodadas inferiores à 20 rodadas, quantidade apropriada de rodadas do algoritmo. Um ataque é considerado eficiente quando a quantidade de operações realizadas para quebrar a segurança e descobrir a chave, é menor do que a quantidade de chaves possíveis. No caso do AES com chaves de 256 bits, o algoritmo com até 11 rodadas já foi quebrado com boa eficiência [Biryukov et al., 2010].

Para realização dos testes, foi utilizado um código na linguagem C, que implementa o algoritmo AES para 8-bits desenvolvido por [Gladman, 2006]. Essa implementação

30

possui algumas otimizações em suas operações, ao invés de realizar as operações SubBytes, ShiftRows e MixColumns separadamente nas etapas 3 e 4, são realizadas apenas duas funções: mix_sub_columns, que realiza simultaneamente as operações SubBytes, ShiftRows e MixColumns; e shift_sub_rows, que realiza as operações SubBytes e ShiftRows. Essas otimizações não alteram a segurança do algoritmo.

3.4 XTEA E XXTEA

Em 1994 Wheeler & Needham (1994) desenvolveu o cifrador em bloco TEA (Tiny Encryption Algorithm, ou Algoritmo de Criptografia Minúsculo), que era notável pela sua simplicidade e poucas linhas de código, mas que logo apresentou uma falha de segurança que tornava o tamanho máximo de sua chave igual 126 bits, tornando tão fácil de quebrá-lo como uma tabela hash ou de dispersão criptográfica, tabelas de substituição criadas por funções de espalhamento.

Logo em 1997 o TEA foi aprimorado com uma extensão, gerando assim o Block TEA (TEA em Bloco), ou como é mais conhecido o XTEA (eXtended TEA, ou TEA Estendido), que possui chaves com tamanho de 128 bits [Needham & Wheeler,1997]. Devido a outros problemas de segurança, o algoritmo foi reestruturado uma segunda vez, criando o Corrected Block TEA (XXTEA, TEA em Bloco Corrigido), ou XXTEA [Wheeler & Needham, 1998].

O XTEA é baseado na clássica rede Feistel, variando apenas a função Feistel, como pode ser observado na Figura 11(a). No algoritmo são utilizadas operações de soma modular e XOR, representadas respectivamente pelo quadrado e pelo circulo na Figura 11(a). A operação de deslocamento à esquerda e a direita também são utilizadas, mas com numero fixo de deslocamentos, 4 bits e 5 bits respectivamente.

Já o XXTEA pode ser considerado uma rede Feistel desbalanceada, cujo bloco de entrada é dividido em N partes, cada parte sendo chamada de XR. Então, a criptografia

31

como observado na Figura 11(b), que apresenta a função Feistel que depende tanto do

XR quanto do XR-1 e XR+1. Também é utilizada a KR, que é aplicada um deslocamento

cíclico a esquerda de 2 bits a cada rodada.

Já foi encontrada uma falha no XXTEA, com quebra de chaves através da criptanálise diferencial, efetuando uma quantidade de consultas de apenas 259 [Yarrkov,

2010]. Esse método é um pouco difícil de ser aplicado na prática em uma RSSF, pois é preciso escolher um texto plano correto para comparação. Os dados gerados por um nó da RSSF são obtidos a cada medição, i.e., não são dados que possam ser conhecidos por um atacante, ficando difícil de realizar este ataque. Mesmo assim, essa quebra pode significar a existência de outras falhas, o que pode indicar a não recomendação do seu uso, mesmo nas RSSFs.

Figura 11 - (a) Fluxograma do XTEA e (b) Função Feistel do XXTEA.

(a) (b)

32

3.5 BLOWFISH E TWOFISH

Os cifradores Blowfish [Schneier, 1993] e Twofish [Schneier et al., 1998] foram desenvolvidos baseados no conceito de rede Feistel, porém, dividindo a informação em quatro partes e realizando operações e permutações entre elas.

O Blowfish opera com bloco de entrada de 64 bits e com tamanho de chave variável, de 44 bits até 448 bits. A sua estrutura pode ser observada na Figura 12 e difere apenas na inclusão da operação de chaves antes do dado ser operado pela função Feistel, alterando significativamente ambos os lados da rede a cada rodada.

Figura 12 - Blowfish: (a) Estrutura de rede Feistel e (b) Função Feistel.

(a) (b)

Fonte: Traduzido de Bruce Schneier (1993).

O Twofish expande o Blowfish, trabalhando com um bloco de dados de 128 bits, dividindo-o em quatro partes iguais de 32 bits, como apresentado na Figura 13.

33

Figura 13 – Twofish.

Fonte: Traduzido de Bruce Schneier et al. (1998).

3.6 SKIPJACK

O Skipjack é um algoritmo criptográfico baseado no conceito de rede Feistel desbalanceada, onde as operações não são realizadas de forma simétricas, utilizando duas funções Feistel diferentes apresentadas na Figura 14 [NSA, 1998]. O Skipjack funciona com blocos de 64 bits, que são divididos em pares de 32 bits que alimentam as funções Feistel. A Figura 3.12 apresenta o esquema criptográfico e de descriptografia do Skipjack.

34

Figura 14 - Funções Feistel do Skipjack.

Fonte: Traduzido de Knudsen & Wagner, 2001.

Figura 15 - Redes Feistel do Skipjack para criptografia e descriptografia.

35

4

PROGRAMAÇÃO GENÉTICA

Observando a natureza, percebe-se a incrível capacidade de adaptação dos indivíduos ao ambiente. Essa adaptação é conseguida por meio do processo de evolução natural, na qual durante um período de tempo, e da reprodução de diversas gerações de

Documentos relacionados