• Nenhum resultado encontrado

Geração e avaliação de números pseudo-aleatórios para aplicações criptográficas

N/A
N/A
Protected

Academic year: 2021

Share "Geração e avaliação de números pseudo-aleatórios para aplicações criptográficas"

Copied!
8
0
0

Texto

(1)

Geração e avaliação de números pseudo-aleatórios

para aplicações criptográficas

Jonas Tadeu Torquato Arioli

Resumo—Cada vez mais a criptografia esta presente no dia a dia das pessoas. E uma importante peça para que os dados sejam mantidos em sigilo são os geradores dos números aleatórios. Só que em muitas vezes as escolhas desses geradores são feitas ao acaso.

Esse trabalho descreve a geração e a avaliação desses geradores de números pseudo-aleatórios, mostrando uma recomendação para o desenvolvimento de um gerador. É descrito também alguns testes que devem ser executados para avaliar o quão bom são as sequencias aleatórias geradas.

I. INTRODUÇÃO

A geração de números aleatórios é essencial para a criptografia. Em diversos momentos surge a necessidade de se inserir um numero não determinístico, seja para autenticação, geração de assinaturas digitais, na geração de chaves.

Em muitas vezes se faz o uso de geradores de números pseudo-aleatorios, para produzir uma sequencia desses números. Como se utiliza um algoritmo iterativo para gerar esse sequencia de números pseudo-aleatorios, é de vital importância garantir o uso de geradores que simulam uma boa sequencia.

Caso se utilize um gerador fraco dessa sequencia de números, uma variedade de ataques podem ser utilizados por um atacante para descobrir a geração desses números, e assim conseguir quebrar a criptografia do protocolo.

Para evitar esse tipo de falha, é importante garantir a aleatoriedade. E com isso, alguns testes estatísticos foram projetados para essa analise.

Uma serie de frameworks foram desenvolvidos para a analise dessa aleatoriedade dos numeros.

Garantindo o quão forte é o gerador a ser usado no protocolo de criptografia.

Antes dos testes serem aplicados, é importante ter um bom algoritmo para a geração dessa sequencia de numeros pseudo-aleatórios. E existem uma serie de geradores que podem ser utilizados.

Nesse trabalho, será apresentado as recomendações do NIST (National Institute of Standard and Technology) para desenvolver um gerador deterministico de bits pseudo-aleatorios.

Será também apresentado a bateria de testes que o NIST desenvolveu para a avaliação dos geradores.

Por fim, serão mostrados alguns possíveis ataques aos geradores de numeros pseudo-aleatórios e algumas diretrizes para se usar um gerador de numeros pseudo-aleatórios vulneravel.

II. GERADORESDENUMEROSPSEUDO ALEATORIOS

Um gerador de números pseudo-aleatorios ideal deve produzir uma sequencia infinita de números, na qual eles não são correlacionados, e que eles sejam uniformemente distribuídos.

Os geradores usam uma ou mais entradas, que servem para se criar a semente do gerador. A partir dessa semente, um processo iterativo é rodado para produzir as saídas dessa funções determinísticas.

O NIST, na publicação especial 800-90A [1], faz uma recomendação para um gerador determinístico de bits aleatórios. Essa recomendação será descrita nos parágrafos seguintes.

É importante nesse contexto entender o conceito de Entropia. Para que tenhamos

(2)

segurança computacional suficiente, os números pseudo-aleatórios devem ser altamente imprevisíveis. Essa previsibilidade dos números pode ser quantificada com uma medida chamada Entropia.

A entropia é, de forma bastante simplificada, uma medida do número de maneiras em que um sistema pode ser organizado, sendo na verdade uma medida da aleatoriedade do sistema.

Os geradores de bits aleatórios podem ser classificados em duas classes, os não determinísticos e os determinísticos. Geradores de bits aleatórios não determinísticos dependem de uma fonte física de aleatoriedade que é imprevisível. Geradores de bits aleatórios determinísticos (DRBG) são construídos utilizando um algoritmo para gerar um fluxo de bits partindo de uma semente. DRBGs são dito pseudo-aleatório porque a se consegue prever a saida, quando o estado interno é conhecido.

