Ir para o conteúdo

CSPRNG

Origem: Wikipédia, a enciclopédia livre.
Categorias de números aleatórios e respectivos geradores (chinês simplificado).

Um gerador de número pseudo-aleatório criptograficamente seguro (CSPRNG, na sigla em inglês) ou gerador de números pseudoaleatórios criptográfico (CPRNG, na sigla em inglês)[1] é um gerador de números pseudoaleatórios (PRNG) com propriedades que o torna adequado para o uso na criptografia.

Muitos aspectos da criptografia requerem números aleatórios, como por exemplo:

A "qualidade" da aleatoriedade necessária para essas aplicações varia. Por exemplo, criar uma nonce para algum protocolo requer apenas singularidade. Por outro lado, a geração de uma chave mestre requer mais qualidade, tal como entropia. E no caso de cifras de uso único, a garantia da teoria da informação de sigilo perfeito apenas se mantém caso a geração da chave utilizar uma fonte verdadeiramente aleatória com alta entropia.

Idealmente, a geração de números aleatórios em CSPRNGs usa entropia para obter fontes de alta qualidade, que podem ser um hardware ou um processo de sistema imprevisível; apesar de correlações inesperadas terem sido encontradas em tais diversos processos ostensivamente independentes. Do ponto de vista da informação teórica, a quantidade de aleatoriedade, a entropia que pode ser gerada, é igual a entropia fornecida pelo sistema. Porém, às vezes, em situações práticas, é necessário mais números aleatórios do que há entropia disponível. Além disso, o processo de extrair aleatoriedade de um sistema em execução pode ser lento na prática. Em tais casos, um CSPRNG pode ser utilizado. Um CSPRNG pode "ampliar" a entropia disponível sobre mais bits.

Requisitos

[editar | editar código]

Os requisitos de um PRNG padrão também são satisfeitos por um PRNG criptograficamente seguro, porém, não se pode dizer o mesmo do inverso. Os requisitos do CSPRNG podem ser divididos em dois grupos: primeiramente, eles devem passar por testes de aleatoriedade estatísticos; e segundo, eles devem ser resistentes a ataques, mesmo quando parte de seu estado inicial ou em execução chegue ao conhecimento do atacante.

  • Todo CSPRNG deve satisfazer o teste do próximo bit. Isto é, dados os primeiros k bits de uma sequência aleatória, não há algoritmo de tempo polinomial capaz de predizer o (k+1)-ésimo bit com probabilidade de sucesso maior que 50%. Andrew Yao provou em 1982 que um gerador que passe nesse teste, passará em qualquer outro teste estatístico de tempo polinomial para aleatoriedade.[2]
  • Todo CSPRNG deve resistir a "extensões de compromisso de estado". Caso parte ou o todo de seus estados seja revelado (ou predito corretamente), deve ser impossível de reconstruir o fluxo de números aleatórios antes dessa revelação. Além disso, caso haja uma entrada de entropia em execução, deve ser inviável utilizar-se de qualquer conhecimento sobre o estado da entrada para predizer condições futuras sobre o estado do CSPRNG.
Exemplo: Se o CSPRNG sob consideração produzir uma saída computando bits de π em sequência, começando de alguém ponto desconhecido dessa expansão binária, ele pode satisfazer o teste do próximo e ser considerado estatisticamente aleatório, já que π aparenta ser uma sequência aleatória. (Isso poderia ser garantido caso π seja um número normal, por exemplo.) Entretanto, esse algoritmo não é criptograficamente seguro; um atacante pode determinar em qual bit de π (i.e. o estado do algoritmo) ele se encontra e será capaz de calcular todos os bits anteriores também.

A maioria dos PRNGs não são adequados para uso como CSPRNGs e não irão satisfazer ambos requisitos. Primeiro, enquanto muitos PRNGs dão saídas aparentemente aleatórias para alguns testes estatísticos, eles não são capazes de resistir a determinados métodos de engenharia reversa. Testes estatísticos especializados podem ser especialmente melhorados para mostrar que esses números aleatórios não são verdadeiramente aleatórios. Segundo, para a maioria dos PRNGs, quando o seu estado atual é revelado, todos os números aleatórios passados podem ser calculados, permitindo a um atacante ler todas as mensagens passadas, bem como as futuras.

CSPRNGs são projetados intencionalmente para resistir a esse tipo de criptoanálise.

Algumas informações básicas

[editar | editar código]

Santha e Vazirani provaram que vários fluxos de bit com baixa aleatoriedade podem ser combinados para produzir um fluxo de bit quase-aleatório de melhor qualidade.[3] Antes ainda, John von Neumann provou que um simples algoritmo é capaz de remover quantidade considerável de viés em qualquer fluxo de bits,[4] que pode ser aplicado em cada fluxo de bit antes de usar qualquer variante do projeto de Santha-Vazirani. Essa área de atuação é chamada de extração de entropia e é objeto de pesquisas em atividade (e.g., N Nisan, S Safra, R Shaltiel, A Ta-Shma, C Umans, D Zuckerman).

