CSPRNG
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:
- geração de chave
- nonces
- cifras de uso único
- sais em certos esquemas de assinatura, como ECDSA, RSASSA-PSS
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-fonte]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-fonte]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).
Projetos
[editar | editar código-fonte]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-fonte]- 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-fonte]- 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-fonte]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).
Padrões
[editar | editar código-fonte]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:
- A Statistical Test Suite for Random and Pseudorandom Number Generators, NIST Special Publication 800-22.
Backdoor da NSA no PRNG Dual_EC_DRBG
[editar | editar código-fonte]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-fonte]- ↑ 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).
- ↑ Andrew Chi-Chih Yao. Theory and applications of trapdoor functions. In Proceedings of the 23rd IEEE Symposium on Foundations of Computer Science, 1982.
- ↑ Predefinição:Citar conference
- ↑ 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
- ↑ 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
- ↑ NIST. "A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications". NIST, Special Publication April 2010
- ↑ 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 [1]
- ↑ David Kleidermacher, Mike Kleidermacher. "Embedded Systems Security: Practical Methods for Safe and Secure Software and Systems Development". Elsevier, 2012. p. 256.
- ↑ George Cox, Charles Dike, and DJ Johnston. "Intel’s Digital Random Number Generator (DRNG)". 2011.
- ↑ Handbook of Applied Cryptography, Alfred Menezes, Paul van Oorschot, e Scott Vanstone, CRC Press, 1996, Chapter 5 Pseudorandom Bits and Sequences (PDF)
- ↑ 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
- ↑ 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
- ↑ 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
- ↑ Matthew Green. «RSA warns developers not to use RSA products»
- ↑ Joseph Menn (20 de dezembro de 2013). «Exclusive: Secret contract tied NSA and security industry pioneer». Reuters
Ligações externas
[editar | editar código-fonte]- RFC 4086, Randomness Requirements for Security
- Java "entropy pool" for cryptographically secure unpredictable random numbers.
- Java standard class providing a cryptographically strong pseudo-random number generator (PRNG).
- Cryptographically Secure Random number on Windows without using CryptoAPI
- Conjectured Security of the ANSI-NIST Elliptic Curve RNG, Daniel R. L. Brown, IACR ePrint 2006/117.
- A Security Analysis of the NIST SP 800-90 Elliptic Curve Random Number Generator, Daniel R. L. Brown and Kristian Gjosteen, IACR ePrint 2007/048. Aparece em CRYPTO 2007.
- Cryptanalysis of the Dual Elliptic Curve Pseudorandom Generator, Berry Schoenmakers and Andrey Sidorenko, IACR ePrint 2006/190.
- Efficient Pseudorandom Generators Based on the DDH Assumption, Reza Rezaeian Farashahi and Berry Schoenmakers and Andrey Sidorenko, IACR ePrint 2006/321.
- Analysis of the Linux Random Number Generator, Zvi Gutterman and Benny Pinkas and Tzachy Reinman.
- An implementation of a cryptographically safe shrinking pseudorandom number generator.