As propriedades que um DRBG deve expor são: a robustez suportada, o tamanho da saída em bits, resistência à previsão, numero máximo de bits por requisição, a mínima entropia requerida, o tamanho da semente, e o número de requisições entre reseeds. Estes parâmetros governam as margens de segurança de um DRBG. Cada um destes parâmetros é dependente do algoritmo implementado.

A primeira operação que um DRBG deve suportar é a inicialização. A função de inicialização deve ser configurada com entradas diferentes de tal forma que seja gerada uma semente aleatória a cada vez. O gerador também pode suportar uma entrada para string personalizada, que pode ser, pro exemplo, o numero de serie do equipamento. Outras duas fontes do gerador são: nonce e a entropia. A entropia de entrada deve ser capaz de fornecer, pelo menos, tantos bits aleatórios quanto necessário para satisfazer a força de segurança requerida.

A segunda função que um DRBG deve ter é o reseeding. Cada semente é boa para um número limitado de gerações de bits. Após esse número, é precisa propagar novamente o DRBG com novas entradas. Durante esse processo, uma nova

entropia será requisitada para gerar uma nova semente.

Os valores de semente utilizados na inicialização e no reseed não devem ser reutilizado em outro DRBG ou utilizado mais do que uma vez no mesmo DRBG. Além disso, a semente não deve ser utilizada para outros fins, como valores de domínio, geradores de números primos, etc. Se não a força do DRBG poder ser reduzidas, expondo partes do estado interno.

A terceira função que um DRBG precisa ter é a geração dos bits aleatórios. Ele irá usar o estado interno para criar quantos bits forem solicitados até ao tamanho máximo permitido pelo algoritmo.

A última operação que um DRBG precisa ter é uma função de limpeza. Esta função é usada para remover a inicialização do DRBG. A função de limpeza deve limpar o estado interno, para reduzir a probabilidade de que o estado interno possa ser comprometido.

A SP800-90 também faz recomendações sobre o algoritmo que gera os números aleatórios. Ela expõe três classes de algoritmos criptográficos: funções Hash, cifras de blocos e Curvas Elípticas.

Nas implementações com funções hash, pode se escolher entre as funções 1, 224, SHA-256, SHA-384, SHA-512. O comprimento da semente é determinado a partir do tamanho do bloco da função hash (128 para 384 e SHA-512, 64 para SHA-1, SHA-224, SHA-256). A semente criada durante a inicialização é uma concatenação da entropia, do nonce, e da string personalizada. Essa concatenação é então passada na função hash. O estado interno do DBRG consiste de um contador, uma variável V que é inicializado para a semente, e uma constante C que é inicializada com a saída do hash da semente e um valor constante. A saída do DRBG é a variável V que passa por uma função hash. V é então atualizado com o hash de V concatenado com um valor constante, adicionado ao valor antigo de V. O contador é atualizado em cada chamada da geração dos bits. O Reseeding consiste em fazer passar o V existente, juntamente com a nova entrada de entropia, e uma constante por uma função hash, repetindo a inicialização de C e redefinindo o contador.

(3)

A especificação também permite HMACs para serem utilizados em vez de funções hash. O algoritmo varia ligeiramente. A constante C é substituída por uma chave que é atualizada quando ocorre a inicialização ou reseed. A saída do gerador é o valor de V que passa através da HMAC. V é então atualizado e utilizado para a iteração seguinte.

DRBGs baseados em cifras de bloco podem usar qualquer algoritmo de codificação de bloco aprovado, conforme especificado pelo SP800-38A. O DRBG deve sempre usar a mesma cifra de bloco e o mesmo comprimento de chave para todas as suas operações. Podem ser usados os cifradores 3 Key TDEA, AES-128, AES-192 e AES-256. O comprimento da semente para uma DRBG baseado em cifras de bloco é o comprimento da chave mais o comprimento da saída. A semente é gerada usando a cifra de bloco na entropia, no nonce, e na string personalizada. A entrada para o bloco deve ser exatamente o número de bits do comprimento da semente. A SP800-90 define que qualquer coisa menor que esse tamanho deve ser completada com 0s. O estado interno consiste de uma variável V, a chave, e um contador para o reseed. A chave e a variavel são inicializados com tudo 0, e são de forma iterativa construídos usando a cifra de bloco até que todos bits da semente sejam utilizados. A chave é, então, definida como os bits mais à esquerda da semente, e V são os bits mais à direita da semente. O reseed funciona da mesma maneira, só que usando o valor atual da chave e de V, em vez de 0. Para gerar os bits, o DRBG soma 1 ao V e criptografa esse valor usando a chave e V.

