# Generador de números pseudoaleatoris criptogràficament segur

Un generador de números pseudoaleatoris criptogràficament segur (CSPRNG) o un generador de números pseudoaleatoris criptogràfics (CPRNG) és un generador de números pseudoaleatoris (PRNG) amb propietats que el fan adequat per al seu ús en criptografia. També es coneix com a generador de números aleatoris criptogràfics (CRNG).

## Rerefons

La majoria de les aplicacions criptogràfiques requereixen números aleatoris, per exemple:
* generació de claus
* noces
* sals en determinats esquemes de signatura, inclosos ECDSA, RSASSA-PSS
La "qualitat" de l'aleatorietat requerida per a aquestes aplicacions varia. Per exemple, crear un nonce en alguns protocols només necessita unicitat. D'altra banda, la generació d'una clau mestra requereix una qualitat superior, com ara més entropia. I en el cas dels coixinets d'un sol ús, la garantia teòrica de la informació del secret perfecte només s'aplica si el material clau prové d'una font aleatòria real amb alta entropia i, per tant, qualsevol tipus de generador de números pseudoaleatoris és insuficient.
Idealment, la generació de nombres aleatoris en CSPRNG utilitza entropia obtinguda d'una font d'alta qualitat, generalment l'API d'aleatorietat del sistema operatiu. Tanmateix, s'han trobat correlacions inesperades en diversos processos aparentment independents. Des d'un punt de vista teòric de la informació, la quantitat d'aleatorietat, l'entropia que es pot generar, és igual a l'entropia proporcionada pel sistema. Però de vegades, en situacions pràctiques, es necessiten més nombres aleatoris del que hi ha entropia disponible. A més, els processos per extreure l'atzar d'un sistema en execució són lents a la pràctica real. En aquests casos, de vegades es pot utilitzar un CSPRNG. Un CSPRNG pot "estirar" l'entropia disponible en més bits.

## Requisits

Un generador de números pseudoaleatoris criptogràficament segur (CSPRNG) o un generador de números pseudoaleatoris criptogràfics (CPRNG) és un generador de nombres pseudoaleatoris (PRNG) amb propietats que el fan adequat per al seu ús en criptografia. També es coneix com a generador de números aleatoris criptogràfics (CRNG), que es pot comparar amb nombres "veritables" i pseudoaleatoris.

## Dissenys

A la discussió següent, els dissenys CSPRNG es divideixen en tres classes:
* els basats en primitives criptogràfiques com ara xifres i hash criptogràfics,
* els basats en problemes matemàtics que es creien difícils, i
* dissenys per a finalitats especials.
L'últim sovint introdueix entropia addicional quan està disponible i, en sentit estricte, no són generadors de nombres pseudoaleatoris "purs", ja que la seva sortida no està completament determinada pel seu estat inicial. Aquesta addició pot evitar atacs encara que l'estat inicial estigui compromès.

## Normes

S'han estandarditzat diversos CSPRNG. Per exemple,
* FIPS 186-4
* NIST SP 800-90A
* NIST SP 800-90A Rev.1: Es tracta bàsicament de NIST SP 800-90A amb Dual_EC_DRBG eliminat i és el reemplaçament de l'estàndard retirat.
* ANSI X9.17-1985 Apèndix C
* ANSI X9.31-1998 Apèndix A.2.4
* ANSI X9.62-1998 Annex A.4, obsolet per ANSI X9.62-2005, Annex D (HMAC_DRBG)
    NIST manté una bona referència.

## Referències

* ↑ Huang, Andrew. Hacking the Xbox: An Introduction to Reverse Engineering (en anglès). No Starch Press, 2003, p. 111 (No Starch Press Series). ISBN 9781593270292.
* ↑ Dufour, Cédric. «How to ensure entropy and proper random numbers generation in virtual machines» (en anglès). Exoscale.
* ↑ «/dev/random Is More Like /dev/urandom With Linux 5.6 - Phoronix» (en anglès). www.phoronix.com.
* ↑ Computer Security Division, Information Technology Laboratory. «Random Number» (en anglès americà). CSRC | NIST, 24-05-2016.