ISAAC (Indirection, Shift, Accumulate, Add and Count) är en pseudo-slumptalsgenerator , utvecklad 1996 av Robert J. Jenkins Jr., som en utveckling av IA- och IBAA-algoritmerna utvecklade av honom. Denna generator är klassificerad som en krypto-resistent pseudoslumptalsgenerator , även om ett fullständigt och noggrant bevis inte har utförts.
Den amerikanske programmeraren Robert John Jenkins Jr. gick till Berkeley 1993 för att ta en doktorsexamen i teoretisk datavetenskap , efter examen från Carnegie Mellon University 1989 och fyra år vid Oracle . Trots att studier vid Berkeley var ett seriöst test för Jenkins - han var tvungen att sluta efter ett år - var det här han började sitt arbete med studier av pseudo-slumptalsgeneratorer som en del av Manuel Blums kurs i kryptografi . I juli 1993 började Jenkins experimentera med pseudoslumptal för Intel 486-processorerna, och i april 1994 hade ISAAC utvecklats. Det är sant att artikeln som beskriver hans arbete publicerades bara två år senare, i februari 1996. [ett]
RC4 [2] [3] krypteringsalgoritmen består av två steg: generering av en pseudo-slumpmässig bitsekvens och bit-för-bit summeringsmodulo två av denna klartextsekvens .
I skedet av generering av en pseudo-slumpmässig sekvens spelar n en viktig roll - storleken på S-boxen , datamatrisen, som faktiskt bestämmer det interna tillståndet för RC4 . Följande variabler används också i RC4: i och j är iteratorer som löper genom värden, en array Key of length length , där nyckeln lagras på ett speciellt sätt, och en array S (aka S-block). Utdata: array z är en pseudo-slumpmässig sekvens .
Betrakta algoritmen med n = 8 som exempel . Först fylls S -matrisen med siffror från 0 till , Key -matrisen fylls med en sekvens av n-bitars ord. Om längden på tangenten är mindre än längden på S, upprepas sekvensen tills dess längd är lika med . Då fungerar algoritmen så här:
i = 0; j = 0; medan i < 256 //256 = 2^n j = (j + S[i] + Tangent[i mod längd]) mod 256; byt S[i] och S[j]; i++;Efter detta steg - initialiseringssteget - följer steget för den faktiska genereringen av den pseudo-slumpmässiga sekvensen:
i = 0; j = 0; medan jag <256 j = (j + S[i]) mod 256; byt S[i] och S[j]; z[i] = S[(S[i] + S[j]) mod 256]; i++;Utdata är en sekvens med längden n, med hjälp av vilken klartexten sedan krypteras.
IA (Indirection, Addition) är en algoritm som utvecklades av Jenkins så att den kan uppfylla följande krav [4] :
Indata för IA-algoritmen: array S , bestående av element från 0 till , slumpmässigt fördelade över arrayen, iteratorer i och j . Utdatamatrisen z är resultatet av algoritmen. Dessutom måste värdena på cellerna i arrayen - det vill säga längden på orden - vara större än biten, Jenkins i sitt arbete tar K = 32 bitar - detta är längden på ordet som används i alla algoritmer som beskrivs här.
IBAA (Indirection, Barrelshift, Accumulate and Add) är en algoritm skapad av Jenkins baserad på IA. Författaren anser att IBAA har följande fördelar utöver de fördelar som redan finns tillgängliga för IA [5] :
Till skillnad från RC4 och IA är IBAA baserad på cykliska förskjutningar av bitdata åt vänster. IBAA-implementeringen använder samma uppsättning variabler som IA, med den enda skillnaden att ackumulatorerna a och b läggs till , såväl som barrelshift-funktionen , en funktion som utför det cykliska skiftet som nämns ovan.
barrel(j) - skiftar cykliskt alla bitar i en matris med 32 bitar åt vänster med 19 bitar. Det kan också ges av formeln , där
- bitvis XOR
Operationen >> betyder här aritmetisk förskjutning till höger .
ISAAC (Indirection, Shift, Accumulate, Add and Count) är en pseudo-slumptalsalgoritm, vars princip är svårare att komma ihåg än principerna för IA och IBAA, men den har ett antal fördelar jämfört med dem [6] . När han designade ISAAC presenterades följande lista med krav för honom:
Till skillnad från de flesta pseudo-slumptalsgeneratorer, som är baserade på strömchiffer , är ISAAC utformad utan användning av linjära återkopplingsskiftregister.
Det genomsnittliga antalet maskininstruktioner som krävs för att få ett 32-bitars värde är 18,75. 64-bitarsversionen av ISAAC (ISAAC-64) kräver 19 instruktioner för att få ett 64-bitarsvärde.
Precis som i de tidigare algoritmerna har ISAAC en array S som definierar systemets interna tillstånd, även den består av element slumpmässigt placerade i arrayen från 0 till en längd av K bitar, en iterator i och tre variabler a , b och c , ansvarig för de tidigare generatortillstånden , är utdatamatrisen z samma längd som S. Men förutom dessa variabler introduceras även variabler här , som bestämmer värdet på funktionen som beror på båda iteratorerna:
.
I sin artikel föreslår Jenkins .
Generatordriftsschemat i ett godtyckligt steg för n = 8, K = 32 är som följer:
c = c + 1; b = b + c; i = 0; medan jag <255 x = S[i]; a = f(a, i) + S[i + 128 mod 256]; S[i] = a + b + S[x>>2 mod 256]; z[i] = x + S[S[i]>>10 mod 256]; b = z[i]; i++;På sin personliga hemsida tillkännagav författaren till ISAAC en tävling för att hacka generatorn - den första som kan ange numret som används som frö ( engelsk frö) för att generera de första 2560 värdena som utfärdas av generatorn kommer att få en $ 1000 pris från Jenkins. Men hittills har ingen klarat av denna uppgift. ISAAC har dock beaktats i ett antal kryptoanalytikers skrifter.
År 2001 publicerades en artikel [7] där Marina Pudovkina beskrev en attack baserad på klartexter , med vilken du kan hitta generatorns initiala tillstånd från ett litet segment av utdata, och även gav en korrekt uppskattning av komplexiteten i en sådan attack. Genom att använda algoritmen som beskrivs i artikeln lyckades Pudovkina minska komplexiteten i hackning till , medan komplexiteten i uttömmande sökning [8] . Enligt hennes beräkningar, för , komplexiteten av sprickbildning genom uttömmande sökning är , medan du använder Pudovkina-algoritmen, kan detta antal reduceras till . En sådan komplexitet är dock fortfarande för stor för att kalla ISAAC för en sårbar pseudo-slumptalsgenerator, sammanfattar kryptoanalytikern i sin artikel.
I sitt dokument från 2006 [9] beskriver Omasson fyra uppsättningar av "svaga" initiala tillstånd som kan skära varandra. Svaga tillstånd är de tillstånd för vilka några av elementen är slumpmässiga, och de återstående elementen är lika med samma värde. Om är det initiala tillståndet kan det definieras med hjälp av relationen: , then definieras som , mängden definieras som , medan den specificeras enligt följande: . Författaren övervägde ISAAC-algoritmen med samma värden som anges ovan (dvs. n = 8, K = 32) och beräknade antalet svaga tillstånd för var och en av uppsättningarna. För detta nummer var tillstånd, för - tillstånd, för- , men är en delmängd av . Närvaron av sådana tillstånd betyder ännu inte att ISAAC lätt kan hackas, men de är potentiella svagheter i algoritmen, så Omasson föreslog en modifierad version av ISAAC - ISAAC + [10] .
ISAAC+Inmatningen vid något steg är densamma som i ISAAC, siffrorna a , b och c , arrayen S , sammansatt av 256 32-bitars ord, utmatningen är en array z med samma dimension som S . I funktionsbeskrivningen används istället för logiska bitskift >> och <<, cykliska >>> och <<<, det vill säga funktionen används
S [i] och z[i] initieras vid varje steg har också förändrats - i båda fallen används bitvis XOR. Det vill säga istället för
S[i] = a + b + S[x>>2 mod 256]; z[i] = x + S[S[i]>>10 mod 256];ISAAC+ använder:
S[i] = a ⊕ b + S[x>>>2 mod 256]; z[i] = x + a ⊕ S[S[i]>>>10 mod 256]; Attack av Paul-Pranil. KritikSamma 2006 publicerade Paul och Praenil en artikel [11] där de studerade en särskiljande attack på några strömmande RC4-liknande generatorer, inklusive IA och ISAAC . I sitt arbete visar de att komplexiteten i att bryta ISAAC bara är [12] . Omasson ignorerade inte denna attack [13] och påpekade den felaktiga initieringen av algoritmen av Paul och Prenil, på grund av vilken det blev möjligt att minska komplexiteten i att bryta den så mycket.
Många ISAAC-implementeringar är tillräckligt snabba och tillförlitliga för att denna pseudo-slumptalsgenerator har blivit ganska vanlig. ISAAC används till exempel i Unix-verktyget shred (Unix) [14] för att kryptera omskriven data. Den ISAAC-baserade slumptalsgeneratorn är implementerad i ett av de vanligaste matematiska Java-biblioteken, Apache Commons Math [15] .