A terceira classe de DRBGs abrange os projetos usando Curvas Elípticas Duplas. O comprimento da semente nessa implementação deve ser de pelo menos 256 bits de comprimento. A segurança máxima disponível é determinada pela curva selecionada. A semente é criada a partir do hash da entropia, do nonce e da string personalizada. A função de reseed usa o valor atual da semente, deslocada a esquerda até que seja um múltiplo de 8, a entropia e uma entrada adicional opcional, e então é feito um hash sobre esses valores concatenados. Para gerar os bits, a semente passa através da função curva elíptica duas vezes, cada vez multiplicada por um dos dois pontos na curva.

A saída é o valor truncado para o tamanho de bits da saída do gerador.

Além disso, o gerador deve ter testes de validação. Se qualquer um dos testes de falhar, o DRBG não deve permitir qualquer saída. Durante o teste, o gerador deve soltar um valor conhecido, para verificar o funcionamento do gerador.

Um dos principais problemas na criação de um DRGB é encontrar uma boa fonte de entropia. Para isso, deve se usar fontes verdadeiramente aleatórias, para se ter uma boa sequencia de bits pseudo-aleatórios.

A figura 1 mostra um modelo funcional do gerador.

Figura 1 Modelo Funcional de um DRGB

III. AVALIAÇÃODOSNUMEROS PSEUDO-ALEATORIOS

Devido a importância dos numero pseudo-aleatorios, foram desenvolvidos testes estatísticos para avaliar a aleatoriedade dos dados gerados.

Existem vários conjuntos de testes estatísticos que podem ser aplicados ao geradores, para ver o quão bom é esse gerador que se deseja usar.

Podemos citar o DIEHARD, o Crypt-X, e o NIST Statistical Test Suite [2].

O framework de testes do NIST, que foi publicado como SP 800-22, será aqui detalhado. Esse framework consiste de um pacote com 15 testes estatísticos para testar a aleatoriedade dos dados.

Os testes são baseado no teste de hipótese, na qual se quer determinar se uma afirmação sobre

(4)

uma característica da população é verdadeira ou não. No nosso caso, determinar se a sequencia é aleatória.

Como não se consegue testar toda a população, dois erros podem acontecer: erro do tipo I (Falso positivo) e erro do tipo II (Falso negativo). O primeiro é rejeitar a hipótese quando ela é verdadeira, sendo α a probabilidade de cometer esse erro, conhecido como nível de significância. Já o segundo é aceitar a hipótese quando ela é falsa.

Os testes que o framework do NIST executa nas sequencias pseudo-aleatórias são:

 Frequência: determinar se tem mais zero ou um.

 Frequência dentro de Blocos. A sequencia em divida em bloco de tamanho m. O propósito do teste é determinar se a frequência de 1’s em cada um dos blocos é aproximadamente M/2, como seria esperado caso houvesse aleatoriedade.

 Somas cumulativas, que determina se tem muito 0’s ou 1’s no inicio da sequencia.

 Mais longa corrida de 1, na qual se detecta o desvio da distribuição de corridas longas de 1.

 Corridas. É conhecida corrida uma sequencia de bits idênticos. Uma grande (pequena) corrida indica que a oscilação do fluxo de bits é muito rápida, ou muito lenta.

 Posto para matrizes binárias, onde se analisa o posto de sub-matrizes disjuntas de uma sequência de bits a fim de verificar se há dependência linear entre sub-strings de comprimentos pré-fixados, sub-strings estas oriundas da sequência original.

 Espectral para transformação discreta de Fourier, que tenta se detectar características periódicas no fluxo de bits.

 Não sobreposição de padrão, que detecta a ocorrência de modelos não periódicas.

 Sobreposição de padrão, que testa o numero de ocorrências de corridas de 1 em blocos de m-bits.

 Estatística universal de Maurer, detecta se a sequência pode ou não ser significativamente comprimida sem perda de informação. Uma sequência significativamente comprimível é considerada ser não aleatória.

 Complexidade linear, que visa determinar se uma sequência é complexa o suficiente para ser considerada aleatória.

 Serial, que detecta a distribuição não uniforme de palavras m de comprimento.

 Entropia aproximada, testa a distribuição não uniforme de palavras m de comprimento. Valores pequenos de EnAp(m) implicam forte regularidade.

 Excursões aleatórias verifica o desvio da distribuição do número de visitas de um passeio aleatório para um determinado estado.

 Variante de excursões aleatórias, que detecta o desvio em relação à distribuição do número total de visitas (em muitos passeios aleatórios) para um determinado estado.