Na discussão abaixo, os projetos de CSPRNG são divididos em três classes: 1) as baseadas em primitivas criptográficas como cifras e hashes criptográficos, 2) as baseadas em problemas matemáticos considerados difíceis, e 3) projetos de propósito-especial. Esse último, por muitas vezes introduz entropia adicional quando disponível e , a rigor, não são geradores de números aleatórios "puro", pois suas saídas não são determinadas pelo seus estados iniciais. Essa adição pode prevenir ataques mesmo que o estado inicial seja comprometido.

Projetos baseados em primitivas criptográficas

[editar | editar código]
  • Uma cifra de bloco segura pode ser transformado em um CSPRNG executando-o em modo contador. Isso pode ser feito, escolhendo uma chave aleatória e encriptando-a junto com 0, depois com 1, depois com 2, etc. O contador também pode começar em um número arbitrário diferente de 0. Assumindo que uma cifra de bloco de n-bit, a saída pode ser distinguida de um dado aleatório após, aproximadamente, 2n/2 blocos desde, seguindo o paradoxo do aniversário, blocos em colisão devem se tornar mais prováveis a partir desse ponto, onde uma cifra de blocos em modo CTR nunca dará como saída blocos idênticos. Para cifras de bloco de 64 bits, isso limita o tamanho da saída segura para alguns gigabytes, com blocos de 128 bits, a limitação é grande o suficiente para não afetar aplicações típicas.
  • Um hash criptograficamente seguro de um contador também pode atuar como um bom CSPRNG em alguns casos. Nesse caso, é necessário que o valor inicial do contador seja aleatório e secreto. Entretanto, há poucos estudos desses algoritmos utilizados dessa maneira, e pelo menos alguns autores alertam contra este uso.[5]
  • A maioria das cifras de fluxo funcionam através da geração de fluxo de bits pseudoaleatórios que são combinados (quase sempre com uma operação XOR) com o purotexto; executando a cifra em modo contador irá retornar um novo fluxo pseudoaleatório, possivelmente com um período mais longo. A cifra só pode ser segura se o fluxo original for um bom CSPRNG, apesar desse nem sempre ser o caso (veja a cifra RC4). Novamente, o estado inicial deve ser mantido em segredo.

Projetos em teoria dos números

[editar | editar código]
  • O algoritmo Blum Blum Shub possui uma prova de segurança baseado na dificuldade do problema dos resíduos quadráticos (veja lei da reciprocidade quadrática). Como a única maneira conhecida de resolver esse problema é através da fatoração dos módulos, e, geralmente, é considerado que a dificuldade da fatoração de inteiros fornece uma prova segura condicional para o algoritmo Blum Blum Shub. Entretanto, esse algoritmo é muito ineficiente e por isso, impraticável, exceto quando medidas de extrema segurança são necessárias.
  • O algoritmo Blum-Micali possui uma prova de segurança incondicional baseada na dificuldade do problema do logaritmo discreto, que também é muito ineficiente.
  • Daniel Brown da Certicom escreveu em 2006 uma prova de segurança para Dual_EC_DRBG, baseada na suposta dificuldade do problema decisional Diffie-Hellman, o problema do logaritmo-x, e o problema do ponto truncado. A prova de 2006 assume, explicitamente, um outlen menor que o do Dual_EC_DRBG padrão, e que o P e o Q no Dual_EC_DRBG padrão (que, em 2013, foi revelado que a NSA teria introduzido um backdoor nesse sistema) são substituídos por valores que não possuem essa falha de backdoor.

Projetos especiais

[editar | editar código]

Há diversos PRNGs práticos que foram projetados para ser criptograficamente seguros, como:

  • o algoritmo Yarrow que tenta avaliar a qualidade entrópica de suas entradas. Yarrow é utilizado em FreeBSD, OpenBSD e Mac OS X (e também em /dev/random).
  • o algoritmo Fortuna, o sucessor do Yarrow, que não tenta avaliar a qualidade entrópica de suas entradas.
  • a função CryptGenRandom fornecida pela CryptoAPI da Microsoft.
  • ISAAC baseado em uma variante da cifra RC4.
  • Algoritmo evolutivo baseado no Statistical Test Suite da NIST.[6][7]
  • arc4random, uma API, originária do OpenBSD, que fornece acesso a diversos geradores de números aleatórios baseados em RC4.
  • o DRBG da AES-CTR é frequentemente utilizado como um gerador de números aleatórios em sistemas que utilizam a encriptação AES.[8][9]
  • o padrão ANSI X9.17 (Financial Institution Key Management (atacado)), que foi adotado como um padrão FIPS também. Ele recebe como entrada um pacote de chaves k numa variação do 3DES (ao invés de utilizar três chaves distintas, a terceira é igual a primeira) e (o valor inicial) de uma semente aleatória s de 64 bits.[10] Toda vez que um número aleatório é requisitado, ele:
    • Obtém a data/hora atual D com a precisão máxima possível.
    • Computa um valor temporário t = TDEAk(D)
    • Computa um valor aleatório x = TDEAk(s ⊕ t), onde ⊕ denota ou exclusivo bit a bit.
    • Atualiza a semente s = TDEAk(x ⊕ t)
