Quan l’atzar és imprescindible
El problema de la generació de nombres aleatoris
Introducció
Necessites organitzar una rifa? Doncs et caldrà un número perfectament aleatori.
Hi ha tecnologies que semblen dependre només de càlculs, però que en realitat necessiten una bona dosi d'atzar. La criptografia, les contrasenyes segures, els tokens d'autenticació, moltes simulacions científiques i fins i tot alguns videojocs necessiten nombres aleatoris o, com a mínim, nombres que s'hi assemblin prou.
El problema és que un ordinador no és, per naturalesa, una màquina caòtica. Un ordinador és un sistema determinista: si rep les mateixes dades d'entrada i executa el mateix algoritme, produirà sempre el mateix resultat. Això planteja una pregunta fascinant: com pot una màquina determinista generar atzar?
La resposta és que hi ha diverses maneres d'intentar-ho. Algunes són suficients per a aplicacions ordinàries. D'altres són imprescindibles quan hi ha en joc la seguretat. I aquí és on entren en escena els generadors pseudoaleatoris, les fonts d'entropia del sistema, els serveis externs i fins i tot idees aparentment enginyoses, però problemàtiques, com recórrer als decimals del nombre π.
Què vol dir que un nombre sigui aleatori?
En sentit estricte, un nombre aleatori és un valor que no es pot predir de manera pràctica abans de ser generat. A més, una seqüència de nombres aleatoris no hauria de mostrar patrons fàcilment detectables ni dependències evidents entre un valor i el següent.
A la pràctica convé distingir dues idees diferents. D'una banda hi ha l'atzar físic, que prové de fenòmens externs com el soroll electrònic, el comportament de certs circuits o altres processos difícils de predir. De l'altra hi ha l'atzar computacional, que acostuma a ser pseudoaleatori: sembla aleatori, però és el resultat d'un procediment matemàtic.
Aquesta distinció és fonamental. Per a moltes aplicacions quotidianes n'hi ha prou amb una bona seqüència pseudoaleatòria. Però en criptografia no n'hi ha prou que una seqüència "ho sembli": ha de ser molt difícil de predir, fins i tot si l'atacant coneix l'algoritme utilitzat.
El mètode més simple: usar el generador del llenguatge
La manera més fàcil d'obtenir un nombre aleatori en un script és utilitzar la biblioteca estàndard del llenguatge. En Python, per exemple, hi ha el mòdul random, que permet generar enters, decimals, triar un element d'una llista o barrejar una seqüència.
# Utilització de la biblioteca ramdom en Python
import random
n = random.randint(1,100)
print(n)
En Javascript tenim un mòdul semblant:
// Generar números aleatorios enteros
function aleatorioEntreE(a,b){
let n;
n = Math.floor((Math.random() * (b - a)) + a);
return n;
}
// Generar números aleatorios sin/con decimales
function aleatorioEntreD(a, b, deci = 0) {
let n;
if (deci == 0) {
n = Math.floor((Math.random() * (b - a)) + a);
} else {
n = Math.random() * (b - a) + a;
n = redoNum(n, deci);
}
return n;
}
La llibreria random de Python o javscript pot ser la solució més fàcil però no la més segura.
Aquest mètode és molt útil per a simulacions, jocs, proves de programari o petits scripts. Però cal entendre què hi ha al darrere: no es tracta d'atzar real, sinó d'un generador pseudoaleatori. Això vol dir que la seqüència es calcula a partir d'un estat intern i, si coneixem aquest estat inicial o la llavor (seed), podem reproduir exactament els mateixos valors.
Per a usos normals això no és cap problema. De fet, en entorns científics sovint interessa poder repetir una simulació amb la mateixa llavor. Però si el que volem és generar claus, codis de verificació o tokens de sessió, aquest enfocament és insuficient.
El rellotge de l'ordinador com a llavor
Durant molts anys una tècnica habitual ha estat utilitzar el temps actual del sistema per inicialitzar el generador pseudoaleatori. La idea sembla raonable: el rellotge canvia constantment, de manera que cada execució parteix d'un punt diferent.
Aquest mètode pot funcionar per a scripts senzills o per a aplicacions on no hi ha risc real. Però la seva feblesa és evident: el temps del sistema no és cap secret. Si un atacant pot acotar el moment en què s'ha generat el valor, pot provar moltes menys possibilitats de les que semblaria.
Dit d'una altra manera: el rellotge és una font útil per variar una seqüència, però no és una font prou robusta quan necessitem seguretat criptogràfica. És una solució pràctica, però no una garantia forta d'imprevisibilitat.
import time
import random
random.seed(time.time())
print(random.randint(1,100))
Generadors segurs: quan entra en joc el sistema operatiu
Els sistemes operatius moderns incorporen mecanismes més sòlids. En entorns Unix i Linux existeixen interfícies com /dev/urandom o la crida getrandom(), que obtenen bytes a partir d'un generador del sistema alimentat amb entropia acumulada.
Aquesta entropia pot venir de diverses fonts: temps entre interrupcions, activitat del maquinari, esdeveniments del sistema i altres variacions difícils de modelitzar exactament. En altres paraules, el sistema operatiu recull petites dosis d'imprevisibilitat i les fa servir per alimentar un generador més robust.
En Python, el mòdul secrets està pensat precisament per a això. Si volem crear una contrasenya temporal, un token o una clau aleatòria, és molt més adequat recórrer a secrets que no pas a random.
import secrets
n = secrets.randbelow(100)
print(n)
Acudir a una web externa
Una altra possibilitat és obtenir nombres aleatoris des d'un servei extern. El cas més conegut és RANDOM.ORG, que ofereix nombres generats a partir de soroll atmosfèric. Des del punt de vista didàctic, és una solució molt interessant perquè mostra que hi ha fonts externes d'atzar que no depenen directament del nostre ordinador.
Això es pot integrar fàcilment en un script mitjançant una petició HTTP. El programa consulta el servei i rep un enter o una seqüència d'enters. Per a experiments, demostracions o aplicacions no crítiques és una opció curiosa i molt visual.
Ara bé, aquesta via també té limitacions. Dependrem d'una connexió de xarxa, d'un servei de tercers i de la seva disponibilitat. A més, si una aplicació de seguretat depèn completament d'un servei extern, la confiança queda desplaçada fora del nostre sistema. Per això aquesta opció és interessant, però no acostuma a ser la base principal d'un sistema criptogràfic modern.
import requests
url = "https://www.random.org/integers/?num=1&min=1&max=100&col=1&base=10&format=plain&rnd=new"
print(requests.get(url).text)
Podem utilitzar π, e o altres constants matemàtiques?
És una idea temptadora. Els decimals de π, de e o d'altres nombres irracionals semblen caòtics, i a simple vista no hi detectem patrons evidents. Això podria fer pensar que són una bona font d'atzar per a un script.
Però hi ha un inconvenient decisiu: aquestes constants són perfectament deterministes. La seva successió de dígits és fixa. Si decidim, per exemple, agafar un fragment dels decimals de π per construir un nombre, qualsevol altra persona que conegui el procediment obtindrà exactament el mateix resultat.
Això no impedeix fer-ne usos lúdics o pedagògics. Es poden utilitzar per il·lustrar la diferència entre una seqüència "que sembla irregular" i una seqüència veritablement imprevisible. Però, en sentit estricte, π no genera atzar: només ens dona una successió molt llarga de dígits preexistents.
Fonts físiques i maquinari especialitzat
Quan es busca atzar de més qualitat, molts sistemes recorren a fonts físiques. Hi ha xips i dispositius que aprofiten soroll electrònic, variacions microscòpiques del maquinari o altres fenòmens físics difícils de predir. Aquests dispositius s'anomenen sovint TRNG (True Random Number Generators), és a dir, generadors de nombres aleatoris basats en fenòmens físics.
Aquest tipus de tecnologia és especialment rellevant en criptografia, perquè la qualitat de l'atzar afecta directament la qualitat de les claus generades. Una clau pot ser matemàticament impecable sobre el paper, però si s'ha creat amb una font de nombres previsible, la seguretat real cau de manera dramàtica.
Per això, en la pràctica, molts sistemes moderns combinen fonts físiques amb generadors criptogràficament segurs del sistema operatiu. No es tracta d'escollir una única font miraculosa, sinó de construir una cadena de confiança prou robusta.
Com ho faríem en un script real?
Si l'objectiu és només obtenir un enter aleatori per a una prova o una simulació, el més senzill és fer servir el generador integrat del llenguatge. Si l'objectiu és generar valors sensibles, la decisió correcta és utilitzar les eines de seguretat del sistema o del llenguatge, no inventar cap mètode artesanal.
Per exemple, hi ha una diferència enorme entre aquestes dues idees:
Per a usos normals
- generador pseudoaleatori del llenguatge
- llavor basada en el temps
- seqüències repetibles per a proves
Per a usos sensibles
- generadors segurs del sistema operatiu
- mòduls específics de seguretat
- entropia recollida del sistema o del maquinari
En altres paraules: un script pot "fabricar" nombres aparentment aleatoris de moltes maneres, però només algunes són adequades quan hi ha en joc la confidencialitat o la seguretat.
El cas dels Pelayo. L'importància de la aleotaritat en els jocs d'atzar.
La família Pelayo va desenvolupar als anys noranta una estratègia matemàtica per guanyar diners a diversos casinos europeus aprofitant el defecte de les ruletes de casino que no eren del tot aleatories.
- El principi del mètode
Van registrar milers de tirades de ruleta i van analitzar estadísticament els resultats per detectar si algun número sortia lleugerament més sovint del que indicaria la probabilitat teòrica.
- El biaix de les ruletes
Les ruletes són objectes físics i poden tenir petites imperfeccions mecàniques o desgast, cosa que pot provocar desviacions mínimes però mesurables.
- Avantatge estadístic
Quan identificaven una ruleta amb un petit biaix, apostaven només als números amb més probabilitat. Amb moltes tirades, aquest petit avantatge es convertia en beneficis.
- Per què els va funcionar
El seu èxit es basa en una idea simple de la probabilitat: si un sistema que hauria de ser perfectament aleatori té un petit biaix, aquest biaix es pot detectar amb prou dades i convertir-se en un avantatge estadístic.
- Conseqüència
Van guanyar quantitats importants en casinos d'Espanya, França i Mònaco. Els casinos els van portar als tribunals, però la justícia va determinar que no havien fet cap trampa, només havien aplicat estadística.
Altres errors famosos per mala generació d'atzar
- Claus RSA duplicades (2012) — Investigadors van descobrir que molts dispositius embeguts (routers, firewalls, dispositius IoT) generaven claus RSA amb fonts d'atzar molt pobres. El resultat era que milers de claus eren idèntiques o compartien factors, cosa que permetia trencar-les fàcilment.
- Error d'OpenSSL en Debian (2006-2008) — Una modificació accidental al codi d'OpenSSL va reduir dràsticament l'entropia del generador aleatori. Durant dos anys es van generar claus criptogràfiques amb només uns pocs milers de possibilitats, fàcils de provar per força bruta.
- Reutilització del valor aleatori en signatures ECDSA (cas PlayStation 3) — Sony va reutilitzar el mateix nombre aleatori en diverses signatures digitals. Això va permetre als investigadors recuperar la clau privada i trencar el sistema de seguretat de la consola.
- Problema amb signatures Bitcoin (2013) — Algunes carteres utilitzaven generadors d'atzar defectuosos per crear signatures ECDSA. En reutilitzar valors aleatoris, atacants van poder deduir claus privades i robar bitcoins.
- Generadors pseudoaleatoris predictibles — En diversos programes i protocols antics, els nombres aleatoris es generaven a partir de l'hora del sistema o altres dades fàcilment previsibles, cosa que permetia reconstruir la seqüència d'atzar i comprometre la seguretat.
La aleatorietat que crea el codi indesxifrable
Un dels exemples més radicals de la importància de l'atzar en criptografia és el one-time pad. Aquest sistema, proposat a començaments del segle XX, utilitza una clau formada per una seqüència totalment aleatòria de caràcters que té exactament la mateixa longitud que el missatge que es vol xifrar. Cada caràcter del text es combina amb el caràcter corresponent de la clau mitjançant una operació simple (normalment una suma modular).
La seva particularitat és extraordinària: si la clau és realment aleatòria, s'utilitza només una vegada i es manté en secret, el sistema és matemàticament indesxifrable. Claude Shannon va demostrar que, en aquestes condicions, qualsevol text xifrat pot correspondre a infinitat de missatges possibles amb la mateixa probabilitat.
El gran inconvenient és pràctic. Cal generar claus perfectament aleatòries, distribuir-les de forma segura i assegurar-se que no es reutilitzen mai. Aquest problema logístic ha fet que el one-time pad sigui poc utilitzat fora d'entorns molt específics, com comunicacions diplomàtiques o militars.
Com saber si un sistema és realment aleatori
Una pregunta fonamental és si podem saber si una seqüència de nombres és realment aleatòria. En realitat, no es pot demostrar matemàticament que una seqüència finita sigui perfectament aleatòria. El que es fa és aplicar tests estadístics que intenten detectar patrons o desviacions de la probabilitat esperada.
- Distribució uniforme
Cada valor hauria d'aparèixer aproximadament amb la mateixa freqüència.
- Independència entre valors
El resultat d'un nombre no hauria d'influir en el següent.
- Absència de patrons detectables
No hi hauria d'haver repeticions regulars ni seqüències previsibles.
Per comprovar-ho existeixen bateries de proves molt conegudes, com els tests NIST, els Diehard tests o el conjunt TestU01, que analitzen milers o milions de valors per veure si apareixen desviacions estadístiques.
En resum, un sistema no es pot demostrar absolutament aleatori, però si supera moltes proves estadístiques exigents es pot considerar prou aleatori per a la pràctica, especialment en aplicacions científiques o criptogràfiques.
Conclusió
La generació de nombres aleatoris és un problema molt més profund del que sembla. Darrere d'un simple "triar un número a l'atzar" hi ha qüestions de matemàtiques, informàtica, física i seguretat.
Podem acudir a moltes fonts: un algoritme pseudoaleatori, el rellotge del sistema, una web externa, una constant matemàtica o un dispositiu físic. Però no totes ofereixen el mateix nivell de qualitat ni serveixen per als mateixos objectius.
Per a jocs, simulacions o proves, les solucions simples acostumen a ser suficients. Per a criptografia, en canvi, la qualitat de l'atzar és una peça fonamental. En aquest terreny, improvisar és una mala idea: la robustesa del sistema depèn, en bona part, de la robustesa de la font aleatòria.
La gran paradoxa és aquesta: les tecnologies de seguretat més avançades depenen d'una cosa tan difícil d'obtenir com l'atzar de qualitat.
Referències i recursos
- ¿Cómo ayudan las lámparas de lava a la encriptación de Internet?
- Cómo sacamos partido al caos en las oficinas de Cloudflare
Recursos
- Generador de números aleatoris. Random.org
- Generador de números aleatoris de Google
- Números aleatorios en Excel
- Libro de números aleatorios
- ANU QRNG
Vídeos
- Computerphile: Random Numbers and Security
- Numberphile: Randomness
- ¿qué es lo más random del mundo?
- Las LÁMPARAS de LAVA que PROTEGEN tus datos en internet
- El HOMBRE que DESTRUYÓ los MAYORES CASINOS de EUROPA (Los Pelayo)
- How 100 LAVA LAMPS Secure the Internet
- El azar es imposible (al menos en los ordenadores) | El drama de LOS NÚMEROS ALEATORIOS
Podcasts i àudio