Para se fazer uma analise dos resultados de um gerador de números pseudo-aleatorios, o NIST recomenda essas estratégia:

 Selecionar um gerador para ser testado.

 Gerar a sequencia binária. Para uma sequencia de comprimento n, criar um conjunto de sequencias binárias e salvar em um arquivo.

 Executar os testes estatísticos.

 Avaliar o P-valor. Para cada teste executado, um P-valor será fornecido.

 Avaliar passou/falhou. Com o P-valor de cada teste, comparar com o nível de significância fixo. Esse nível de significância serve para indicar que uma certa percentagem de P-valor são esperados falhar. Por exemplo, se o nível de significância escolhido é de 0,01 (isto é, α = 0,01), cerca de 1% das sequências são esperados para falhar. Uma sequência passa

(5)

um teste estatístico, sempre que o P-valor ≥ α e falha caso contrario.

Com isso, se consegue avaliar se o gerador de números pseudo-aleatorios produz uma boa sequencia para ser usada em algoritmos criptográficos.

IV. LIMITACAODONITSSP800-22 O NITS SP800-22 é o estado da arte nos testes estatístico para determinar um bom gerador de números pseudo-aleatorios, mas ele tem suas limitações. Wang [3], verificou que por esses casos de teste, geradores fracos, como o gerador congruente linear da linguagem C passava por todos os testes. Quando na verdade esse gerador é considerado fraco e não deveria passar. Outra detecção que ele viu foi que o Debian openSSL, que foi modificado erroneamente, permitindo sequencias previsiveis, também passava nos casos de teste do NIST.

A limitação ocorre devido ao fato do NIST SP800-22 se concentra no desempenho das sequencias individualmente, ao invés de levar em conta os conceitos da indistinguibilidade.

Com isso, Wang propôs técnicas de teste baseados em distancias estatísticas. A abordagem baseada na distância estatística é mais preciso na detecção de desvio e evita erros do tipo II, encontrados nos testes do NIST SP800-22. E a abordagem que ele usou para ilustrar isso foi usando os testes da Lei do Logaritmo Iterado (LIL).

A LIL foi usada, pois as sequencias verdadeiramente aleatórias satisfazem essa lei do logaritmo iterado, então seria racional usar ela para avaliar sequencias pseudo-aleatórias.

Outra definição a ser vista é o principio da indistinguibilidade, que mostra que duas sequencias idênticas podem ser consideradas, estatisticamente, indistinguível. Com isso, a distancia entre elas é desprezível.

A LIL fala que uma boa sequencia pseudo-aleatória deve estar entre [-1,1]. A figura 2 mostra o que seria a distribuição ideal para as sequencias de tamanho n que variam de 226 a 234.

Para se executar o testes, foram geradas 10.000 sequencias de 2GB cada uma. E para cada uma dessas sequencias foi gerado e grafico do LIL e calculada a distancia entre ela e a curva ideal.

Um gerador é considerado bom se as distancias calculadas forem próximos da curva ideal. A figura 3 mostra o grafico para o gerador do Debian openSSL. Como se pode verificar as distancias para a curva ideal é consideravel, sendo considerado um mal gerador de numeros pseudo-aleatorios.

