Så fungerar en slumpgenerator
- Vad är en slumpgenerator?
- Sanna slumpgeneratorer (TRNG): slump från naturen
- Pseudoslumpgeneratorer (PRNG): matematisk slump
- Linjär kongruensmetod
- Mersenne Twister
- CSPRNG: kryptografiskt säker pseudoslump
- Slumpgenerator för nummer
- Vanliga användningsområden för slumpgenerator nummer
- Slumpgenerator för namn
- När spelar skillnaden mellan typerna roll?
- Framtidens slumpgeneratorer: kvantslump och AI
- Vanliga frågor om slumpgeneratorer
- Vad är en slumpgenerator?
- Vad är skillnaden mellan TRNG och PRNG?
- Hur fungerar en slumpgenerator för nummer?
- Hur fungerar en slumpgenerator för namn?
- Är random.org en sann slumpgenerator?
- Vad är Mersenne Twister?
- Varför ska man inte använda Math.random() för säkerhet?
- Vad är CSPRNG?
En slumpgenerator är en algoritm eller fysisk enhet som producerar tal, symboler eller andra värden utan urskiljbart mönster. Det finns två huvudtyper: sanna slumpgeneratorer (TRNG) som hämtar slumpen från fysiska processer som termiskt brus eller radioaktivt sönderfall, och pseudoslumpgeneratorer (PRNG) som med hjälp av matematiska algoritmer skapar sekvenser som ser slumpmässiga ut men i själva verket är förutsägbara om man känner till startvärdet. För säkerhetskritiska uppgifter som kryptering används en tredje variant: kryptografiskt säkra pseudoslumpgeneratorer (CSPRNG). Här är en komplett genomgång av hur en slumpgenerator fungerar, vilka typer som finns, hur den används för nummer och namn, samt varför skillnaden mellan typerna spelar enorm roll för IT-säkerhet.
- TRNG (True Random Number Generator): äkta slump från fysiska processer
- PRNG (Pseudorandom Number Generator): deterministisk, baserad på algoritm + frö
- CSPRNG: kryptografiskt säker PRNG, oförutsägbar
- Mersenne Twister: vanligaste PRNG, period 2^19937-1
- Mersenne Twister utvecklad: 1997 av Matsumoto och Nishimura
- Random.org: världens mest kända TRNG, drivs av atmosfäriskt brus
- TRNG-källor: termiskt brus, radioaktivt sönderfall, kvantfenomen
- Standard i Python: Mersenne Twister (numpy: PCG64 sedan 1.17)
- Säkerhet: Mersenne Twister får aldrig användas för krypto
Vad är en slumpgenerator?
En slumpgenerator (engelska Random Number Generator, RNG) är ett verktyg, en algoritm eller en fysisk enhet som producerar tal eller andra värden där varje nytt utfall i princip inte ska gå att förutsäga från tidigare utfall. Slumpgeneratorer används överallt i moderna digitala system: i krypteringsnycklar för bankärenden och webbsäkerhet, i datorspel och tärningsfunktioner, i lotterier, i vetenskapliga simuleringar, i AI-träning och i lösenordsåterställning. Utan tillförlitliga slumpgeneratorer hade i princip ingen säker digital kommunikation existerat.
Trots att vi ofta använder ordet slump som vore det entydigt finns flera nivåer av slumpmässighet. En slumpgenerator för ett tärningsspel behöver bara verka slumpmässig för en mänsklig spelare, medan en slumpgenerator som genererar en krypteringsnyckel måste vara oförutsägbar även för avancerade angripare med stora datorresurser. Skillnaden mellan dessa nivåer är vad som skiljer en vanlig pseudoslumpgenerator från en kryptografiskt säker, och varför ämnet är mer tekniskt intressant än det först kan verka.
Sanna slumpgeneratorer (TRNG): slump från naturen
En sann slumpgenerator, eller True Random Number Generator (TRNG), genererar slump genom att mäta fysiska processer som är genuint oförutsägbara. De vanligaste källorna är termiskt brus i halvledare, radioaktivt sönderfall, brus i en mikrofon eller kameraflöde, kvantmekaniska fenomen som fotonpolarisation, samt atmosfäriskt brus från radiomottagning. Den välkända tjänsten Random.org använder atmosfäriskt brus för att leverera äkta slumptal sedan 1998, vilket är ett tydligt exempel på en TRNG i bred användning.
Fördelen med en TRNG är att den i grunden är oförutsägbar, även om en angripare har full kunskap om systemet. Nackdelen är att den är långsam och dyr jämfört med en algoritmisk slumpgenerator: att utvinna äkta slump kräver fysisk hårdvara, och hastigheten begränsas av hur snabbt fenomenet kan mätas. Därför används TRNG främst som källa för fröet (seed) i en snabbare PRNG, snarare än att driva varje enskilt slumpvärde direkt.
| Källa | Fenomen | Användning |
|---|---|---|
| Termiskt brus | Slumpmässiga elektronrörelser i halvledare | Hårdvaru-RNG i processorer |
| Radioaktivt sönderfall | Spontant kärnsönderfall | Speciella kvantfysik-RNG |
| Atmosfäriskt brus | Naturligt radiobrus i atmosfären | Random.org, krypto-tjänster |
| Fotonpolarisation | Kvantfenomen i enskilda fotoner | Kvant-RNG, säkerhetsforskning |
| Mus- och tangentinmatning | Mikroskopisk variation i mänsklig rörelse | Krypto-frö i operativsystem |
Pseudoslumpgeneratorer (PRNG): matematisk slump
En pseudoslumpgenerator (PRNG) skapar sekvenser av tal som ser slumpmässiga ut men som följer en deterministisk algoritm. Det betyder att om man kör algoritmen från samma startvärde, kallat frö eller seed på engelska, får man exakt samma sekvens varje gång. Det är både en svaghet (säkerhet) och en styrka (reproducerbarhet i vetenskap och spelutveckling). Tre vanliga PRNG-typer används idag, var och en med olika kompromisser mellan hastighet, kvalitet och säkerhet.
Linjär kongruensmetod
Den linjära kongruensmetoden (Linear Congruential Generator, LCG) är en av de äldsta och enklaste PRNG. Den fungerar genom enkla multiplikations- och modulus-operationer på ett tal som rullar vidare för varje iteration. LCG är extremt snabb och liten i kod, vilket gjorde den populär i tidiga datorer, men kvaliteten på slumpen är låg. Den används idag bara för enkla tillämpningar där statistisk slumpkvalitet inte spelar någon roll.
Mersenne Twister
Mersenne Twister är den absolut vanligaste PRNG i modern programvara. Den utvecklades 1997 av Makoto Matsumoto och Takuji Nishimura och är uppkallad efter mersenneprimtal eftersom dess period är 2^19937 minus 1, ett ofantligt stort tal som innebär att sekvensen i praktiken aldrig upprepar sig under en bils livstid. Mersenne Twister är enligt en internationell sammanställning av implementationer standard i Python, R, Ruby, PHP, MATLAB, Microsoft Excel och C++:s standardbibliotek. NumPy bytte 2019 till den snabbare PCG64 som standard, även om Mersenne Twister fortfarande finns kvar som alternativ.
Mersenne Twister har dock en avgörande begränsning: den är inte kryptografiskt säker. Med 624 påföljande utdata kan en angripare rekonstruera generatorns interna tillstånd och därefter förutsäga alla framtida värden. Det är ett välkänt resultat inom säkerhetsforskning, och därför ska Mersenne Twister aldrig användas för krypteringsnycklar, sessionsidentifierare eller andra säkerhetskritiska tillämpningar.
CSPRNG: kryptografiskt säker pseudoslump
En kryptografiskt säker pseudoslumpgenerator (CSPRNG) är en PRNG som är så väldesignad att även en angripare som ser delar av utflödet inte kan rekonstruera tidigare eller framtida värden inom rimlig tid. CSPRNG bygger ofta på samma kryptografiska primitiver som modern kryptering, till exempel AES eller SHA. Operativsystem som Linux, macOS och Windows har inbyggda CSPRNG (Linux har /dev/urandom, Windows har BCryptGenRandom), som mata in entropi från system-händelser som tangenttryck, mus-rörelser och nätverkstidpunkter för att hålla generatorn oförutsägbar.
I praktiken används CSPRNG överallt i modern IT-säkerhet, från generering av SSH-nycklar till slumptal i HTTPS-handslagningar. Den som är intresserad av hur säker krypterad kommunikation byggs upp kan läsa mer i Monc:s genomgång av hur HTTPS fungerar, där slumpgeneratorer spelar en central roll i nyckelutbytet.
Slumpgenerator för nummer
En slumpgenerator för nummer är den klassiska tillämpningen och används överallt: från enkel tärningsfunktion i ett brädspel till stora vetenskapliga simuleringar och säkerhetsapplikationer. Beroende på syftet räcker det med en enkel PRNG, eller så krävs en CSPRNG eller TRNG. En slumpgenerator nummer-tjänst online använder oftast antingen webbläsarens inbyggda Math.random() (Mersenne Twister-variant), eller anropar en TRNG som random.org om äkta slump krävs. Vill du själv prova kan du använda Monc:s egen slumpgenerator för slumptal, tärning, lottdragning och lagindelning.
I programmering är de vanligaste anropen Math.random() i JavaScript, random.random() i Python, rand() i C eller Random-klassen i Java. Alla är vanliga PRNG och fullt tillräckliga för spel och visualiseringar, men inte för säkerhet. För säkerhetskritisk slump finns i stället specifika anrop: secrets-modulen i Python, crypto.randomBytes() i Node.js, eller SecureRandom i Java.
Vanliga användningsområden för slumpgenerator nummer
| Användning | Typ som behövs |
|---|---|
| Tärning och brädspel | Enkel PRNG räcker |
| Lottdragningar med insats | TRNG eller certifierad CSPRNG |
| Vetenskapliga simuleringar (Monte Carlo) | Mersenne Twister eller PCG64 |
| Krypteringsnycklar | CSPRNG (aldrig vanlig PRNG) |
| Lösenordsgeneratorer | CSPRNG |
| Spelodds och casinospel | Certifierad CSPRNG eller TRNG |
Hur AI och sannolikheter spelar in i odds och spelvärldar är en angränsande fråga som tas upp i Monc:s artikel om AI och sportodds, där matematisk modellering kombineras med slumpmässiga utfall.
Slumpgenerator för namn
En slumpgenerator namn är ett verktyg som väljer eller kombinerar namn från en lista enligt slumpmässiga regler. Användningsområdena är många: författare som behöver karaktärsnamn till en bok, spelutvecklare som genererar NPC-namn till spel, föräldrar som söker idéer för bebisnamn, företag som testar namn för produkter eller varumärken, eller vanliga användare som vill ha ett anonymt alias för en chatt eller en gamingprofil. Tekniskt är dessa nästan alltid byggda på en vanlig PRNG som väljer index ur en på förhand definierad namnlista.
Bra slumpgeneratorer för namn brukar låta användaren välja mellan kategorier som svenska namn, internationella namn, fantasy-namn, vikinganamn, bibliska namn, japanska namn, romerska namn och så vidare. De mer avancerade kan kombinera förnamn och efternamn från olika listor för att ge oändligt många unika kombinationer, och vissa lägger även till patronymikon (Eriksson, Magnusson) eller hela bakgrundsbeskrivningar för rollspels-karaktärer. Eftersom slumpkvaliteten inte är säkerhetskritisk räcker en enkel PRNG fullständigt.
När spelar skillnaden mellan typerna roll?
För de flesta vardagliga tillämpningar spelar det ingen praktisk roll om du använder TRNG eller PRNG. Vill du dra en vinnare i en facebook-tävling, slumpa en spelbricka, eller välja en deltagare ur en grupp, är vilken vettig slumpgenerator som helst tillräckligt bra. För de flesta blir det dessutom snabbare och enklare med en PRNG.
Skillnaden blir avgörande i tre situationer. Den första är kryptografi: krypteringsnycklar, sessionsidentifierare och lösenordsåterställning måste använda CSPRNG eller TRNG, annars kan systemet i värsta fall brytas av en angripare. Den andra är reglerade spel och lotterier: spelinspektionen kräver certifierade slumpgeneratorer som typiskt antingen är TRNG eller certifierade CSPRNG, för att förhindra manipulation. Den tredje är vetenskapliga simuleringar: även om Mersenne Twister fungerar väl behöver mycket långa simuleringar ofta överväga om PRNG-periodicitet kan påverka resultatet. Att förstå skillnaden är också en del av varför moderna cyberattacker ofta riktar sig mot just slumpgeneratorers svagheter.
Framtidens slumpgeneratorer: kvantslump och AI
Två tekniska utvecklingar pekar mot framtidens slumpgeneratorer. Kvantmekaniska slumpgeneratorer (QRNG) använder kvantfenomen som fotonpolarisation eller kvanttunnling och anses ge slump som i grunden inte går att förutsäga, ens i teorin, eftersom det följer av kvantmekanikens grundlagar. QRNG-chip blir successivt billigare och kommer in i moln-tjänster, mobiltelefoner och högre nivåer av IT-infrastruktur, något som blir viktigare i takt med att kvantdatorer hotar bryta nuvarande kryptering.
Den andra utvecklingen är åt motsatt håll: AI-modeller behöver enorma mängder slump för träning och initialisering. Detta har drivit fram nya snabba PRNG som PCG64, threefry och Philox, som ger bättre statistiska egenskaper och högre hastighet än klassiska Mersenne Twister. För både kvantsäker kryptering och AI-träning kommer slumpgeneratorer fortsätta att vara en central byggsten i hela den digitala infrastrukturen, även om de flesta användare aldrig märker dem.
Vanliga frågor om slumpgeneratorer
Vad är en slumpgenerator?
En slumpgenerator är ett verktyg, en algoritm eller en fysisk enhet som producerar värden där varje nytt utfall inte ska gå att förutsäga från tidigare utfall. De delas upp i sanna slumpgeneratorer (TRNG) som hämtar slump från fysiska processer, och pseudoslumpgeneratorer (PRNG) som använder matematiska algoritmer.
Vad är skillnaden mellan TRNG och PRNG?
TRNG (sann slumpgenerator) baseras på fysiska processer som termiskt brus eller radioaktivt sönderfall och är i grunden oförutsägbar. PRNG (pseudoslumpgenerator) är en deterministisk algoritm som ger samma sekvens varje gång den startas med samma frövärde. PRNG är snabbare, TRNG är säkrare.
Hur fungerar en slumpgenerator för nummer?
En slumpgenerator nummer använder antingen en matematisk algoritm (PRNG) eller en fysisk process (TRNG) för att välja tal i ett intervall. För spel och visualisering räcker PRNG, men för krypteringsnycklar och lotterier krävs CSPRNG eller TRNG.
Hur fungerar en slumpgenerator för namn?
En slumpgenerator namn väljer eller kombinerar namn från en på förhand definierad lista med hjälp av en vanlig PRNG. Den används för karaktärsnamn i spel och böcker, bebisnamn, alias och gamingprofiler. Eftersom slumpkvaliteten inte är säkerhetskritisk räcker en enkel PRNG.
Är random.org en sann slumpgenerator?
Ja, random.org är en av världens mest kända TRNG och har sedan 1998 levererat slumptal baserade på atmosfäriskt brus. Tjänsten används bland annat för certifierade lottdragningar, spelutveckling och säkerhetsforskning.
Vad är Mersenne Twister?
Mersenne Twister är den vanligaste pseudoslumpgeneratorn i modern programvara, utvecklad 1997 av Matsumoto och Nishimura. Den har en period på 2^19937 minus 1 och används som standard i Python, R, Ruby, PHP, Excel och C++. Den är dock inte kryptografiskt säker.
Varför ska man inte använda Math.random() för säkerhet?
Math.random() i webbläsare och liknande PRNG som Python random.random() är inte kryptografiskt säkra och kan av en angripare rekonstrueras från observerad utdata. För säkerhet ska crypto.getRandomValues() eller motsvarande CSPRNG användas i stället.
Vad är CSPRNG?
CSPRNG (Cryptographically Secure Pseudorandom Number Generator) är en pseudoslumpgenerator vars utflöde inte kan rekonstrueras av en angripare som ser delar av det. Den används för krypteringsnycklar, lösenord och sessionsidentifierare. Operativsystem som Linux, macOS och Windows har inbyggda CSPRNG.
En slumpgenerator är ett verktyg som producerar oförutsägbara värden, och delas in i sanna slumpgeneratorer (TRNG) som hämtar slump från fysiska processer, pseudoslumpgeneratorer (PRNG) som följer matematiska algoritmer, och kryptografiskt säkra varianter (CSPRNG) för säkerhetskritiska tillämpningar. Mersenne Twister är den vanligaste PRNG i modern programvara, med en period på 2^19937 minus 1, men får aldrig användas för kryptering eftersom den kan rekonstrueras från utdata.
För vardagsbruk, som slumpgenerator nummer för en tävling eller slumpgenerator namn för en karaktär, räcker vanliga PRNG väl. För kryptering, lotterier och certifierade spel krävs däremot TRNG eller CSPRNG, vilket är skälet till att moderna operativsystem har inbyggda kryptografiska slumpgeneratorer. I framtiden växer både kvantmekaniska slumpgeneratorer och AI-anpassade PRNG i betydelse, men grundprincipen är densamma: en bra slumpgenerator är det som gör att slumpen i en digital värld kan vara just slumpmässig.
Källor
- Random.org använder atmosfäriskt brus random.org
- en internationell sammanställning av implementationer en.wikipedia.org

