ISAAC (Indirection, Shift, Accumulate, Add and Count) je generátor pseudonáhodných čísel vyvinutý v roce 1996 Robertem J. Jenkinsem Jr. jako vývoj jím vyvinutých algoritmů IA a IBAA. Tento generátor je klasifikován jako generátor pseudonáhodných čísel odolný vůči kryptoměnám , ačkoli nebyl proveden úplný a přísný důkaz.
Americký programátor Robert John Jenkins Jr. po absolvování Carnegie Mellon University v roce 1989 a čtyřech letech na Oracle odešel v roce 1993 do Berkeley , aby získal doktorát v teoretické informatice . Navzdory skutečnosti, že studium na Berkeley bylo pro Jenkinse vážnou zkouškou – musel ji po roce opustit – právě zde začal pracovat na studiu generátorů pseudonáhodných čísel v rámci kurzu Manuela Bluma o kryptografii . . V červenci 1993 začal Jenkins experimentovat s pseudonáhodnými čísly pro procesory Intel 486 a do dubna 1994 byl vyvinut ISAAC. Pravda, článek popisující jeho práci vyšel až o dva roky později, v únoru 1996. [jeden]
Šifrovací algoritmus RC4 [2] [3] se skládá ze dvou kroků: generování pseudonáhodné bitové sekvence a sčítání bit po bitu modulo dva této sekvence otevřeného textu .
Ve fázi generování pseudonáhodné sekvence hraje důležitou roli n - velikost S-boxu , datového pole, které vlastně určuje vnitřní stav RC4 . V RC4 jsou také použity následující proměnné: i a j jsou iterátory procházející hodnotami, pole Key of length length , ve kterém je klíč uložen speciálním způsobem, a pole S (aka S-blok). Výstupní data: pole z je pseudonáhodná sekvence .
Zvažte algoritmus používající n = 8 jako příklad . Nejprve je pole S vyplněno čísly od 0 do , pole Key je vyplněno posloupností n-bitových slov. Pokud je délka klíče menší než délka S, pak se sekvence opakuje, dokud není její délka rovna . Pak algoritmus funguje takto:
i = 0; j = 0; zatímco i < 256 //256 = 2^n j = (j + S[i] + Key[i délka modu]) mod 256; swap S[i] a S[j]; i++;Po této fázi - inicializační fázi - následuje fáze vlastního generování pseudonáhodné sekvence:
i = 0; j = 0; zatímco já < 256 j = (j + S[i]) mod 256; swap S[i] a S[j]; z[i] = S[(S[i] + S[j]) mod 256]; i++;Výstupem je posloupnost délky n, s jejíž pomocí se pak zašifruje otevřený text.
IA (Indirection, Addition) je algoritmus, který vyvinul Jenkins tak, aby mohl splňovat následující požadavky [4] :
Vstupní data algoritmu IA: pole S , sestávající z prvků od 0 do , náhodně rozmístěných po poli, iterátory i a j . Výstupní datové pole z je výsledkem algoritmu. Také hodnoty buněk v poli - tedy délka slov - musí být větší než bit, Jenkins ve své práci zabírá K = 32 bitů - to je délka slova, která se používá v všechny zde popsané algoritmy.
IBAA (Indirection, Barrelshift, Accumulate and Add) je algoritmus vytvořený Jenkinsem založený na IA. Autor se domnívá, že IBAA má kromě již dostupných výhod pro IA následující výhody [5] :
Na rozdíl od RC4 a IA je IBAA založen na cyklických posunech bitových dat doleva. Implementace IBAA používá stejnou množinu proměnných jako IA, jen s tím rozdílem, že jsou přidány akumulátory a a b , stejně jako funkce barrelshift , funkce, která provádí výše zmíněný cyklický posun.
barel(j) - cyklicky posouvá všechny bity v poli 32 bitů doleva o 19 bitů. Může být také dán vzorcem , kde
- bitový XOR
Operace >> zde znamená aritmetický posun doprava .
ISAAC (Indirection, Shift, Accumulate, Add and Count) je algoritmus pseudonáhodných čísel, jehož princip je hůře zapamatovatelný než principy IA a IBAA, má však oproti nim řadu výhod [6] . Při navrhování ISAAC mu byl předložen následující seznam požadavků:
Na rozdíl od většiny generátorů pseudonáhodných čísel, které jsou založeny na proudových šifrách , je ISAAC navržen bez použití posuvných registrů s lineární zpětnou vazbou.
Průměrný počet strojových instrukcí potřebných k získání 32bitové hodnoty je 18,75. 64bitová verze ISAAC (ISAAC-64) vyžaduje 19 instrukcí k získání jedné 64bitové hodnoty.
Stejně jako v předchozích algoritmech má ISAAC pole S , které definuje vnitřní stav systému, sestávající také z prvků náhodně umístěných v poli od 0 do délky K bitů, iterátoru i a tří proměnných a , b a c , odpovědné za předchozí stavy generátoru, má výstupní datové pole z stejnou délku jako S . Kromě těchto proměnných jsou zde však představeny i proměnné , které určují hodnotu funkce, která závisí na obou iterátorech:
.
Jenkins ve svém článku navrhuje .
Schéma činnosti generátoru v libovolném kroku pro n = 8, K = 32 je následující:
c = c + 1; b = b + c; i = 0; zatímco já < 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++;Na svém osobním webu autor ISAAC vyhlásil soutěž o hacknutí generátoru - ten, kdo jako první dokáže specifikovat číslo použité jako seed ( anglicky seed) pro vygenerování prvních 2560 hodnot vydaných generátorem, obdrží 1 000 $ cena od Jenkinse. S tímto úkolem se však zatím nikdo nedokázal vyrovnat. Nicméně ISAAC byl zvažován ve spisech řady kryptoanalytiků.
V roce 2001 vyšel článek [7] , ve kterém Marina Pudovkina popsala útok založený na prostých textech , pomocí kterého můžete z malého segmentu výstupních dat zjistit počáteční stav generátoru a také poskytla přesný odhad složitost takového útoku. Pomocí algoritmu popsaného v článku se Pudovkině podařilo snížit složitost hackování na , zatímco složitost vyčerpávajícího vyhledávání [8] . Podle jejích výpočtů je pro , složitost crackování vyčerpávajícím hledáním , při použití Pudovkina algoritmu by toto číslo mohlo být sníženo na . Taková složitost je však stále příliš velká na to, abychom ISAAC označili za zranitelný generátor pseudonáhodných čísel, shrnuje kryptoanalytik ve svém článku.
Omasson ve svém článku z roku 2006 [9] popisuje čtyři sady „slabých“ počátečních stavů , které se mohou vzájemně prolínat. Slabé stavy jsou stavy, pro které jsou některé prvky náhodné a zbývající prvky mají stejnou hodnotu. Jestliže je počáteční stav, pak jej lze definovat pomocí vztahu: , then je definováno jako , množina je definována jako , while je zadáno následovně: . Autor zvážil algoritmus ISAAC se stejnými hodnotami uvedenými výše (tj. n = 8, K = 32) a vypočítal počet slabých stavů pro každou ze sad. Pro toto číslo bylo států, pro - uvádí, pro - , ale je podmnožinou . Přítomnost takových stavů ještě neznamená, že ISAAC lze snadno hacknout, ale jsou potenciálními slabinami algoritmu, proto Omasson navrhl upravenou verzi ISAAC - ISAAC+ [10] .
ISAAC+Vstup je v určitém kroku stejný jako v ISAAC, čísla a , b a c , pole S , složené z 256 32bitových slov, výstup je pole z stejné dimenze jako S . V popisu funkce jsou místo logických bitových posunů >> a << použity cyklické >>> a <<<, tedy funkce
Změnil se také způsob, jakým jsou S[i] a z[i] v každém kroku iniciovány – v obou případech se používá bitový XOR. Tedy místo toho
S[i] = a + b + S[x>>2 mod 256]; z[i] = x + S[S[i]>>10 mod 256];ISAAC+ používá:
S[i] = a ⊕ b + S[x>>>2 mod 256]; z[i] = x + a ⊕ S[S[i]>>>10 mod 256]; Útok Paula-Pranila. KritikaVe stejném roce 2006 Paul a Praenil publikovali článek [11] , ve kterém studovali charakteristický útok na některé streamingové generátory podobné RC4, včetně IA a ISAAC . Ve své práci ukazují, že složitost prolomení ISAAC je pouze [12] . Omasson tento útok neignoroval [13] a poukázal na chybnou iniciaci algoritmu Paulem a Prenilem, díky čemuž bylo možné tolik snížit složitost jeho prolomení.
Mnoho implementací ISAAC je dostatečně rychlých a spolehlivých, aby se tento generátor pseudonáhodných čísel stal zcela běžným. ISAAC se používá například v unixové utilitě shred (Unix) [14] pro šifrování přepsaných dat. Generátor náhodných čísel založený na ISAAC je implementován v jedné z nejběžnějších Java matematických knihoven, Apache Commons Math [15] .