Figura 2 Funções de densidade para as distribuições

Figura 3 Funções de densidade para a distribuição do Debian openSSL

No fim de tudo isso, conseguiu se comprovar que alguns geradores considerado bom pelo NIST, falharam nos testes usando LIL. A tabela 1 ilustra esses resultados.

(6)

Tabela 1 resutlado dos testes NIST SP800-22 e LIL Gerador NIST SP800-22 LIL Resultado esperado Standard C LCG

Passa falha falha

MT19937 passa passa passa

PHP LCG

Falha falha falha

PHP MT19937

Falha falha falha

Debian openSSL

passa falha Falha

Standard openSSL

Passa passa Passa

V. ATAQUES A GERADORES DE NÚMEROS PSEUDO-ALEATÓRIOS

Ataques criptoanalíticos também podem ser aplicados a geradores de números pseudo-aleatórios. Tais ataques podem visar a descoberta da semente, a reprodução das sequências produzidas em um dado intervalo de tempo, a obtenção de saídas passadas do gerador, entre outros.

É essencial analisar a vulnerabilidade dos geradores contra ataques criptoanalíticos. Se há um ataque eficiente para um gerador utilizado em uma dada aplicação criptográfica, é bem possível que a segurança da aplicação possa estar comprometida diante da vulnerabilidade do gerador, não importando a segurança dos demais algoritmos criptográficos utilizados.

Os ataques contra geradores de números pseudo-aleatórios podem ser classificados como:

Ataques Criptoanalíticos Diretos.

Ocorrem quando o atacante é capaz de distinguir entre as saídas do gerador de números pseudo-aleatórios e saídas aleatórias.

Ataques Baseados em Entradas.

Acontecem quando o atacante é capaz de usar algum conhecimento ou controle das entradas do gerador para auxiliar na criptoanálise. Três subcategorias desse ataque são definidas em função do tipo de entrada utilizada: ataques baseados em

entradas escolhidas, repetidas ou conhecidas;

Ataques de Comprometimento de Estado. Neste tipo de ataque, o atacante

utiliza-se das vantagens de um ataque anterior para obter informações sobre o estado interno do gerador. Existem quatro classificações para ataques de comprometimento de estado:

a. Ataque de Retorno. Também conhecido como backtracking attack. Neste tipo de ataque o atacante conhece uma saida e utiliza esta informação para obter os elementos anteriores do estado interno do gerador;

b. Ataque de Comprometimento Permanente. Acontece quando o

atacante recupera um valor e com esta informação é capaz de conhecer estados anteriores do gerador e também prever estados futuros. Este tipo de ataque compromete totalmente a imprevisibilidade do gerador;

c. Ataque de Descoberta Iterativa. Utiliza conhecimento de uma saida e de intervenções na saída do gerador para determinar saidas futuras. Neste tipo de ataque não é necessário que o adversário saiba as saídas do gerador produzidas em um intervalo de tempo, mas é requerido que seja capaz de prevê-las;

d. Ataque Meet-in-the-Middle.

Consiste na combinação de um ataque de descoberta iterativa com um ataque de retorno.

Pode se notar que nem todos os geradores são sucetiveis a ataques. Se a saída do gerador não é conhecida, é difícil praticar esses tipos de ataques. VI. DIRETRIZES AO USAR UM GERADOR DE

NUMEROS PSEUDO-ALEATORIO VULNERAVEL

Nessa sessão, serão propostas algumas formas de proteger o gerador contra ataques.

(7)

1. Uso de uma função hash para proteger

a saída. Pre-processar a saída do gerador

com uma função hash é uma forma de se evitar um ataque de previsibilidade da saída.

2. Fazer um hash da entrada com um

contador ou timestamp antes do uso.

Para prevenir ataques na entrada, as entradas devem passar por um hash, combinado com um timestamp ou com um contador, antes de ser enviado para o gerador.

3. Ocasionalmente gerar um novo estado

inicial. Fazendo reseed constante ajuda

prevenir ataques de previsão dos dados.

