Pseudo-slumptalsgenerator ( PRNG , engelska pseudorandom number generator , PRNG ) är en algoritm som genererar en sekvens av tal , vars element är nästan oberoende av varandra och lyder en given fördelning (vanligtvis diskret uniform ).
Modern datavetenskap använder sig i stor utsträckning av pseudo-slumptal i en mängd olika tillämpningar, från Monte Carlo och simulering till kryptografi . Samtidigt beror kvaliteten på de erhållna resultaten direkt på kvaliteten på de använda PRNG:erna. Denna omständighet betonas av den välkända aforismen av ORNL -matematikern Robert Caviu: " Slumptalsgenerering är för viktigt för att lämnas åt slumpen ."
Källor till verkliga slumptal är extremt svåra att hitta. Fysiska brus [1] såsom detektorer för joniserande strålningshändelse , skottljud i ett motstånd eller kosmisk strålning [2] kan vara sådana källor. Sådana enheter används dock sällan i nätverkssäkerhetsapplikationer. Brutala attacker på sådana enheter orsakar också svårigheter.
Fysiska källor till slumptal har ett antal nackdelar:
Samtidigt kan slumptal erhållna från en fysisk källa användas som ett genererande element (engelsk utsäde) för mjukvaru-PRNG. Sådana kombinerade generatorer används i kryptografi, lotterier, spelautomater. [3]
John von Neumann ansåg att det var oacceptabelt att använda fysiska slumptalsgeneratorer inom datorteknik, eftersom om det skulle bli nödvändigt att kontrollera beräkningar skulle upprepade tidigare åtgärder kräva reproduktion av ett slumptal, medan generering av ett nytt slumptal är oacceptabelt. Preliminär registrering och lagring av genererade slumptal skulle innebära möjligheten att läsa dem. Dataavläsningsmekanismen var en av de svagaste länkarna i 1940-talets datorer. John von Neumann gav följande medelkvadratmetod [4] för att erhålla tiosiffriga pseudoslumptal:
Ett tiosiffrigt tal kvadreras, sedan tas ett tiosiffrigt tal från mitten av kvadraten på talet, som kvadreras igen, och så vidare.Till exempel, för 4-siffriga nummer, från och med 1234, får vi , där vi tar de mittersta 4 siffrorna (lägg till en nolla i början, om det behövs). Sedan kvadrerar vi det resulterande talet , och så vidare. Nackdelen med denna metod är den begränsade uppsättningen av PSCH på grund av det faktum att sekvensen loopar - .
År 1951 föreslog D. G. Lemer en linjär kongruent metod , [5] vars kärna är att specificera en sekvens av heltal med en rekursiv formel där är heltal och uppfyller följande villkor: . Nackdelen med denna metod är beroendet av , eftersom , samt det faktum att PFC loopar.
De flesta av de deterministiska PRNG :erna motsvarar den :1994]1 [struktur som föreslogs av P. Lecuer . Vanligtvis och tillståndet för generatorn ges av den rekursiva formeln för . Generatorns utgångsvärde ; är en sekvens av pseudoslumptal. Eftersom det är ändligt måste det finnas några ändliga och sådana som . Detta innebär att villkoren och kommer att vara uppfyllda för alla , eftersom funktionerna och är deterministiska. Således visar det sig att sekvensen är periodisk. PRNG- perioden kallas den minsta positiva . [3]
De vanligaste är den linjära kongruentialmetoden , Fibonaccimetoden med fördröjningar , skiftregistret med linjär återkoppling , skiftregistret med generaliserad återkoppling .
Av moderna PRNG:er har " Mersenne-virveln " som föreslogs 1997 av Matsumoto och Nishimura också blivit utbredd . Dess fördelar är en kolossal period (2 19937 −1), en enhetlig fördelning i 623 dimensioner (den linjära kongruentialmetoden ger en mer eller mindre enhetlig fördelning i max 5 dimensioner), snabb generering av slumptal (2-3 gånger snabbare än standard PRNG med linjär kongruent metod). Det finns dock algoritmer som känner igen sekvensen som genereras av Mersenne-virveln som icke-slumpmässig.
En pseudo-slumptalsgenerator ingår i många moderna processorer , till exempel ingår RdRand i IA-32-instruktionsuppsättningen. [6]
En variant av PRNG är GPSB (PRBG) - generatorer av pseudo-slumpmässiga bitar, såväl som olika strömchiffer .
Följande är en lista över generatorer som historiskt sett har stått ut inom området för generering av pseudo-slumptal, antingen på grund av sin historiska betydelse eller för att de var en innovativ modell för sina epoker. Dessutom, trots att detta är en PRNG, kan några av dem vara tillämpliga inom kryptografi.
Algoritm | Författarna | Länkar | Beskrivning | |
---|---|---|---|---|
mitten av kvadraten | John von Neumman | 1946 | [7] | PRNG, som anses vara låg kvalitet men av stor historisk betydelse som en av de första algoritmerna. |
Lehmer Generator / Linjär kongruentiell metod | D.H. Lehmer | 1951 | [åtta] | Det är också känt som metoden för multiplikativ linjär kongruens och har varit mycket inflytelserik inom detta forskningsområde. Den är också känd som den linjära kongruentiella metoden, vars grund har förbättrats med tiden. |
Lag Fibonacci Generator | GJ Mitchell; D.P. Moore | 1958 | [9] | En mycket inflytelserik algoritm i studiet av processer för generering av slumptal, som inspirerar andra senare stora författare som G. Marsaglia, skapare av ett kvalitetstest för slumptal som heter "Diehard", till exempel. |
Linjärt återkopplingsregister (LFSR) / Tausworthe-oscillator | R.C. Tausworth | 1965 | [tio] | En generator vars design påverkade många andra efterföljande PRNG:er. Därför är det mycket historiskt viktigt. Även känd som Tausworthe-generatorn. |
Wichmann & Hill Generator | B.A. Wichmann; D.I. Hill | 1982 | [elva] | En kombination av tre små LCG:er lämpliga för 16-bitars processorer. Används flitigt i många program, till exempel, användes den i Excel 2003 och några senare versioner för RAND-funktionen i Excel och var standardgeneratorn i Python fram till version 2.2. |
Regel 30 | Wolfram, Stephen | 1983 | [12] | Generator baserad på cellulära automater. |
Blum-Blum-Shub Generator | Bloom, Manuel ; L. Blum; M. Shub | 1986 | [13] | Det anses vara en av de säkraste generatorerna ur en kryptografisk synvinkel, främst på grund av inkorporeringen av forskning och begrepp hämtade från talteorin i dess formel. För denna Blum-algoritm tilldelades Manuel 1995 års Alan Turing-pris. |
park-miller generator | SK Park; KW Miller | 1988 | [fjorton] | En konkret implementering av Lehmer-generatorn, mycket använd eftersom den ingår i C++ som minstd_rand0-funktionen sedan C++11. |
EKOLLON | RS Wikramaratna | 1989 | [femton] | Dess namn kommer från den engelska förkortningen ACORN, som står för ″Additive Congruent Random Number″. |
MIXMAX | GK Savvidy; NG Ter-Arutyunyan-Savvidy | 1991 | [16] | Detta är en generator som tillhör klassen av matriskongruenta linjära generatorer, en generalisering av metoden för linjära kongruenser. Logiken i MIXMAX-familjen av generatorer är baserad på resultaten av ergodisk teori och klassisk mekanik. |
Add-with-carry | G. Marsaglia | 1991 | [17] | Modifiering av Fibonacci-generatorer med fördröjning. |
Subtrahera-med-låna | G. Marsaglia; A. Zaman | 1991 | [17] | Algoritm härledd från Fibonacci-generatorer med fördröjning. |
ISAAC | RJ Jenkins Jr. | 1993 | [arton] | Cryptographically Secure Cryptographic Data Generator (CSPRNG) utvecklad av Robert J. Jenkins. |
Mersenne Twister, MT | M. Matsumoto; T. Nishimura | 1996 | [19] | Detta är förmodligen den mest kända generatorn på den här listan, främst för att det är en algoritm implementerad i RAND-funktionen för programmeringsspråken Python och R, förutom dess starka närvaro i elektroniska spel som Pro Evolution Soccer (PES). |
Xorshift | G. Marsaglia | 2003 | [tjugo] | Detta är en mycket snabb undertyp av LFSR-generatorer. Marsaglia föreslog också en xorwow-generator som en förbättring, där utsignalen från xorshift-generatorn summeras med en Weyl-sekvens. xorwow-generatorn är standardgeneratorn i nVidia CUDA API CURAND-biblioteket för GPU:er. |
Fortuna algoritm | Schneier, Bruce ; Niels Ferguson | 2003 | [21] | Algoritmen anses vara kryptografiskt säker. CSPRNG, välkänd för att vara inbäddad i Apples system och produkter. |
Väl jämnt fördelad långperiodisk linjär (WELL) | F. Panneton; P. L'Ecuyer; M. Matsumoto | 2006 | [22] | En algoritm känd som ett tillägg till Mersenne Twister (MT), som medvetet försöker dölja sina svagheter. |
Advanced Randomization System (ARS) | J. Salmon; M. Moraes; R. Dror; D. Shaw | 2011 | [23] | En förenklad version av AES-blockchifferet som ger mycket hög prestanda på ett system som stöder AES-NI. |
Threefry | J. Salmon, M. Moraes, R. Dror och D. Shaw | 2011 | [23] | En förenklad version av Threefish-blockchifferet lämplig för GPU-implementering. |
Philox (Philox) | J. Salmon, M. Moraes, R. Dror och D. Shaw | 2011 | [23] | Förenkling och modifiering av blockchifferet Threefish med tillägg av S-box. |
Permuterad kongruentialgenerator (PCG) | M.E. O'Neill | 2014 | [24] | Modell erhållen med den linjära kongruentialmetoden. |
Random Cycle Bit Generator (RCB) | R. Cookman | 2016 | [25] | RCB:n beskrivs som en bitmönstergenerator utformad för att övervinna några av bristerna hos Mersenne Twist (MT) och begränsningen av kort period/bitlängd hos shift/modulo-generatorer. |
Middle Square Weyl Sequence RNG | B. Widynski | 2017 | [26] | En variant på John von Neumanns ursprungliga medelkvadratmetod. |
Xoroshiro128+ | D. Blackman; S. Vigna | 2018 | [27] | Modifiering av G. Marsaglias Xorshift-generator, en av de snabbaste generatorerna på moderna 64-bitars processorer. Relaterade generatorer är xoroshiro128**, xoshiro256+ och xoshiro256***. |
64-bitars MELG (MELG-64) | S. Harase; T. Kimoto | 2018 | [28] | Implementering av 64-bitars linjära F2-generatorer med primär Mersenne-period. |
Rutor RNG | B. Widynski | 2020 | [29] | En motbaserad version av Middle Square Weyl Sequence RNG. Liknande design som Philox, men mycket snabbare. |
Itamaraca (Ita) | D.H. Pereira | 2021 | [trettio] | Känd som den första PRNG-algoritmen baserad på absolutvärdesfunktionen. Itamaracá är också en enkel och snabb modell som genererar aperiodiska sekvenser av slumptal. |
En alternativ lösning är att skapa en uppsättning av ett stort antal slumpmässiga tal och publicera den i någon sorts ordbok , kallad " engångsblock ". Men även sådana uppsättningar ger en mycket begränsad källa till nummer jämfört med antalet som krävs av nätverkssäkerhetsapplikationer. Även om dessa uppsättningar ger statistisk slumpmässighet, är de inte tillräckligt säkra eftersom en angripare kan få en kopia av ordboken.
Ingen deterministisk algoritm kan generera helt slumpmässiga tal, den kan bara approximera vissa av deras egenskaper. Som John von Neumann sa , " Vem som helst som har en svaghet för de aritmetiska metoderna för att erhålla slumpmässiga tal är utan tvekan en syndare ."
Alla PRNG med begränsade resurser fastnar förr eller senare - den börjar upprepa samma nummersekvens. Längden på PRNG-cykler beror på själva generatorn och är ungefär , där är storleken på det interna tillståndet i bitar, även om linjära kongruenta och LFSR- generatorer har maximala ordningscykler [31] . Om den genererade PRNG-sekvensen konvergerar till för korta cykler, blir sådan PRNG förutsägbar och olämplig för praktiska tillämpningar.
De flesta enkla aritmetiska generatorer, även om de är snabba, lider av många allvarliga brister:
Speciellt RANDU- algoritmen , som har använts på stordatorer i decennier , visade sig vara mycket dålig [32] [33] , vilket väckte tvivel om tillförlitligheten av resultaten från många studier som använder denna algoritm.
Tillsammans med behovet av att generera lätt reproducerbara sekvenser av slumptal, finns det också ett behov av att generera helt oförutsägbara eller helt enkelt helt slumpmässiga tal. Sådana generatorer kallas slumptalsgeneratorer (RNG - engelska slumptalsgenerator, RNG ). Eftersom sådana generatorer oftast används för att generera unika symmetriska och asymmetriska nycklar för kryptering, är de oftast byggda av en kombination av en kryptografiskt stark PRNG och en extern entropikälla (och denna kombination är nu allmänt uppfattad som RNG).
Nästan alla stora mikrochipstillverkare levererar hårdvaru-RNG:er med olika källor till entropi, genom att använda olika metoder för att rensa dem från oundviklig förutsägbarhet. Men för tillfället matchar inte hastigheten för att samla in slumptal av alla befintliga mikrochips (flera tusen bitar per sekund) hastigheten hos moderna processorer.
I modern forskning görs försök att använda mätningen av de fysiska egenskaperna hos föremål (till exempel temperatur ) eller till och med kvantfluktuationer av vakuum som en entropikälla för RNG. [34]
I persondatorer använder RNG-programförfattare mycket snabbare källor till entropi, som ljudkortsbrus eller en processorklockräknare . Entropisamlingen var den mest sårbara punkten i RNG. Det här problemet är fortfarande inte helt löst i många enheter (som smarta kort ) som förblir sårbara på detta sätt. [35] Många RNG:er använder traditionella beprövade, om än långsamma, metoder för insamling av entropi, som att mäta användarens respons ( musrörelser , etc.), som i PGP och Yarrow [36] , eller interaktioner mellan trådar , som , i Java SecureRandom.
Om den aktuella tiden används som entropikälla, räcker det för att få ett heltal från 0 till N , att beräkna resten av att dividera den aktuella tiden i millisekunder med talet N +1. Nackdelen med denna RNG är att den producerar samma nummer under en millisekund.
Entropikälla | PRNG | Fördelar | Brister | |
---|---|---|---|---|
/dev/random på UNIX / Linux | Processorklockräknare, samlas dock bara in under hårdvaruavbrott | LFSR , med output-hashning via SHA-1 | Tillgänglig på alla Unix, en pålitlig källa till entropi | Det "värms upp" under mycket lång tid, kan "fastna" under lång tid, eller fungerar som en PRNG ( / dev / urandom ) |
Yarrow av Bruce Schneier [36] | Traditionella metoder | AES -256 och SHA-1 litet internt tillstånd | Flexibel kryptobeständig design | Långsam |
Microsoft CryptoAPI | Aktuell tid, hårddiskstorlek, ledigt minne, processnummer och NETBIOS-namn på datorn | MD5- hash för det interna tillståndet, 128 bitar i storlek | Inbyggd i Windows, fastnar inte | Beror starkt på vilken kryptografisk leverantör (CSP) som används. |
Java SecureRandom | Kommunikation mellan trådar | SHA-1 - intern tillståndshash (1024 bitar) | Stort internt tillstånd | Långsam entropisamling |
RdRand av intel [37] | Bullerströmmar | PFS-konstruktion baserad på "slumpmässig" bitavläsning av värden från strömmar [37] | Mycket snabb, fastnar inte | Den ursprungliga utvecklingen, fastigheterna ges endast efter godkännande av exploatörerna. |
Ett av kriterierna för att PRNG är kryptografiskt stark är oförmågan att skilja utdatavärdena för PRNG från en oberoende slumpmässig sekvens jämnt fördelad över intervallet. Låt det finnas en familj av PRNG , där kardinaliteten av uppsättningen är lika med . Som nämnts ovan, är en ändlig uppsättning tillstånd, är en sannolikhetsfördelning i tillståndet utrymme som används för att välja det initiala tillståndet (engelsk frö), är en övergångsfunktion, är utrymmet för utdatavärden, . Vanligtvis och tillståndet för generatorn ges av den rekursiva formeln för . Generatorns utgångsvärde ; är en sekvens av pseudoslumptal. Antag att övergångs- och utgångsfunktionerna kan beräknas i polynomtid, potenser av . Låt vara en klass av statistiska tester som försöker i polynomtid att skilja utdatavärdena för PRNG från en oberoende slumpmässig sekvens likformigt fördelad över intervallet . En familj av PRNG:er kallas bra i termer av polynomtid om det finns en sådan att ingen av testerna för alla kan särskilja utdatavärdena för PRNG från en oberoende slumpmässig sekvens likformigt fördelad över intervallet med sannolikhet . [3]
Kryptografiska applikationer använder deterministiska algoritmer för att generera slumpmässiga tal, och genererar därför en sekvens av tal som teoretiskt sett inte kan vara statistiskt slumpmässiga. Samtidigt, om du väljer en bra algoritm, kommer den resulterande numeriska sekvensen - pseudoslumptal - att klara de flesta tester för slumpmässighet. En av egenskaperna hos en sådan sekvens är en lång upprepningsperiod. [3]
Exempel på välkända kryptografiskt starka PRNG:er är RC4 [31] , ISAAC [38] , SEAL [39] , SNOW [40] , en mycket långsam teoretisk Blum-Blum-Shub-algoritm [31] , samt räknare med kryptografisk hash funktioner eller kryptografiskt säkra blockchiffer istället för utdatafunktionen [31] .
Kryptografiskt starka chiffer inkluderar också generatorer med flera skiftregister , generatorer med icke-linjära transformationer och majoritetskrypteringsgeneratorer A5/x . [31]
Slumptalsgeneratorn krypteras med hjälp av olika hemliga nycklar som erhålls i varje steg. En räknare med lång period används som indata till krypteringsenheten. När du använder en 56-bitars DES -nyckel kan en räknare med punkt användas .
Den pseudo-slumpmässiga sekvensen som erhålls av detta schema har en hel period: varje utdatavärde , , … baseras på ett annat räknarvärde, därför . Eftersom nyckeln är hemlig, beror inte någon hemlig nyckel på kunskapen om en eller flera tidigare hemliga nycklar. För att öka algoritmens kryptografiska styrka är det nödvändigt att vid varje steg kryptera ett slumptal med en RNG - . [41]
PRNG från ANSI X9.17-standarden används i många applikationer för ekonomisk säkerhet och PGP . Kärnan i denna PRNG är trippel DES . ANSI X9.17-generatorn består av följande delar:
De inmatade slumpmässiga värdena är och . är utgångsvärdet. Beräkning från utan kunskap är inte möjlig inom rimlig tid, och därmed nästa pseudo-slumpmässiga värde , eftersom tre ytterligare krypteringsoperationer utförs för att erhålla. [42]
Bortsett från de föråldrade, välkända LFSR-generatorerna som användes allmänt som hårdvaru-PRNGs på 1900-talet, är mycket lite känt om modern hårdvaru-PRNG, eftersom de flesta av dem är utvecklade för militära ändamål eller är patenterade och hålls hemliga . Hårdvarubaserade RLOS- generatorer Toyocrypt och LILI-128 hackades med hjälp av algebraiska attacker [43] [44] .
För närvarande är det känt om användningen av hårdvaru-PRNG:er implementerade på basis av lågeffektbrus i elektriska kretsar. [45]
Slumptalsgenerator för lotterier är ett hårdvaru-mjukvarukomplex som används i lotterier där det är nödvändigt att gissa en kombination av ett visst antal nummer. Alla möjliga tal har samma sannolikhet att inträffa.
Försök att skapa en slumptalsgenerator går tillbaka till 3500 f.Kr. e. och är förknippade med det forntida egyptiska brädspelet Senet . I Senet spelar två spelare på två sidor. Drag bestäms med hjälp av fyra platta pinnar, som kan betraktas som en slumptalsgenerator på den tiden. Kasta alla fyra pinnarna på en gång. Poängsättningen är som följer: 1 pinne föll med den vita sidan upp - 1 poäng och ytterligare ett kast; 2 - 2 poäng; 3 - 3 poäng, 4 - 4 och ett extra kast. En av pinnens sidor är svart och om alla fyra pinnarna faller med den svarta sidan uppåt är detta maxresultat - 5 poäng och ytterligare ett kast.
Den välkända slumptalsgeneratorn ERNIE har använts i många år för att fastställa det brittiska lotteriets vinnande nummer.
Huvudkraven för programvara och utrustning som används för att genomföra lotterier i Ryska federationen fastställs av federal lag nr 138-FZ av den 11 november 2003 "Om lotterier":
I ryska statliga lotterier (Gosloto 5 av 36, Gosloto 6 av 36, Gosloto 6 av 45, Gosloto 7 av 49, Gosloto 4 av 20, "Sportloto" 6 av 49 "") [47] själv- laddning av lotteritrummor används för att avgöra vinnarna . Dragningarna sänds live. [48]
I ryska statliga lotterier ("Rapido", "Keno-Sportloto", "Top-3", "12/24", "Allt för hundra"), används en slumptalsgenerator för att avgöra vinnarna - en hårdvara och mjukvara system certifierat av ANO "MIC" och uppfyller rekommendationerna från FSUE VNIIMS . Enheten genererar en kontinuerlig ström av slumpmässigt brus, som omvandlas till siffror. Vid en given tidpunkt rycks nuvarande värden från strömmen, som är den vinnande lotterikombinationen. [49]
År 2015 anklagades den tidigare säkerhetsdirektören för US Multi-State Lottery Association , efter att ha vunnit 16,5 miljoner dollar, som hade tillgång till programvara som användes i lotteridragningar, för att ha använt speciella algoritmer för att fastställa den vinnande lotterikombinationen flera dagar om året. [femtio]