Obviamente, essa técnica é facilmente generalizada por qualquer bloco de cifra; AES tem sido sugerido (Young and Yung, op cit, sect 3.5.1).

Diversos CSPRNGs foram padronizados. Por exemplo,

  • FIPS 186-2
  • NIST SP 800-90A: Esse padrão possui três CSPRNGs incontroversas chamadas Hash_DRBG, HMAC_DRBG, e CTR_DRBG; e uma PRNG chamada Dual_EC_DRBG que foi mostrada não ser criptograficamente segura e provavelmente possui uma backdoor cleptográfica da NSA.
  • ANSI X9.17-1985 Appendix C
  • ANSI X9.31-1998 Appendix A.2.4
  • ANSI X9.62-1998 Annex A.4, obsoleta pelo ANSI X9.62-2005, Annex D (HMAC_DRBG)

Uma boa referência é mantida pela NIST.

Existem, também, diversos padrões para testes estatísticos de novos projetos de CSPRNG:

Backdoor da NSA no PRNG Dual_EC_DRBG

[editar | editar código]

The Guardian e The New York Times relataram que a National Security Agency (NSA) inseriu uma PRNG no NIST SP 800-90A que teria um backdoor que permitiria a NSA decriptar qualquer material prontamente, que teria sido encriptado com a ajuda do Dual_EC_DRBG. Ambas as reportagens relataram[11][12] que, que como especialistas em segurança já suspeitavam,[13] a NSA tem introduzido fraquezas no CSPRNG padrão 800-90; isso foi confirmado pela primeira vez por um dos documentos confidenciais vazados pelo The Guardian por Edward Snowden. A NSA trabalhou secretamente para ter a sua própria versão do projeto da norma de segurança da NIST, aprovada em todo mundo para uso em 2006. O documento vazado afirma que "eventualmente, a NSA tornou-se seu único editor." Apesar do conhecido potencial de um backdoor e outras deficiências significativas com o Dual_EC_DRBG, diversas empresas como a RSA Security continuaram a utilizar o Dual_EC_DRBG, até a backdoor ser confirmada em 2013.[14] RSA Security recebeu da NSA U$10 milhões como pagamento para continuar a utilizar o CSPRNG comprometido.[15]

Referências

[editar | editar código]
  1. ↑ Andrew Huang (2003). Hacking the Xbox: An Introduction to Reverse Engineering. Col: No Starch Press Series. [S.l.]: No Starch Press. 111 páginas. 9781593270292. Consultado em 24 de Outubro de 2013. [...] o gerador de fluxo de chave [...] pode ser visto como um gerador de números pseudoaleatórios criptográfico (CPRNG).
  2. ↑ Andrew Chi-Chih Yao. Theory and applications of trapdoor functions. In Proceedings of the 23rd IEEE Symposium on Foundations of Computer Science, 1982.
  3. ↑ Predefinição:Citar conference
  4. ↑ John von Neumann (1 de Março de 1963). «Various techniques for use in connection with random digits». The Collected Works of John von Neumann. [S.l.]: Pergamon Press. pp.  768–770. 0-08-009566-6
  5. ↑ Adam Young, Moti Yung (1 de Fevereiro de 2004). Malicious Cryptography: Exposing Cryptovirology. sect 3.2: John Wiley & Sons. 416 páginas. 978-0-7645-4975-5
  6. ↑ NIST. "A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications". NIST, Special Publication April 2010
  7. ↑ A. Poorghanad, A. Sadr, A. Kashanipour" Generating High Quality Pseudo Random Number Using Evolutionary Methods", IEEE Congress on Computational Intelligence and Security, vol. 9, pp. 331-335 , May,2008
  8. ↑ David Kleidermacher, Mike Kleidermacher. "Embedded Systems Security: Practical Methods for Safe and Secure Software and Systems Development". Elsevier, 2012. p. 256.
  9. ↑ George Cox, Charles Dike, and DJ Johnston. "Intel’s Digital Random Number Generator (DRNG)". 2011.
  10. ↑ Handbook of Applied Cryptography, Alfred Menezes, Paul van Oorschot, e Scott Vanstone, CRC Press, 1996, Chapter 5 Pseudorandom Bits and Sequences (PDF)
  11. ↑ James Borger; Glenn Greenwald (6 de setembro de 2013). «Revealed: how US and UK spy agencies defeat internet privacy and security». The Guardian. The Guardian. Consultado em 7 de setembro de 2013
  12. ↑ Nicole Perlroth (5 de setembro de 2013). «N.S.A. Able to Foil Basic Safeguards of Privacy on Web». The New York Times. Consultado em 7 de setembro de 2013
  13. ↑ Bruce Schneier (15 de novembro de 2007). «Did NSA Put a Secret Backdoor in New Encryption Standard?». Wired. Consultado em 7 de setembro de 2013
  14. ↑ Matthew Green. «RSA warns developers not to use RSA products»
  15. ↑ Joseph Menn (20 de dezembro de 2013). «Exclusive: Secret contract tied NSA and security industry pioneer». Reuters

Ligações externas

[editar | editar código]