3.5 Am´elioration de l’algorithme de Schnorr
3.5.4 Tailles de bloc sup´erieures
Foi desenvolvido pelo Instituto Nacional de Padrões e Tecnologia dos Estados Unidos (NIST) [RUKHIN 2010] um conjunto de 15 testes para avaliar Geradores de Números Pseudoaleatórios (PRNGs) e Geradores de Números Aleatórios (RNGs). Esses testes têm sido amplamente usados para determinar se uma aplicação particular atende especificações mínimas de aleatoriedade.
A escolha pelo NIST se deu de acordo com algumas características importantes como: independência de plataforma, flexibilidade, extensibilidade, versatilidade, portabilidade, ortogonalidade e eficiência, termos detalhados a seguir.
Independência de plataforma: o código-fonte foi escrito em ANSI C. Entretanto, algumas modificações podem ser necessárias, dependendo da plataforma-alvo e do compilador
Flexibilidade: o usuário pode introduzir livremente suas próprias rotinas de software matemáticos.
Extensibilidade: novos testes estatísticos podem ser incorporados ao conjunto existente.
Versatilidade: o conjunto de testes é útil na realização de testes para PRNGs, TRNGs e algoritmos criptográficos.
Portabilidade: com pequenas alterações, o código fonte pode ser portado para diferentes plataformas. Ele já foi portado para WinXP executando o compilador Visual Studio 2005 e para o Linux (Ubuntu) usando o compilador gcc.
Ortogonalidade: um conjunto diversificado de testes é fornecido, desde cálculos muito simples como encontrar a quantidade de zeros e uns, até calcular a transformada rápida de Fourier (FFT), para proporcionar maior abrangência na verificação de aleatoriedade, e suprir os relatórios com resultados mais consistentes. Eficiência: algoritmos com complexidade linear em tempo e espaço foram utilizados sempre que possível.
Cada um dos 15 testes, possui propósitos específicos que mostraremos a seguir de forma resumida, mas que podem ser explorados na sua íntegra em [RUKHIN 2010].
1. Frequency test (Monobit) é o primeiro teste realizado. Seu foco é a observação da quantidade de zeros e uns ao longo de uma sequência inteira, e assim determinar se o número deles é aproximadamente o mesmo, o que é esperado de uma sequência verdadeiramente aleatória. Se houver reprovação neste teste, a análise dos testes seguintes pode ser descartada.
2. Frequency Test within a Block tem como objetivo avaliar o número de uns (1s) dentro de blocos com comprimento de B bits (B>1). Assim esse teste determina se a frequência de uns (1s) em um bloco de B bits é aproximadamente B/2, como é de se esperar sob uma suposição de aleatoriedade.
3. Cumulative Sums Test tem como objetivo determinar se a soma cumulativa das sequências parciais que ocorrem na sequência testada, é demasiada grande ou demasiada pequena, em relação ao comportamento esperado dessa soma cumulativa para uma sequência aleatória.
4. Runs Test avalia o número total de séries na sequência, onde uma série é uma sequência ininterrupta de bits idênticos. Uma série de comprimento K consiste exatamente K bits idênticos, e é limitada antes e depois com um bit do valor oposto.
O propósito deste teste é determinar o número de sequências de uns e zeros de vários comprimentos, e verificar se atende os padrões esperados para uma sequência aleatória.
É calculado a proporção de uns esperado, de acordo com o tamanho da sequência, ou seja esse teste determina se as oscilações entre os zeros
e uns da sequência transcorre de forma rápida ou lenta, muitas oscilações indicam que ocorreram um menor número de sequências ininterrupta de uns ou zeros, e desse modo, em condições melhor para passar no teste.
5. Longest Runs Test identifica a série mais longa de uns dentro de blocos B-bit. O objetivo deste teste é determinar se o comprimento da série mais longa de uns (1s) dentro da sequência testada é consistente com o comprimento da série mais longa de uns a qual poderia ser esperada numa sequência aleatória. Esse teste leva em consideração do tamanho da sequência, para determinar o tamanho do bloco, e assim, definir as ocorrências de uns dentro de cada bloco B-bit, e identificar se está dentro do esperado, valor calculado no próprio teste.
6. Rank Test tem como objetivo, calcular o grau de sub-matrizes disjuntas de toda a sequência e verificar a dependência linear entre substrings de comprimento fixo da sequência original.
7. FFT Test (Transformada Discreta de Fourier) tem como foco calcular as alturas de pico da sequência na transformada discreta de Fourier, detectar características periódicas (i.e. padrões repetitivos que estão próximos um do outro) na sequência testada, o que indicaria um desvio, ausência de aleatoriedade.
8. Non-overlapping Template Matching Test tem como foco calcular o número de ocorrências de sequências de destino pré-especificadas. O propósito do teste é detectar geradores que produzem muitas ocorrências de um dado padrão não periódico.
9. Overlapping Template Matching Test verifica a correspondência de modelos sobrepostos e calcula o número de ocorrência de cadeia destino pré-especificada. No caso dos testes Non-overlapping e Overlapping uma janela B-bit é usada para procurar um bloco B-bit específico. Se o padrão não for encontrado, a janela desliza sua posição um bit. Se o padrão é encontrado, a janela é resetada para o bit após o padrão encontrado, e a pesquisa continua. A diferença entre os testes é que, no caso do Overlapping, quando o padrão é encontrado, a janela desliza somente um bit, antes de retomar a pesquisa.
10. Universal Test verifica se o número de bits entre do segmento de inicialização coincidem com os padrões do segmento para teste. O propósito do teste é detectar se uma sequência pode ou não ser comprimida sem perder informações. Uma sequência que pode ser comprimida é considerada não aleatória.
11. Approximate Entropy Test calcula a frequência de todos os possíveis padrões com tamanhos de m bits sobrepostos em toda a sequência, compara a frequência de blocos sobrepostos de dois comprimentos consecutivos adjacentes (m e m+1).
12. Random Excursions Test tem como foco calcular o número de ciclos que acontece em uma sequência de soma cumulativa aleatória, em k visitas exatamente, ou seja determinar se o número de visitas a um estado particular dentro de um ciclo se desvia do que se esperaria de uma seqüência aleatória. Este teste é na verdade uma série de oito testes (e conclusões), um teste e conclusão para cada um dos estados: -4, -3, -2, -1 e +1, +2, +3, +4.
13. Random Excursions Variant Test o objetivo é detectar desvios na quantidade total de vezes que um estado particular é visitado. Este teste possui uma série de 18 testes.
14. Serial Test tem o propósito de calcular a frequência de todos os possíveis padrões de B-bits, sobrepostos em toda a sequência, e determinar se o número de ocorrências dos padrões de sobreposição de 2 mm é aproximadamente o mesmo que seria esperado para uma sequência aleatória.
15. Linear Complexity Test tem como foco calcular o comprimento de um registrador de deslocamento com retroalimentação linear (LFSR) capaz de gerar tal sequência, e determinar se a sequência é ou não complexa o suficiente para ser considerada aleatória. As sequências aleatórias são caracterizadas por LFSR mais longos, já para um LSFR demasiadamente curto implica em não aleatoriedade.
Entre os 15 testes do NIST, há alguns que se dividem em subtestes, gerando um total 188 resultados a serem analisados, conforme Tabela 4.1, que exibe na primeira coluna o Número de cada teste, na coluna dois os nomes dos 15 testes,
e na coluna Quantidade de testes e subtestes o número referente a quantidade de cada um.
Tabela 4.1 Quantidade de testes e subtestes que compõem a bateria de testes do NIST
No decorrer de nossas investigações, percebemos que alguns parâmetros, referentes a alguns testes, necessitavam de ajustes. Assim foi necessário explorar cada um deles e adequar os parâmetros (Tabela 4.2) para que os resultados fossem mais corretos e confiáveis.
Outros parâmetros básicos de configuração dos testes são recomendados para se obter resultados mais confiáveis, como o fornecimento de pelo menos 55 sequências de pelo menos um milhão de bits cada uma. Neste trabalho, optamos por avaliar 100 sequências de um milhão de bits para facilitar a interpretação e aumentar a confiabilidade dos resultados. Cabe ressaltar que os parâmetros da Tabela 4.2, foram ajustados de acordo com o tamanho da sequência escolhida 106 e demais
Tabela 4.2 Tamanho dos blocos adotados em alguns dos testes do NIST
Por fim, após o aprendizado sobre os testes, a instalação dos programas e os ajustes dos parâmetros, iniciamos a etapa de execução dos programas, os quais nos forneceram uma série de relatórios. Entretanto, para análise dessas informações o próprio NIST provê uma rotina analítica para facilitar a interpretação desses resultados. O trabalho de [MARTON 2015] fornece caminhos para ajudar na interpretação desses relatórios.
Um arquivo denominado finalAnalysisReport.txt é gerado quando o teste estatístico é concluído, contendo um resumo dos resultados representados em uma tabela. Para melhor explicar os resultados produzidos pelos testes, toma-se como exemplo parte de um dos relatórios emitidos pelo NIST, exposto na Figura 4.1.
The minimum pass rate for each statistical test with the exception of the random excursion (variant) test is approximately = 96 for a sample size = 100 binary sequences. The minimum pass rate for the random excursion (variant) test is approximately = 53 for a sample size = 56 binary sequences.
Observa-se que a primeira linha do relatório finalAnalysisReport.txt é composta pelo título do relatório, seguido pelo nome do arquivo que contém os dados. As linhas na sequência correspondem aos testes (ou subtestes). Os valores nas colunas C1, C2, ..., C10 representam o número de p-values2 referentes aos intervalos
[0.0, 0.1[ , [0.1, 0.2[ , . . . , [0.9, 1.0[ (fechados à esquerda e abertos à direita). Na primeira linha de dados, por exemplo, das 100 sequências analisadas no teste Frequency, 15 delas tiveram seus valores p-value alocados no intervalo [0.7, 0.8[ . Já no teste FFT, todas as 100 sequências tiveram um p-value no primeiro intervalo entre 0 e 0.1, denotando uma distribuição inadequada de valores e, portanto, um mau comportamento do ponto de vista de aleatoriedade.
Além do número de sequências aleatórias aprovadas nos testes, os relatórios fornecem também um valor estatístico p-value (teste de hipótese nula indicado nos relatórios como P-VALUE) para melhor qualificar cada resultado.
Segundo análise de Marton et al. [MARTON 2015], o valor de P-VALUE pode ser interpretado como a probabilidade de um gerador de números aleatórios perfeito produzir sequências com qualidade pior ou igual às sequências analisadas. Logo, quanto mais alto for esse valor, maior a probabilidade de que a sequência seja melhor do que uma gerada por um gerador de números aleatórios perfeito.
A coluna P-VALUE indica o quão uniformemente distribuídos estão os p- values nos intervalos acima descritos. Dessa forma, entende-se que uma boa sequência aleatória deveria apresentar uma distribuição mais uniforme nos intervalos, o que resultaria em um valor de P-VALUE próximo de um.
Notamos que para cada um dos 15 testes do NIST acima listados são produzidos dois resultados: um indica o número de sequências (dentre as 100 submetidas) que foram aprovadas no referido teste (Proportion Statistical) e, de acordo com valores presentes no próprio relatório, indica se o teste está ou não aprovado em proporção. Outro resultado (coluna P-VALUE) mostra o quão bem distribuída está cada sequência entre os intervalos de C1 a C10. Assim, de posse dessas informações, se faz a análise do comportamento das sequências aleatórias em relação a cada teste.
2 p-value ou valor-p é a probabilidade de significância de uma amostra, ou seja, é o menor nível de significância
Para reduzir o número de linhas apresentado pelo relatório do NIST (mais de 188 linhas) e poder realizar uma análise mais simplificada, fizemos uma primeira consolidação e reduzimos para 15 linhas o novo relatório, como é apresentado Tabela 4.3. Para isso, adotamos o valor médio dos subtestes, resultando, assim, em apenas 15 valores para cada sequência testada. Iniciamos os primeiros testes, com a coleta realizada por linha/plano e coluna e obtivemos resultados que serão descritos mais adiante.