4. Prestar atenção nos pontos de entrada e

no arquivo de semente. Um forte gerador

não deve ter seu estado comprometido. Embora não seja possível garantir isso, os projetistas de sistemas deve gastar muito esforço em começar seu gerador de um ponto que não seja possível adivinhar a saída, lidar com arquivos de sementes inteligentemente, etc.

VII. CONCLUSÃO

Para a utilização dos protocolos de segurança, um fator chave é a geração dos números pseudo-aleatórios que se deseja usar. Alguns protocolos de segurança foram quebrados devido a uso de geradores fracos de números pseudo-aleatórios.

Nesse trabalho foram apresentada recomendações para criação de geradores desse números. Também foi descrito como alguns testes que devem ser executados para verificar o quanto aleatório estão os dados, como os casos de testes do NIST.

Não existe nenhuma função “confiavel” para gerar numeros aleatórios, principalmente para ser usado em protocolos de segurança. Sempre faça uma analise dessa função, utilizando testes estatisticos, e conforme os resultados dos testes, pode-se julgar se o gerador é bom para ser utilizado.

Se houver suspeita do gerador ser fraco e não ser possivel utilizar outro, fazer uma combinação com a entrada ou com as saída, usando uma

função hash por exemplo. Assim a saída do gerador ou a entrada do gerador são mascaradas, evitando a previsibilidade da saída.

VIII. TRABALHOSFUTUROS

Pode-se citar como trabalhos futuros o desenvolvimento de novos testes estatísticos para avaliação dos geradores de números pseudo-aleatorios. Como também o desenvolvimento de novos algoritmos geradores desses números.

IX. REFERENCIASBIBLIOGRAFICAS [1] E. Barker e J. Kelsey, “Recommendation for

Random Number Generation Using

Deterministic Random Bit Generators,” NIST, 2014.

[2] A. Rukhin, J. Soto e e. al., “A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications,” NIST, 2010.

[3] Y. Wang, “Statistical Properties of Pseudo Random Sequences and Experiments with PHP and Debian OpenSSL,” Heidelberg: Springer LNCS, 2014.

[4] J. Kelsey, B. Schneider, D. Wagner e C. Hall, “Cryptanalytic attacks on pseudorandom number generators. Lecture Notes in Computer Science,” 1998. [5] A. C. Gonçalves e J. R. Junior, “VERIFICAÇÃO DA ROBUSTEZ DA ALEATORIEDADE DE ALGORITMOS USADOS EM CRIPTOGRAFIA,” anais.ueg.br, 2013.

[6] A. C. D. Resende, “Emprego de testes estatísticos em geradores de números aleatórios para verificação de eficácia de algoritmos criptográficos,” 2012.

(8)

Referências

Documentos relacionados

Objetivo: Pesquisa de intenção de voto do eleitorado do Tocantins para as eleições suplementares de 2018.. Metodologia:

Os Residentes cujas bolsas serão financiadas pela Secretaria da Saúde do Estado da Bahia – SESAB deverão realizar a assinatura do Contrato nos dias 27 e 28/02/2012, na Escola Estadual

A elaboração do cenário de investimento necessário para melhorar o desempenho das cidades catarinenses em relação à sustentabilidade hídrica considerou três fases distintas

Correlação entre a expressão do gene PRV-1 e de genes relacionados à apoptose em leucócitos de pacientes com Trombocitemia Essencial e Mielofibrose.... As

Considerando que o fragmento de texto e as imagens acima têm caráter motivador, redija um texto dissertativo acerca das semelhanças e das diferenças entre os elementos formais

Antiácidos contendo carbonato de magnésio, como BISUISAN ® , devem ser utilizados cuidadosamente em pacientes com dano renal leve a moderado (devido ao risco elevado

O Brasil tem destaque mundial na produção de alimentos. A produção anual de leite em 2016 foi estimada pela Companhia Nacional de Abastecimento - CONAB em 35 bilhões

Defendo que, mesmo canções assinadas 14 pelos dois compositores (Erasmo Carlos e Roberto Carlos) ou feitas por outros (caso, por exemplo, de Meu Pequeno Cachoeiro,