DIPLOMOVÁ PRÁCE. Matematické základy Stevensova algoritmu

Podobné dokumenty
Karel Kohout 18. května 2010

8.3). S ohledem na jednoduchost a názornost je výhodné seznámit se s touto Základní pojmy a vztahy. Definice

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

Hashovací funkce. Andrew Kozlík KA MFF UK

Základní definice Aplikace hašování Kontrukce Známé hašovací funkce. Hašovací funkce. Jonáš Chudý. Úvod do kryptologie

Necht tedy máme přirozená čísla n, k pod pojmem systém lineárních rovnic rozumíme rovnice ve tvaru

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

Lineární algebra : Polynomy

Lineární algebra Kapitola 1 - Základní matematické pojmy

PŘEDNÁŠKA 7 Kongruence svazů

0.1 Úvod do lineární algebry

Báze a dimenze vektorových prostorů

Zpracoval: 7. Matematická indukce a rekurse. Řešení rekurentních (diferenčních) rovnic s konstantními koeficienty.

Greenova funkce pro dvoubodové okrajové úlohy pro obyčejné diferenciální rovnice

Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic

Základy matematické analýzy

Afinita je stručný název pro afinní transformaci prostoru, tj.vzájemně jednoznačné afinní zobrazení bodového prostoru A n na sebe.

6 Skalární součin. u v = (u 1 v 1 ) 2 +(u 2 v 2 ) 2 +(u 3 v 3 ) 2

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

6 Lineární geometrie. 6.1 Lineární variety

Naproti tomu gramatika je vlastně soupis pravidel, jak

0.1 Úvod do lineární algebry

PŘEDNÁŠKA 2 POSLOUPNOSTI

označme j = (0, 1) a nazvěme tuto dvojici imaginární jednotkou. Potom libovolnou (x, y) = (x, 0) + (0, y) = (x, 0) + (0, 1)(y, 0) = x + jy,

9 Kolmost vektorových podprostorů

V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti

5 Orientované grafy, Toky v sítích

South Bohemia Mathematical Letters Volume 23, (2015), No. 1, DĚLENÍ KRUHU NA OBLASTI ÚVOD

Pravděpodobnost a statistika

P 1 = P 1 1 = P 1, P 1 2 =

PŘEDNÁŠKA 5 Konjuktivně disjunktivní termy, konečné distributivní svazy

Pojem binární relace patří mezi nejzákladnější matematické pojmy. Binární relace

Pravděpodobnost a její vlastnosti

1 Báze a dimenze vektorového prostoru 1

FREDHOLMOVA ALTERNATIVA

Kolik existuje různých stromů na pevně dané n-prvkové množině vrcholů?

ŠIFROVACÍ METODA ZALOŽENÁ NA FRAKTÁLNÍ KOMPRESI. 1. Úvod. V posledních letech se ukázalo, že teorii fraktálů lze využít v mnoha teoretických

Aplikovaná numerická matematika - ANM

Vybrané útoky proti hašovací funkci MD5

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Struktura a architektura počítačů (BI-SAP) 5

VI. Maticový počet. VI.1. Základní operace s maticemi. Definice. Tabulku

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Lineární algebra : Lineární prostor

Věta o dělení polynomů se zbytkem

opravdu považovat za lepší aproximaci. Snížení odchylky o necelá dvě procenta

a počtem sloupců druhé matice. Spočítejme součin A.B. Označme matici A.B = M, pro její prvky platí:

Vlastnosti regulárních jazyků

5.1. Klasická pravděpodobnst

Dijkstrův algoritmus

Matematická logika. Miroslav Kolařík

Funkce, elementární funkce.

Otázku, kterými body prochází větev implicitní funkce řeší následující věta.

Nechť je číselná posloupnost. Pro všechna položme. Posloupnost nazýváme posloupnost částečných součtů řady.

Limita a spojitost funkce. 3.1 Úvod. Definice: [MA1-18:P3.1]

Příklad 1. Řešení 1a Máme vyšetřit lichost či sudost funkce ŘEŠENÉ PŘÍKLADY Z M1A ČÁST 3

Operace s maticemi. 19. února 2018

Riemannův určitý integrál

5. Lokální, vázané a globální extrémy

METRICKÉ A NORMOVANÉ PROSTORY

Základy teorie množin

1 Mnohočleny a algebraické rovnice

Lingebraické kapitolky - Počítání s maticemi

Řešení soustav diferenčních rovnic pro

Kongruence na množině celých čísel

1 Linearní prostory nad komplexními čísly

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

Množiny, relace, zobrazení

Definice. Vektorový prostor V nad tělesem T je množina s operacemi + : V V V, tj. u, v V : u + v V : T V V, tj. ( u V )( a T ) : a u V které splňují

MATEMATICKÁ STATISTIKA. Katedra matematiky a didaktiky matematiky Technická univerzita v Liberci

Funkce komplexní proměnné a integrální transformace

Matematika III. Miroslava Dubcová, Daniel Turzík, Drahoslava Janovská. Ústav matematiky

1 Mnohočleny a algebraické rovnice

Kapitola Základní množinové pojmy Princip rovnosti. Dvě množiny S a T jsou si rovny (píšeme S = T ) prvek T je také prvkem S.

3 Lineární kombinace vektorů. Lineární závislost a nezávislost

Náhodný vektor. Náhodný vektor. Hustota náhodného vektoru. Hustota náhodného vektoru. Náhodný vektor je dvojice náhodných veličin (X, Y ) T = ( X

[1] Determinant. det A = 0 pro singulární matici, det A 0 pro regulární matici

Množinu všech slov nad abecedou Σ značíme Σ * Množinu všech neprázdných slov Σ + Jazyk nad abecedou Σ je libovolná množina slov nad Σ

3. Podmíněná pravděpodobnost a Bayesův vzorec

[1] Definice 1: Polynom je komplexní funkce p : C C, pro kterou. pro všechna x C. Čísla a 0, a 1,..., a n nazýváme koeficienty polynomu.

BAKALÁŘSKÁ PRÁCE. Podmíněné hustoty

Vektorové podprostory, lineární nezávislost, báze, dimenze a souřadnice

1 Co jsou lineární kódy

ANALYTICKÁ GEOMETRIE V ROVINĚ

Matice. Modifikace matic eliminační metodou. α A = α a 2,1, α a 2,2,..., α a 2,n α a m,1, α a m,2,..., α a m,n

Numerická matematika 1

Obyčejnými diferenciálními rovnicemi (ODR) budeme nazývat rovnice, ve kterých

Matice. a m1 a m2... a mn

MATICE. a 11 a 12 a 1n a 21 a 22 a 2n A = = [a ij]

Úvod do programování 7. hodina

IV. Základní pojmy matematické analýzy IV.1. Rozšíření množiny reálných čísel

Andrew Kozlík KA MFF UK

1 Vektorové prostory.

Těleso racionálních funkcí

Semestrální z předmětu MM

Úlohy nejmenších čtverců

[1] samoopravné kódy: terminologie, princip

Náhodný vektor a jeho charakteristiky

Operace s maticemi

Transkript:

Univerzita Karlova v Praze Matematicko-fyzikální fakulta DIPLOMOVÁ PRÁCE Bc. Ivan Štubňa Matematické základy Stevensova algoritmu Katedra algebry Vedoucí diplomové práce: doc. RNDr. Jiří Tůma, DrSc. Studijní program: Matematika Matematické metody informační bezpečnosti 2010

2 Na tomto místě bych chtěl poděkovat doc. RNDr. Jiřímu Tůmovi, DrSc. za pomoc, hodiny konzultací a cenné rady, kterými přispěl k dokončení mojí práce. Dále bych chtěl poděkovat svým rodičům za jejich lásku a Janke Divišové za neocenitelnou pomoc a podporu. Prohlašuji, že jsem svou diplomovou práci napsal samostatně a výhradně s použitím citovaných pramenů. Souhlasím se zapůjčováním práce. V Praze dne 11. dubna 2010 Ivan Štubňa

Obsah Kapitola 1. Úvod 5 Kapitola 2. Značení 6 Kapitola 3. Hashovací funkce 8 3.1. Hashovací funkce MD5 9 3.1.1. Popis algoritmu MD5 9 3.1.2. Popis kompresní funkce MD5Compress 10 Kapitola 4. Útoky na hashovací funkce 13 4.1. Diferenční cesty a bitconditions 14 4.2. Stevensův algoritmus 16 4.2.1. Generování dolní půlcesty 16 4.2.2. Generování horní půlcesty 18 4.2.3. Propojování horní a dolní diferenční půlcesty 18 Kapitola 5. Vlastnosti rotace 19 5.1. Vlastnosti NAF reprezentace 19 5.2. Rotace NAF reprezentace 27 5.3. Rotace obecné reprezentace 34 Kapitola 6. Volba parametrů v Stevensově algoritmu 47 6.1. Volba bitconditions q t 48 6.2. Určení čísel δf t 54 6.3. Rotace čísel 58 Kapitola 7. Závěr 61 Literatura. 62 Příloha A. Seznam konstant hashovací funkce MD5 63 Příloha B. Úpravy bitconditions 64 Příloha C. Některé hodnoty µ t 65 Příloha D. Pravděpodobnosti r dělení 66 3

Název práce: Matematické základy Stevensova algoritmu Autor: Ivan Štubňa Katedra: Katedra algebry Vedoucí diplomové práce: doc. RNDr. Jiří Tůma, DrSc. e-mail vedoucího: tuma@karlin.mff.cuni.cz OBSAH 4 Abstrakt: V předložené práci se věnujeme tématu hledání kolizí v hashovací funkci MD5. V práci se zaměřujeme na Stevensův algoritmus pro hledání diferenčních cest a řešíme některé problémy spojené s tímto algoritmem. Řešíme zejména problém rotace a voleb parametrů v průběhu jednoho kroku generování diferenční cesty. Cílem této práce je předložit matematická řešení těchto problémů a navrhnout optimalizaci Stevensova algoritmu. Klíčová slova: MD5, diferenční cesta, kolize, Stevensův algoritmus Title: Mathematical foundations of Steven s algorithm Author: Ivan Štubňa Department: The Department of Algebra Supervisor: doc. RNDr. Jiří Tůma, DrSc. Supervisor s e-mail address: tuma@karlin.mff.cuni.cz Abstract: In the present work we address the issue of finding collisions in MD5 hash function. In this work we focus on Steven s algorithm for finding the differential paths and solve some problems associated with this algorithm. We solve especially problem of the rotation and selections of parameters within one step of generating differential path. The aim of this work is to present mathematical solutions of these problems and propose an optimization of Steven s algorithm. Keywords: MD5, differential paths, collisions, Steven s algorithm

1Úvod Hashovací funkce hrají v dnešní době významnou roli a mají široké spektrum využití. Využívají se například při přenosech dat nebo v některých algoritmech pro práci s databázemi. Nás však budou zajímat hlavně kryptografické hashovací funkce, které mají využití v různých bezpečnostních protokolech, přihlašovacích a autentizačních procedurách, certifikátech a digitálních podpisech, ale také v oblasti zachování integrity dat. Zatímco na obecné hashovací funkce se nekladou větší požadavky na bezpečnost, kryptografické hashovací funkce musí být bezpečné hned z několika pohledů. Jedním z praktických využití kryptografických funkcí je ověření hesla. Hesla v databázích a systémech nebývají uložena v otevřené formě, protože by byla snadno zjistitelná nepovolaným osobám. Je uložen pouze hash hesla, se kterým se pak porovnává hash aktuálně zadaného hesla. Jiným použitím kryptografických hashovacích funkcí je ověření integrity zprávy, t.j. ověření, že zpráva nebyla modifikována. Integrita může být zajištěna tak, že spočteme hash zprávy a kdykoliv chceme ověřit, že se zpráva nezměnila, spočteme nový hash zprávy a porovnáme ho s původním. Z tohoto principu vychází i většina algoritmů pro digitální podpis, které pracují pouze s hashem zprávy a ne s celou zprávou. Použití hashovacích funkcí v digitálních podpisech má však i svoje úskalí. Protože hashovací funkce nejsou už ze své podstaty bezkolizní, je hash jedné zprávy automaticky i hashem nějaké jiné zprávy. Od hashovacích funkcí používaných v digitálních podpisech proto kromě jiného požadujeme, aby pro daný hash nebylo snadné nalézt zprávu se stejným hashem a aby nebylo snadné zkonstruovat dvě zprávy se stejným hashem. V posledních letech způsobili průlom útoky na hashovací funkce publikované Wangovou a později Stevensem, ve kterých se jim podařilo zkonstruovat zprávy se stejným hashem. Tím byla vážně narušena bezpečnost některých dnes běžně používaných hashovacích funkcí. V této práci se budeme zabývat Stevensovým algoritmem. Tento algoritmus slouží pro vytváření tzv. diferenčních cest. Na základě vytvořené diferenční cesty pak dokážeme hledat takové dvojice zpráv, o kterých na základě diferenční cesty víme, že mají stejný hash. V práci rozebereme některé problémy spojené s tímto algoritmem a poskytneme jejich matematické řešení. 5

2 Značení Jestliže nebude řečeno jinak, budeme v celém textu uvažovat m bitová čísla pro obecné m. Všechna čísla budeme tedy počítat modulo 2 m a pro vyjádření jejich reprezentace budeme používat m znaků. Jednotlivé bity reprezentace m bitového čísla budeme indexovat 0 až m 1. Bit s indexem 0 je nejméně významný bit a v posloupností bitů bude umístěn nejvíce vpravo (jako poslední bit posloupnosti). Bit s indexem m 1 je nejvíce významný bit a v posloupností bitů bude umístěn nejvíce vlevo (jako první bit posloupnosti). Použijeme běžnou konvenci, že o bitu s indexem i budeme říkat, že je i tým bitem posloupnosti (bit s indexem nula je tedy nultým bitem posloupnosti). Prvních i bitů reprezentace pak budeme rozumět bity s indexy 0 až i 1. Zavedeme následující operace: Čísla v binárním zápisu budeme zapisovat s indexem 2 (např. 1001 2 ), čísla v hexadecimální soustavě budeme zapisovat s indexem 16 (např. A12C4 16 ). Není-li řečeno jinak, budeme uvažovat čísla v desítkovém zápisu. Všechny operace + a jsou počítány implicitně modulo 2 m. X[i] bude značit bit reprezentace čísla X s indexem i, symbolem X[i..j] pak bity s indexy i až j (včetně). X r (nebo RL(X, r)) bude značit cyklickou rotaci reprezentace čísla X o r bitů vlevo, přičemž vždy budeme uvádět, jakou reprezentaci čísla rotujeme. X Y značí bitový AND čísel X a Y. X Y značí bitový OR čísel X a Y. X Y značí bitový XOR čísel X a Y. X značí doplněk čísla X. Binární znaménkovou reprezentací čísla x (označ. BSDR 1 ) rozumíme posloupnost (k i ) { 1, 0, 1} t.ž. x = m 1 i=0 2i k i (mod 2 m ). Pro práci s BSDR zavedeme následující konvence: Pro zjednodušení budeme psát x = (k i ) ve smyslu x = (k i ) m 1 i=0. Pro přehlednější zápis BSDR reprezentace (k i ) budeme používat následující značení: místo 1 budeme psát -, místo 0 budeme psát. a místo 1 budeme psát +. Zápis čísla +. - pak budeme interpretovat jako 1 2 2 +0 2 1 +( 1) 2 0. 1 z angl.: binary signed digit representation 6

2. ZNAČENÍ 7 Zápis úplné BSDR reprezentace budeme psát bez uvozovek, zápis části BSDR reprezentace budeme psát v uvozovkách. Například pro m = 3 a x = 5 jedna z možných BSDR reprezentací čísla x je +. +, první 2 znaky této reprezentace jsou. +. Abychom nemuseli rozlišovat sudou a lichou délku m vypsané BSDR reprezentace čísla (případně části BSDR reprezentace), budeme na konci reprezentace psát nejnižší bit v závorkách. Jestliže m je sudé, pak nejnižší bit reprezentace je ten uvedený před závorkou. V případě, že m je liché, pak nejnižší bit reprezentace je právě bit uvedený v závorce. Například reprezentace +.....(-) je pro m = 4 rovna +..., pro m = 5 je +... -. Dále definujeme váhu w(x) BSDR reprezentace (k i ) čísla x jako počet nenulových k i, t.j. w(x) = m 1 i=0 k i, kde x = (k i ). Protože m bitových čísel je 2 m a BSDR reprezentací je 3 m, tak některé čísla mají i víc než jednu BSDR reprezentaci. Každé číslo má však alespoň jednu BSDR reprezentaci a tou je binární reprezentace. Zvláštním tvarem BSDR reprezentace je NAF 2 reprezentace. Tato reprezentace je speciální tím, že v této reprezentaci nejsou žádné dva sousední bity nenulové (t.j. v každé dvojici bitů je aspoň jeden rovný nule). NAF reprezentace má následující vlastnosti, kterých důkaz lze najít v [2]: Při počítání modulo 2 m je jednoznačná až na bit s indexem m 1, protože 2 m 1 = 2 m 1 (mod 2 m ). Proto zavedeme konvenci, že v každé NAF reprezentaci (k i ) platí k m 1 {0, 1}. Pro každé číslo existuje aspoň jedna NAF reprezentace. Mezi všemi BSDR reprezentacemi čísla x má NAF reprezentace nejmenší váhu. Podobně jako u sčítání binárních čísel používáme pojem přenos, zavedeme tento pojem i pro sčítání dvou BSDR reprezentací. Definice. Mějme dvě čísla x = (k i ) a y = (l i ). Položme ω 1 = 0 a dále pro i = 0,..., m 1 položíme ω i = k i + l i + ω i 1 div 2, kde operace div 2 je operace div 2, která ale zachovávává znaménko děleného čísla. Hodnotu ω i { 1, 0, 1} nazveme přenosem z bitů s indexem i. Dále řekneme, že nastal přenos do bitu s indexem i, jestliže ω i 1 0. Je dobré si uvědomit, že i když rozdíl dvou bitů binárních reprezentací dvou čísel je z množiny { 1, 0, 1}, tak rozdíl dvou bitů obecných BSDR reprezentací dvou čísel je z množiny { 2, 1, 0, 1, 2}. 2 z angl.: non-adjacent form

3 Hashovací funkce Hashovací funkcí rozumíme zobrazení h : {0, 1} {0, 1} k, kde k je délka výstupu hashovací funkce. Výstup hashovací funkce nazýváme hash. Neformálně tedy můžeme říci, že hashovací funkce vrátí pro libovolně dlouhý text hash fixní délky. V praxi se používají některé obvyklé hodnoty délky hashů. Z hlediska bezpečnosti se v současné době doporučuje používat hashovací funkce, které mají výstup 160 a více bitů. Na hashovací funkci běžně klademe následující požadavky. V prvním řadě by hashovací funkce měla být rychle vypočítatelná pro vstupy libovolné délky. Další vlastností požadovanou u hashovacích funkcí je jednosměrnost (z angl. one way). Jednosměrností se u hashovacích funkcí myslí vlastnost, kdy je snadné spočítat hash, ale je obtížné hashovací funkci invertovat, t.j. najít původní vstup k danému hash. Někdy se také používá pojem hashovací funkce s padacími vrátky, kdy se padacími vrátky myslí nějaká nápověda, díky které je snadné hashovací funkci invertovat. V neposlední řadě od hashovací funkce požadujeme, aby malá změna vstupu vedla k velké změně hashe. Pokud bychom tedy ve zprávě změnili byť jen jediné písmeno, tak na výstupu dostaneme úplně jiný hash. Takto definované hashovací funkce mají dobré využití v různých aplikacích (např. detekce chyb v komunikaci nebo některé programátorské techniky). V kryptografii však od hashovacích funkcí požadujeme ještě další vlastnost a to bezkoliznost. I když hashovací funkce provádí dobrou náhodnou distribuci výsledků a rovnoměrné pokrytí hodnot, tak stále platí, že počet možných výstupů hashovací funkce je menší než počet možných vstupů. Z platnosti Dirichletova principu (přihrádkový princip) pak plyne nutnost existence kolizí, t.j. dvojic vstupních zpráv (x, y), že h(x) = h(y). Na hashovací funkce používané v kryptografii proto klademe ještě následující požadavky: odolnost vůči nalezení prvního vzoru (preimage resistance) není snadné pro pevně danou hodnotu H {0, 1} k nalézt takovou zprávu M {0, 1}, že platí H = h(m) odolnost vůči nalezení druhého vzoru (second preimage resistance) není snadné pro pevně danou zprávu M nalézt jinou zprávu M, t.ž. h(m) = h(m ) odolnost vůči nalezení kolize (collision resistance) není snadné nalézt dvě různé zprávy M, M, t.ž. h(m) = h(m ) 8

3.1. HASHOVACÍ FUNKCE MD5 9 Můžeme si všimnout, že odolnost vůči nalezení kolize neimplikuje odolnost vůči nalezení vzoru. Ukážeme si to na následujícím příkladu. Nechť g je hashovaci funkce odolná vůči nalezení kolize a nechť převádí řetězec libovolné konečné délky na n bitový řetězec. Definujme funkci h takto: { 1 x, jestliže x má bitovou délku n; h(x) = 0 g(x), jinak. Funkce h má tedy (n + 1) bitový výstup a je odolná vůči nalezení kolize (není snadné nalézt dvě zprávy se stejným hashem). Není však odolná vůči nalezení prvního vzoru, protože pro hodnoty hashe, který má první bit 1, dokážeme nalézt vzor. V posledních letech se objevují postupy, pomocí kterých je možné pro některé běžně používané funkce nalézt kolize. Tyto funkce se pak stávají zneužitelné pro falšování podpisů (např. v e mailech) nebo pro padělání certifikátů. Tím se však nesnižuje použitelnost těchto hashovacích funkcí v některých jiných aplikacích, protože k dané hodnotě hash nejsme schopni nalézt její vzor (např. uložené hashe hesel pro přihlašování k aplikacím). 3.1. Hashovací funkce MD5 Hashovací funkce MD5 1 byla představena Ronaldem Rivestem v roce 1992 jako zesílená verze hashovací funkce MD4. V současné době však již byly objeveny slabiny i v MD5 a tato hashovací funkce je postupně nahrazována bezpečnějšími hashovacími funkcemi. Podrobný popis hashovací funkce MD5 je možné najít v [1]. V dalším textu uvedeme hlavní princip MD5. 3.1.1. Popis algoritmu MD5 Vstupem hashovací funkce MD5 je text libovolné délky. Jejím výstupem je pak vždy 128 bitový řetězec, který se nazývá hash (někdy se používá pojem otisk). V celém algoritmu je sekvence bitů reprezentována obvyklým způsobem, tedy posloupností bitů 0 a 1, přičemž nejvýznamnější bit je umístěn vlevo (první bit posloupnosti). Číslo 2 tedy bude reprezentováno posloupností bitů 00000010 2. Algoritmus MD5 můžeme rozdělit na několik následujících kroků. 3.1.1.1. Padding Vstupní zpráva je nejprve doplněna na správnou délku pomocí řetězce znaků, kterému se říká padding. Paddingem je zpráva doplněna na délku kongruentní 448 modulo 512 tak, že na konec zprávy je přidán bit 1 a pak potřebný počet bitů 0. Padding se přidává i ke zprávě, které délka je přímo kongruentní 448 modulo 512, t.j. na konec zprávy je vždy přidán aspoň 1 bit, maximálně však 512 bitů. 1 Message-Digest Algorithm v5

3.1. HASHOVACÍ FUNKCE MD5 10 Na konec zprávy je po přidání paddingu přidaná ještě 64 bitová reprezentace délky zprávy bez paddingu (přičemž nejprve je přidáno dolních 32 bitů vyjádření délky zprávy a potom horních 32 bitů). Je-li délka zprávy větší než 2 64 bitů, pak se použije pouze nižších 64 bitů. V této chvíli je délka zprávy rovná 512 N, kde N je nějaké přirozené číslo. 3.1.1.2. Rozdělení zprávy do bloků Zpráva je po doplnění na správnou délku rozdělená na N bloků M 1, M 2,..., M N, z nichž každý blok M i, kde i = 1,..., N, má délku 512 bitů. 3.1.1.3. Komprese zprávy Algoritmus MD5 pracuje se zásobníkem, který sestává ze čtyř 32 bitových registrů označovaných A, B, C, D. Na počátku jsou registry inicializované na následující předdefinované hodnoty: A = 67 45 23 01 16 B = ef cd ab 89 16 C = 98 ba dc fe 16 D = 10 32 54 76 16 Komprese zprávy spočívá v použití kompresní funkce MD5Compress, která je volaná N krát. Tuto funkci podrobněji popíšeme v Kapitole 3.1.2. Vstupem kompresní funkce je aktuální hodnota zásobníku a 512 bitový blok textu M i. Její výstupem je pak nová hodnota zásobníku. Označme hodnotu zásobníku před i tým voláním funkce MD5Compress jako IHV i 2. Hodnota IHV 0 je tedy rovna hodnotě zásobníku inicializovaného na předdefinované hodnoty registrů a pro i = 1,..., N je hodnota IHV i spočítaná ze vztahu 3.1.1.4. Výstup algoritmu IHV i = MD5Compress(M i, IHV i 1 ). Výstupem algoritmu MD5 je poslední hodnota zásobníku, tedy hodnota IHV N, která vznikne zřetězením jednotlivých registrů A, B, C, D v reprezentaci Little Endian (začneme nejnižším bytem registru A a skončíme nejvyšším bytem registru D). Jako příklad uvedeme zásobník IHV 0, který má po zřetězení tvar 01 23 45 67 89 ab cd ef fe dc ba 98 76 54 32 10 16. 3.1.2. Popis kompresní funkce MD5Compress Vstupem kompresní funkce MD5Compress(M i, IHV i 1 ) při jejím i-tém voláním je hodnota zásobníku IHV i 1 a 512 bitový řetězec M i. Označme hodnotu registrů zásobníku na vstupu kompresní funkce IHV i 1 = (a, b, c, d). Kompresní funkce 2 z angl. intermediate hash value

3.1. HASHOVACÍ FUNKCE MD5 11 sestává ze 64 kroků. Na tyto kroky můžeme nahlédnout jako na 4 po sobě jdoucí rundy, ze kterých každá má 16 kroků (protože v každé rundě se používají stejné sady funkcí a konstant). V každém kroku kompresní funkce se používají operace sčítání modulo 2 32, cyklická rotace vlevo, nelineární funkce, rotační a adiční konstanta. Nejprve popíšeme jednotlivé funkce a konstanty používané v kompresní funkci MD5Compress. Adiční konstanta AC t je v závislosti na daném kroku t definovaná předpisem: AC t = 2 32 sin(t + 1) t = 0,..., 63 Rotační konstanta RC t je definovaná předpisem: (7, 12, 17, 22) t = 0, 4, 8, 12 (5, 9, 14, 20) t = 16, 20, 24, 28 RC t = (4, 11, 16, 23) t = 32, 36, 40, 44 (6, 10, 15, 21) t = 48, 52, 56, 60 Vstupem nelineární funkce f t (X, Y, Z) jsou 32 bitové hodnoty X, Y, Z, výstupem je pak 32 bitová hodnota. V závislosti na kroku t je nelineární funkce definovaná předpisem: F (X, Y, Z) = (X Y ) ( X Z) 0 t < 16 G(X, Y, Z) = (X Z) (Y Z) 16 t < 32 f t = H(X, Y, Z) = X Y Z 32 t < 48 I(X, Y, Z) = Y (X Z) 48 t < 64 Vstupní 512 bitový řetězec M i je rozdělen na 16 řetězců m 0,..., m 15, z nichž každý má 32 bitů. Z těchto řetězců m t je vytvořeno 64 řetězců W t podle předpisu: m t 0 t < 16 m (1+5t) mod 16 16 t < 32 W t = m (5+3t) mod 16 32 t < 48 m 7t mod 16 48 t < 64 Nyní přistoupíme k popisu samotné kompresní funkce. Kompresní funkce pracuje se stavovými registry (každý má 32 bitů), které označíme Q 3, Q 2,..., Q 64. Stavové registry Q 3, Q 2, Q 1, Q 0 jsou inicializovány hodnotou zásobníku IHV i 1 na vstupu na hodnoty (Q 0, Q 1, Q 2, Q 3 ) = (b, c, d, a). Hodnoty ostatních stavových registrů jsou spočítané v 64 krocích (číslovaných od 0 po 63, přičemž v kroku t se počítá hodnota Q t+1 ) a to z následujících vztahů (značení RL(T, RC) znamená cyklickou rotaci řetězce T o RC bitů vlevo): F t = f t (Q t, Q t 1, Q t 2 ) T t = F t + Q t 3 + W t + AC t R t = RL(T t, RC t ) Q t+1 = R t + Q t

3.1. HASHOVACÍ FUNKCE MD5 12 Jeden krok kompresní funkce vyjádřuje následující obrázek (zde znamená operaci XOR): W t AC t Q t 3 RCt Q t 2 Q t Q t 1 f Q t+1 Q t 2 t Q t Q t 1 Obrázek 3.1. Krok kompresní funkce MD5. Po vykonání všech kroků kompresní funkce se hodnota registrů zásobníku IHV i (výstup kompresní funkce MD5Compress) spočítá ze vztahu IHV i = MD5Compress(M i, IHV i i ) = (a + Q 61, b + Q 64, c + Q 63, d + Q 62 ).

4 Útoky na hashovací funkce V roce 2004 Wang et. al. [3] prezentovala na konferenci Crypto 04 dvojici kolidujících zpráv pro hashovací funkci MD5. Do té doby byly prezentovány pouze pseudo kolidující dvojice zpráv, u kterých byly zjednodušeny některé předpoklady. V roce 2005 pak Wang et. al. [4] prezentovala na konferenci Eurocrypt 2005 základné principy metody, pomocí které byla nalezena dříve prezentovaná dvojice kolidujících zpráv. Metoda spočívala v nalezení tzv. diferenční cesty. Wangová též předvedla manuálně spočítanou diferenční cestu, neprezentovala však způsob, jakým byla diferenční cesta sestrojena. Kolize představená Wangovou spočívala v nalezení dvoublokové kolize, t.j. dvou párů následujících bloků zpráv délky 512 bitů t.ž. {M 1, M 2 } {M 1, M 2}. Pro inicializační vektory IHV 0 = IHV 0 byl pak rozdíl vzniklý při hashování prvního bloku zpráv eliminovaný při hashování druhého bloku zpráv. Tento útok je aplikovatelný pro libovolnou hodnotu IHV 0, t.ž. IHV 0 = IHV 0. Princip útoku Wangové můžeme znázornit následovně (zde M značí hashování bloku M): M IHV 1 M 0 2 IHV1 IHV2 = = IHV 0 M 1 IHV 1 M 2 IHV 2 V roce 2005 Yajima a Shimoyama [5] ukázali, že podmínky spočítané v diferenční cestě Wangové nejsou postačující. Od té doby došlo k mnohým vylepšením hledání kolidujících zpráv, které vycházeli z metody Wangové. Jedno vylepšení publikoval v roce 2006 Klíma [6]. Jednalo se o novou metodu modifikace zpráv, tzv. tunely, která umožnila zrychlení algoritmu pro hledání kolidujících zpráv. V roce 2007 popsal Stevens [7] ve své práci algoritmus, pomocí kterého lze automatizovat generování diferenčních cest. Pomocí tohoto algoritmu bylo možné sestrojit tzv. chosen prefix collisions, t.j. kolize dvou zpráv M a M s volitelným textem P a P na začátku těchto zpráv. Po doplnění těchto zpráv dopočítaným textem S a S (t.j. M = P S a M = P S ) pak platí MD5(M) = MD5(M ). Pro inicializační vektory IHV 0 IHV 0 je tedy možné sestrojit posloupnost diferenčních cest vedoucích ke kolizi. Krátce poté se objevili i praktické aplikace Stevensovy práce, např. generování kolidujících certifikátů popsané v [8]. Pomocí implementací Stevensova algoritmu 13

4.1. DIFERENČNÍ CESTY A BITCONDITIONS 14 byly sestrojeny i další diferenční cesty, např. [9]. V roce 2008 prezentoval Stevens et. al. [10] reálnou aplikaci generování kolidujících certifikátů. Povedlo se jim sestrojit podvržený certifikát CA, který byl akceptován běžnými webovými prohlížeči. Podrobný popis útoku byl pak popsán v [11]. V dalším textu si popíšeme metodu hledání diferenční cest a pak stručně rozebereme hlavní principy Stevensova algoritmu. 4.1. Diferenční cesty a bitconditions Diferenční cesta popisuje rozdíly dvou výpočtů kompresní funkce MD5Compress hashovací funkce MD5 při dvou vstupech (M, IHV ) a (M, IHV ). Přesněji řečeno, popisuje rozdíly stavových registrů Q i v průběhu 64 kroků hashovací funkce MD5, a jak se tyto rozdíly promítají do jednotlivých kroků výpočtu. Samotná diferenční cesta však popisuje pouze rozdíly δq i = Q i Q i. Samotné hodnoty Q i a Q i jsou v průběhu její konstrukce neznámé a jsou dopočítány až při konkrétní realizaci této diferenční cesty. Pro popis rozdílů jsou použity dva typy rozdílů stavových registrů: diferenční rozdíl a XOR rozdíl. Hodnotu diferenčního rozdílu dvou čísel X, X budeme označovat δx a je daná vztahem δx = X X. XOR rozdíl popisuje rozdíl dvou čísel podrobněji a to až na úrovni jednotlivých bitů. XOR rozdíl čísel X, X budeme označovat X a je dán vztahem X = (k i ) 31 i=0, kde k i = X [i] X[i]. Můžeme si všimnout, že XOR rozdíl X určuje jednu z možných BSDR reprezentací čísla δx. Můžeme snadno nahlédnout, že oba typy rozdílů určují tu samou hodnotu, tedy že platí δt T, neboť δt = 31 i=0 2i k i. Navíc platí, že XOR rozdíl přímo určuje hodnotu diferenčního rozdílu dvou čísel, avšak neplatí to naopak. Jako příklad můžeme uvést hodnotu diferenčního rozdílu δt = 5. Možné hodnoty XOR rozdílu jsou pak X = 2 2 + 2 0, ale i X = 2 2 + 2 1 2 0. Samotné rozdíly v průběhu jednoho výpočtu kompresní funkce MD5Compress můžeme vyjádřit pomocí následujících vztahů: δf t = f t (Q t, Q t 1, Q t 2) f t (Q t, Q t 1, Q t 2 ) δt t = δf t + δq t 3 + δw t δr t = RL(T t, RC t ) RL(T t, RC t ) δq t+1 = δq t + δr t. V dalším textu ukážeme, že hodnota δf t není určena jednoznačně rozdíly Q t, Q t 1 a Q t 2 a stejně tak hodnota δr t není jednoznačně určena hodnotou δt t a RC t. Na problém rotace a určení hodnoty δr t se podíváme v Kapitole 5. Abychom vyřešili nejednoznačnost hodnoty δf t, zavedeme podmínky na bity XOR rozdílu čísel Q t a Q t (pro všechna t), které budeme nazývat bitconditions. Každá bitcondition tedy upřesňuje hodnotu jednotlivých bitů čísel Q t a Q t. Podmínku na i tý bit XOR rozdílu Q t čísel Q t a Q t budeme značit q t [i], všech 32 podmínek na bity tohoto rozdílu budeme značit q t. Platí tedy q t = (q t [i]) 31 i=0.

4.1. DIFERENČNÍ CESTY A BITCONDITIONS 15 Každá bitcondition určuje na základě Q t [i] přímo nebo nepřímo původní bity Q t [i] a Q t[i]. Přímým určením bitů (Q t [i], Q t[i]) rozumíme, že hodnota těchto bitů nezávisí na jiných bitech. Nepřímým určením bitů (Q t [i], Q t[i]) pak rozumíme to, že hodnota těchto bitů závisí na jiných bitech, v našem případě to bude konkrétně na bitech Q t 2 [i], Q t 1 [i], Q t+1 [i], Q t+2 [i]. Budeme rozlišovat dva typy bitconditions: differential bitconditions a boolean function bitconditions. Pro jejich značení použijeme konvenci převzatou z [7]. Differential bitconditions popsané v Tabulce 4.1 jsou přímé a určují hodnoty k i = Q t[i] Q t [i]. Můžeme si všimnout, že δq t = 31 i=0 2i k i a Q t = (k i ). q t [i] podmínky na Q t [i] a Q t[i] k i. Q t [i] = Q t[i] 0 + Q t [i] = 0, Q t[i] = 1 +1 - Q t [i] = 1, Q t[i] = 0 1 Tabulka 4.1. Differential bitconditions. Z Tabulky 4.1 vidíme, že všechny podmínky až na q t [i] =. určují bity Q t [i] a Q t[i] jednoznačně. Právě tato nejednoznačnost způsobuje v některých případech nejednoznačnost F t [i]. Ukážeme si to na následujícím příkladě. Víme, že platí F t [i] = f t (Q t[i], Q t 1[i], Q t 2[i]) f t (Q t [i], Q t 1 [i], Q t 2 [i]) { 1, 0, 1}. Předpokládejme, že máme bitconditions (q t [i], q t 1 [i], q t 2 [i]) = (., +, -). Pak hodnota F t [i] není určena jednoznačně, protože: je-li Q t [i] = Q t[i] = 0, pak F t [i] = f t (0, 1, 0) f t (0, 0, 1) = 1; je-li Q t [i] = Q t[i] = 1, pak F t [i] = f t (1, 1, 0) f t (1, 0, 1) = +1. Pro odstranění nejednoznačnosti při volbě bitů F t se používají již zmíněné boolean function bitconditions, které blíže specifikují podmínku q t =.. Jejich přehled uvádíme v Tabulce 4.2. q t [i] podmínky na Q t [i] a Q t[i] přímá/nepřímá směr 0 Q t [i] = Q t[i] = 0 přímá 1 Q t [i] = Q t[i] = 1 přímá ^ Q t [i] = Q t[i] = Q t 1 [i] nepřímá dozadu v Q t [i] = Q t[i] = Q t+1 [i] nepřímá dopředu! Q t [i] = Q t[i] = Q t 1 [i] nepřímá dozadu y Q t [i] = Q t[i] = Q t+1 [i] nepřímá dopředu m Q t [i] = Q t[i] = Q t 2 [i] nepřímá dozadu w Q t [i] = Q t[i] = Q t+2 [i] nepřímá dopředu # Q t [i] = Q t[i] = Q t+2 [i] nepřímá dozadu h Q t [i] = Q t[i] = Q t+2 [i] nepřímá dopředu? Q t [i] = Q t[i] (Q t [i] = 1 Q t 2 [i] = 0 nepřímá dozadu q Q t [i] = Q t[i] (Q t+2 [i] = 1 Q t [i] = 0 nepřímá dozadu Tabulka 4.2. Boolean function bitconditions.

4.2. STEVENSŮV ALGORITMUS 16 4.2. Stevensův algoritmus V této kapitole popíšeme algoritmus pro konstrukci diferenčních cest, který popsal Marc Stevens ve své práci [7]. V popisu algoritmu použijeme značení používané v jeho práci. Algoritmus 4.2.1. VSTUP: počáteční hodnota δihv (nebo přímo bitconditions (q i ) 0 i= 3 ); koncová hodnota δihv (nebo přímo bitconditions (q i ) 63 i=60 ); rozdíl zpráv δm = (δm i ) 15 i=0 ; hraniční krok K (většinou K = 12) VÝSTUP: diferenční cesta splňující zadané podmínky 1. Na základě dané hodnoty δihv urči bitconditions (q i ) 0 i= 3. Na základě dané hodnoty δihv urči bitconditions (q i ) 63 i=60. 2. [Generování dolní diferenční půlcesty] Spočítej nějakou dolní diferenční půlcestu rozšířením (q i ) 0 i= 3 od kroku 0 až do kroku K. 3. [Generování horní diferenční půlcesty] Spočítej nějakou dolní diferenční půlcestu rozšířením (q i ) 63 i=60 od kroku 62 až do kroku K + 5. 4. [Propojování horních a dolních diferenčních půlcest] Pokus se propojit horní a dolní půlcestu přes zbývající kroky K + 1, K + 2, K + 3, K + 4. 5. IF propojení úspěšné THEN RETURN (q i ) 63 i= 3 ELSE GOTO 1. Dolní diferenční půlcestou tedy budeme rozumět seznam podmínek q 1,..., q K na hodnoty δq 1,..., δq K. Horní diferenční půlcestou pak budeme rozumět seznam podmínek q K+5,..., q 63 na hodnoty δq K+5,..., δq 63. Jeden krok při generování horní (příp. dolní) diferenční půlcesty odpovídá jednomu kroku výpočtu MD5Compress. Podrobněji generování půlcest popíšeme v následujících částech. Propojování vygenerované horní a dolní diferenční půlcesty v kroku 4. Stevensova algoritmu je ve většině případů neúspěšné. Je proto potřebné vygenerovat mnoho párů horních a dolních diferenčních půlcest, než se podaří nějaký pár propojit. Krok K = 12 je často volen jako hraniční krok pro generování diferenčních půlcest hned z několika důvodů. Při propojování půlcest je potřebné ponechat dostatečnou volnost pro propojování ve smyslu volnosti při volbě bitů Q t a Q t, které jsou určeny pomocí bitconditions. Dalším důvodem je možnost využívat některá vylepšení, např. tunely. 4.2.1. Generování dolní půlcesty Nyní si popíšeme jeden krok generování dolní půlcesty. Předpokládejme krok t. Předpokládejme, že všechny nepřímé bitconditions q t 1, q t 2 používané v tomto výpočtu jsou směrem dopředu a neovlivňují bity δq t.

4.2. STEVENSŮV ALGORITMUS 17 Algoritmus 4.2.2 (Jeden krok generování dolní půlcesty). VSTUP: hodnoty δq t a δq t 3 ; bitconditions q t 1 a q t 2 VÝSTUP: hodnota δq t+1 ; bitconditions q t 1. Na základě hodnoty δq t urči bitconditions q t. 2. Pro i = 0,..., 31 uprav bitconditions (q t [i], q t 1 [i], q t 2 [i]) tak, aby jednoznačně určovaly hodnotu g i { 1, 0, 1}. 3. Spočítej hodnotu δf t = 31 i=0 2i g i. 4. Spočítej hodnotu δt t = δf t + δq t 3 + δw t. 5. Urči nějakou BSDR reprezentaci F t čísla δf t. 6. Spočítej R t = ( T t ) RCt. Z reprezentace R t spočítej hodnotu δr t. 7. Spočítej δq t+1 = δq t + δr t. 8. RETURN δq t+1, q t. Na některé kroky generování se teď podíváme podrobněji. 4.2.1.1. Určení bitconditions q t Chceme určit bitconditions q t na základě hodnoty δq t. Z předchozího textu víme, že differential bitconditions odpovídají BSDR reprezentaci daného čísla. Nejpřímější cestou k určení bitconditions q t je proto určení nějaké BSDR reprezentace čísla δq t, která přímo určuje differential bitconditions podle Tabulky 4.1. 4.2.1.2. Určení hodnoty δf t V kroku 2. chceme na základě bitconditions určit hodnoty g i { 1, 0, 1}, ze kterých pak v kroku 3. spočítáme hodnotu δf t. Vidíme tedy, že hodnoty g i ve skutečnosti určují nějakou BSDR reprezentaci čísla δt. V předchozím textu jsme ukázali, že hodnoty g i nejsou na základě bitconditions q t, q t 1, q t 2 určeny vždy jednoznačně, můžeme dostat několik různých hodnot δf t. Musíme proto upřesnit bitconditions q t, q t 1, q t 2 pomocí boolean function bitconditions uvedených v Tabulce 4.2. Právě z tohoto důvodu požadujeme, aby všechny nepřímé bitconditions byly směrem dopředu. Všechny úpravy differential bitconditions můžou být předpočítány, tabulku s jejich předpočítanými úpravami uvádíme v Příloze B. 4.2.1.3. Určení hodnoty δr t V krocích 5. a 6. potřebujeme rotovat hodnotu δt t a určit hodnotu δr t. Při rotaci však nemůžeme rotovat samotnou hodnotu δt t, rotovat můžeme pouze nějakou její BSDR reprezentaci. Každá BSDR reprezentace čísla δt určuje po rotaci v závislosti na svém tvaru BSDR reprezentaci nějakého čísla. Hodnota čísla po rotaci proto závisí na zvolené BSDR reprezentaci čísla δt t. Podrobněji se tímto problémem budeme zabývat v Kapitole 5.

4.2.2. Generování horní půlcesty 4.2. STEVENSŮV ALGORITMUS 18 Generování horní půlcesty je podobné generování dolní půlcesty, liší se pouze v následnosti kroků. Předpokládejme krok t. Předpokládejme, že všechny nepřímé bitconditions q t, q t 1 používané v tomto výpočtu jsou směrem dozadu a neovlivňují bity δq t 2. Algoritmus 4.2.3 (Jeden krok generování horní půlcesty). VSTUP: hodnoty δq t+1 a δq t 2 ; bitconditions q t a q t 1 VÝSTUP: hodnota δq t 3 ; bitcondition q t 1. Na základě hodnoty δq t 2 urči bitconditions q t 2. 2. Pro i = 0,..., 31 uprav bitconditions (q t [i], q t 1 [i], q t 2 [i]) tak, aby jednoznačně určovaly hodnotu g i { 1, 0, 1}. 3. Spočítej hodnotu δf t = 31 i=0 2i g i. 4. Spočítej hodnotu δr t = δq t+1 δq t. 5. Urči nějakou BSDR reprezentaci R t čísla δr t. 6. Spočítej T t = ( R t ) 32 RCt. Z reprezentace T t spočítej hodnotu δt t. 7. Spočítej δq t 3 = δt t δf t δw t. 8. RETURN δq t 3, q t 2. 4.2.3. Propojování horní a dolní diferenční půlcesty Po vygenerování dolní diferenční půlcesty Algoritmem 4.2.2 máme spočítané hodnoty δq 3,..., δq K+1, hodnoty δf 0,..., δf K, hodnoty δr 0,..., δr K a sadu bitconditions q 3,..., q K. Po vygenerování horní diferenční půlcesty Algoritmem 4.2.3 máme spočítané hodnoty δq K+2,..., δq 63, hodnoty δf K+5,..., δf 63, hodnoty δr K+5,..., δr 63 a sadu bitconditions q K+3,..., q 63. Zbývá dopočítat zbylé hodnoty δf K+1,..., δf K+4, δr K+1,..., δf K+4. To můžeme udělat podobně jako v Algoritmu 4.2.3. Na základě spočítaných hodnot δq i spočítáme pro t = K + 4, K + 3, K + 2, K + 1 hodnotu δr t = δq t+1 δq t, pak spočítáme hodnotu δt t a nakonec spočítáme hodnotu δf t = δt t δw t δq t 3. Pro dokončení diferenční cesty pak potřebujeme dopočítat bitconditions q K+1 a q K+2. Naším cílem je tedy určit bitconditions q K 1, q K, q K+1, q K+2, q K+3, q K+4, které jsou kompatibilní se spočtenými bitconditions q K 1, q K, q K+3, q K+4 a které vedou na spočítané hodnoty δq K+1, δq K+2, δf K+1, δf K+2, δf K+3, δf K+4. Výpočet je prováděn od nejnižších bitů po nejvyšší, přičemž pro každý bit i jsou zvoleny podmínky q K+1 [i], q K+2 [i] na základě hodnot δq K+1, δq K+2 a podmínky jsou upraveny tak, aby platili všechny požadované rovnice. Podrobnosti o tomto algoritmu je možné nalézt v [7] v kapitole 6.5.

5 Vlastnosti rotace V této kapitole se podrobněji podíváme na rotaci čísel a odvodíme některé vlastnosti s tím spojené. Nejprve si však řekneme několik poznatků, které jsou pro danou problematiku potřebné. Rotací čísla budeme v celém textu rozumět cyklickou rotaci, přičemž vždy implicitně řekneme, o kolik bitů budeme dané číslo rotovat. Při rotaci čísla rotujeme ve skutečnosti nějakou jeho reprezentaci. Musíme proto vždy uvést, jakou BSDR reprezentaci daného čísla budeme rotovat. Na zvolené BSDR reprezentaci čísla pro rotaci závisí i hodnota, kterou dostaneme po rotaci této BSDR reprezentace. Rotací ve skutečnosti dostaneme opět BSDR reprezentaci, která jednoznačně určuje nějakou hodnotu. Ukážeme si to na následujícím příkladě. Mějme následující dvě různé reprezentace čísla 5: BSDR(5) =. +. + (= 2 2 + 2 0 ) BSDR(5) = + -. + (= 2 3 2 2 + 2 0 ) Rotujme obě reprezentace o 1 bit doleva, pak dostáváme: (. +. +) 1 = +. +. (= 2 3 + 2 1 = 10) (+ -. +) 1 = -. + + (= 2 3 + 2 1 + 2 0 = 11 mod 16) Vidíme tedy, že i když jsme před rotací měli BSDR reprezentace toho samého čísla, tak po rotaci jsme dostali v prvním případě BSDR reprezentaci čísla 10, v druhém případě BSDR reprezentaci čísla 11. Stejně tak bychom mohli najít takové BSDR reprezentace dvou různých čísel, kterých rotací bychom dostali BSDR reprezentace toho samého čísla (např. zpětná rotace v předchozím příkladě). Uvedené příklady ukazují, že vlastnosti rotace jsou závislé na volbě BSDR reprezentace čísla před rotací. V dalším textu odvodíme pravidla pro určení hodnoty čísla po rotaci a některé vlastnosti týkající se samotné rotace a s tím spojené volby reprezentace čísla. Nejprve na zaměříme na rotaci NAF reprezentace čísel, potom se podíváme i na rotaci obecné reprezentace. 5.1. Vlastnosti NAF reprezentace V této kapitole odvodíme některé vlastnosti NAF reprezentace čísel. V celé kapitole budeme sledovat přenosy v NAF reprezentacích čísel při přičítání čísla 1. 19

5.1. VLASTNOSTI NAF REPREZENTACE 20 Naším cílem bude pro pevně dané číslo s určit ta čísla, u kterých dochází při přičtení čísla 1 k přenosu v jejich NAF reprezentaci z nejnižších s bitů do vyšších bitů. To později využijeme k tomu, abychom dokázali určit hodnoty čísel po rotaci jejich NAF reprezentace, ovšem bez znalosti samotné NAF reprezentace. Všechny úvahy budeme dělat obecně pro m bitová čísla (tedy všechna čísla uvažujeme modulo 2 m ), protože jejich platnost se se změnou m neporuší. Nejprve uvedeme algoritmus, který z NAF reprezentace čísla x určí NAF reprezentaci čísla x + 1. Algoritmus 5.1.1. VSTUP: NAF reprezentace čísla x VÝSTUP: NAF reprezentace čísla x + 1 1. SET i := 0, NAF(x + 1) := NAF(x). 2. WHILE i < m DO CASE NAF(x)[i + 1, i] OF 2a... : SET NAF(x + 1)[i + 1, i] :=. + ; BREAK. 2b.. - : SET NAF(x + 1)[i + 1, i] :=.. ; BREAK. 2c.. + : SET NAF(x + 1)[i] :=. ; i := i + 1. 2d. -. : SET NAF(x + 1)[i + 1, i] :=. - ; BREAK. 2e. +. : SET NAF(x + 1)[i + 1, i] :=. - ; i := i + 2. 3. RETURN NAF(x + 1). Tvrzení 5.1.2. Algoritmus 5.1.1 vrátí na výstupu NAF reprezentaci čísla x + 1. Důkaz. Mějme NAF reprezentaci čísla x. Jestliže tuto NAF reprezentaci vyjádříme pomocí příslušných mocnin 2, pak snadno vidíme, že přičítání čísla 1 k NAF reprezentaci čísla x je klasické přičítání, u kterého sledujeme přenosy z nižších do vyšších bitů. Abychom dokázali, že úpravami uvedenými v algoritmu dostaneme NAF reprezentaci čísla x + 1, musíme ukázat, že uvedenými operacemi dostaneme reprezentaci, ve které nejsou žádné dva sousední bity nenulové, a že (m 1) ní bit NAF reprezentace je různý od -. To, že se jedná o NAF reprezentaci, pak plyne z jednoznačnosti NAF reprezentace. V další části důkazu budeme i tým krokem Algoritmu 5.1.1 rozumět i tou iteraci kroku 2. tohoto algoritmu. Nejprve ukážeme korektnost úprav. Předpokládejme, že jsme v kroku i Algoritmu 5.1.1 a přičítáme přenos z nižších bitů. Úpravy popsané v bodech 2a., 2b. a 2d. jsou zřejmé. Stačí si uvědomit, že hodnota určená bity + - je shodná s hodnotou určenou bity. +, neboť 2 i+1 2 i = 2 i a hodnota určená bity - + je shodná s hodnotou určenou bity. -, neboť 2 i+1 +2 i = 2 i. V bodě 2e. stačí použít, že hodnota určená bity. + + je stejná jako hodnota určená bity +. -, protože 2 i+1 + 2 i = 2 i+2 2 i. Dostáváme tedy požadovanou úpravu bitů a přenos +1 do vyšších bitů. V bodě 2c. dostáváme po přičtení přenosu bity +.. Protože ale potřebujeme splnit podmínku, aby žádné dva sousední bity nebyly nenulové (v tomto případě bity s indexy i + 1 a

5.1. VLASTNOSTI NAF REPREZENTACE 21 i + 2), musíme znát ještě bit s indexem i + 2, abychom případně vyřešili nově vzniklou dvojici nenulových sousedních bitů. Z právě popsaných úprav vidíme, že v kroku i nevzniká těmito úpravami dvojice nenulových bitů na bitech s indexy i až m 1 (tedy na všech vyšších bitech). Uvedenými úpravami však nevzniká taková dvojice ani na nižších bitech, neboť v kroku i řešíme buď 2 nejnižší bity NAF reprezentace (proto nehrozí, že bychom vytvořili dvojici nenulových bitů na nižších bitech), anebo řešíme přenos vzniklý z nižších bitů, tedy přenos vzniklý v bodech 2c. a 2e. V obou případech je však bit s indexem i 1 po úpravě. a tedy nehrozí, že bychom na nižších bitech vytvořili dvojici nenulových bitů. Z uvedených úprav zároveň vidíme, že (m 1) ní bit NAF reprezentace je po úpravě různý od - (na m tý bit můžeme nahlížet jako na bit. ). Uvedený algoritmus však neplatí v tomto tvaru při zobecnění na přičítání čísla 2 j k NAF reprezentaci čísla x pro obecné j (v algoritmu je použito 2 0 ). Nebylo by totiž zaručeno, že přičtením 2 j nevznikne při úpravách NAF reprezentace čísla x dvojice nenulových bitů na nižších bitech, tedy na pozicích j a j 1. Pro jednodušší představu vyjádříme jeden krok Algoritmu 5.1.1 méně formálně v následující tabulce. Budeme uvádět jen potřebný počet bitů pro znázornění úprav a to bez uvozovek. Pro znázornění změn v reprezentaci použijeme následující značení: pro vyjádření přičítání přenosu +1, pro vyjádření připsání dalšího vyššího bitu a pro vyjádření úprav s bity (např. změnu bitů. + na + - ). V tabulce budeme na příslušných místech psát bod Algoritmu 5.1.1, ze kterého tyto úpravy vycházejí. Posloupnost bitů je uváděna vždy od prvního bitu, na který se mají změny uplatnit, a tento bit je umístěn nejvíce vpravo. Bity Operace na bitech při přičtení přenosu (2a)... + (2b). -.. (2c). + podíváme se na předchozí bit (2a).. +. +. (2d) -. + - +.. -. (2e) +. + + +.. -. a přenos +1 do vyšších bitů, který se vyřeší některou z úprav (2a) až (2e) (2d) -. - +. - (2e) +. + +. - a přenos +1 do vyšších bitů, který se vyřeší některou z úprav (2a) až (2e) Tabulka 5.1. Úprava bitů NAF reprezentace při přičítání přenosu z nižších bitů. Z Algoritmu 5.1.1 plynou následující důležitá pozorování: (1) přenos do vyšších bitů nastává pouze v bodech (2c) a (2e), t.j. přenos nastává z bitů. + nebo +. ; (2) přenos vzniklý v bodě (2c) nastává pouze na nejnižších dvou bitech. Tyto poznatky využijeme v následujícím tvrzení.

5.1. VLASTNOSTI NAF REPREZENTACE 22 Tvrzení 5.1.3. Uvažme číslo x, t.ž. 0 x < 2 m a nějaké číslo s, t.ž. 1 s < m. Pak při přičtení čísla 1 k číslu x nastává v NAF reprezentaci čísla x přenos do s tého bitu právě tehdy, když prvních s bitů (tedy nultý až (s 1) ní bit) NAF reprezentace čísla x je (1) +. +.... +.(+), je-li s tý bit NAF reprezentace čísla x. ; (2). +. +.... +(.), je-li s tý bit NAF reprezentace čísla x + nebo -. Důkaz. Tvrzení plyne ze správnosti Algoritmu 5.1.1. Přenos při přičtení čísla 1 musí nastat při každé úpravě bitů NAF reprezentace čísla x až po s tý bit. Podle Algoritmu 5.1.1 nastává přenos pouze v bodech 2c. a 2e. Důsledek 5.1.4. Mějme číslo x, t.ž. 0 x < 2 m a nějaké číslo s, t.ž. 1 s < m. Jestliže při přičtení čísla 1 k číslu x nastal v NAF reprezentaci čísla x přenos do s tého bitu, pak prvních s bitů NAF reprezentace čísla x + 1 je (1). -. -.... -(.), je-li s tý bit NAF reprezentace čísla x. ; (2) -. -.... -.(-), je-li s tý bit NAF reprezentace čísla x + nebo -. Důkaz. Plyne aplikací Algoritmu 5.1.1 na Tvrzení 5.1.3. Tvrzení 5.1.3 je důležité z toho pohledu, že víme, ve kterých případech nastává v NAF reprezentaci po přičtení čísla 1 přenos do vyšších bitů, a že v žádných jiných případech tento přenos nenastává. V dalších tvrzeních budeme tento poznatek často využívat. Nejprve definujeme následující čísla. Definice. Pro číslo t 1 definujeme číslo µ t, t.ž. délka jeho NAF reprezentace je t, pro t > 1 má tvar pro t = 0, 1 má tvar NAF(µ t ) = +. +.... +.(+) ; NAF(µ 0 ) = NAF(µ 1 ) =.. Nyní vyslovíme pomocné tvrzení, které využijeme pro odvození číselné hodnoty čísla µ t. Tvrzení 5.1.5. Pro přirozené číslo t 0 platí vztah 2 t 1 = µ t + µ t 1. Důkaz. Z definice čísel µ t a µ t 1 přes jejich BSDR reprezentace můžeme nahlédnout, že BSDR(µ t + µ t 1 ) = + +... + +. Tato reprezentace je ale jedna z možných BSDR reprezentací čísla 2 t 1 (konkrétně binární reprezentace). Proto platí µ t + µ t 1 = 2 t 1. Tvrzení 5.1.6. Hodnota čísla µ t je pro dané t rovna { 2 (2 t 1), je-li t sudé; 3 µ t = 2 (2 t 1)+1, je-li t liché. 3

5.1. VLASTNOSTI NAF REPREZENTACE 23 Důkaz. Z Tvrzení 5.1.5 víme, že platí µ t + µ t 1 = 2 t 1. Z definice čísel µ t a µ t 1 vidíme, že pro celočíselné dělení platí vztah µ t 1 = µ t /2 (celočíselné dělení znamená zkrácení reprezentace o poslední bit). Pro t = 0 a t = 1 dostáváme platnost vzorce přímým výpočtem. Pro t > 0 rozlišíme dva případy. Je-li t sudé, pak hodnota µ t je sudá, hodnota µ t 1 je lichá a proto µ t = 2 µ t 1. Dostáváme 2 t 1 = µ t + µ t 1 = µ t + (µ t /2) = 3/2 µ t a odsud po úpravách dostáváme µ t = 2 (2t 1) 3. Analogicky, je-li t liché, pak hodnota µ t je lichá, hodnota µ t 1 je sudá a proto µ t = 2 µ t 1 + 1. Dostáváme 2 t 1 = µ t + µ t 1 = µ t + ((µ t 1)/2) = (3µ t 1)/2 a odsud po úpravách dostáváme µ t = 2 (2t 1)+1 3. Můžeme si všimnout následující vlastnost čísla µ t. Podle Tvrzení 5.1.3 nastává při přičtení čísla 1 v NAF reprezentaci čísla µ t přenos do t tého bitu. To je vlastnost, kvůli které jsme tato čísla definovali. Nyní se podívejme na další vlastnost tohoto čísla. Tvrzení 5.1.7. Největší m bitové číslo, které má v NAF reprezentaci nejvyšší nenulový bit rovný +, je číslo µ m. Důkaz. Z definice čísla µ m víme, že NAF(µ m ) = +. +.... +.(+). Proto platí µ m = 2 m 1 +2 m 3 +... a tedy µ m > 2 m 1. Nyní předpokládejme, že existuje číslo x, které splňuje vlastnost uvedenou v tvrzení a pro které platí x > µ m. Proveďme následující úvahu na všech m bitech NAF reprezentací čísel x a µ m. Protože má platit x > µ m > 2 m 1 a platí 2 m 2 + 2 m 3 +... + 2 1 + 2 0 = 2 m 1 1 (největší hodnota určená (m 1) ním bitem je větší než největší hodnota určená nižšími bity), tak nejvyšší nenulový bit NAF reprezentace čísla x musí být na pozici m 1. Dostáváme proto NAF(x)[m 1] = NAF(µ m )[m 1] = +. Z definice NAF reprezentace pak platí i NAF(x)[m 2] = NAF(µ m )[m 2] =.. Opakováním této úvahy na nejnižších m 2 bitů NAF reprezentací čísel x a µ m (a na další nižší bity) dostáváme x = µ m, což je spor s předpokladem x > µ m. Ukázali jsme, že největší m bitové číslo, které má ve své NAF reprezentaci nejvyšší nenulový bit rovný +, je číslo µ m. Nyní se podíváme na nejvyšší nenulový bit NAF reprezentací čísel 1, 2,..., 2 m 1. Nastává otázka, která z čísel 1, 2,..., 2 m 1 mají ve své NAF reprezentaci nejvyšší nenulový bit + a která -. Tvrzení 5.1.8. Uvažujme NAF reprezentace čísel 1, 2, 3,..., 2 m 1. Potom čísla 1,..., µ m mají ve své NAF reprezentaci nejvyšší nenulový bit + a ostatní čísla µ m + 1,..., 2 m 1 mají nejvyšší nenulový bit -. Důkaz. Důkaz provedeme indukcí podle n, kde n je číslo, jehož NAF reprezentaci zkoumáme. Nejprve dokážeme první část tvrzení, tedy odvodíme nejvyšší nenulový bit NAF reprezentací čísel 1,..., µ m. Pro n = 1 je platnost tvrzení zřejmá. Nechť n je nějaké číslo menší než µ m, jehož nejvyšší nenulový bit je +. Podíváme se, jak se změní nejvyšší nenulový bit NAF reprezentace čísla n po přičtení čísla 1. Označme i index nejvyššího nenulového bitu NAF reprezentace čísla n a

5.1. VLASTNOSTI NAF REPREZENTACE 24 předpokládejme, že je ovlivněn přenosem z nižších bitů (jinak se nejvyšší nenulový bit nezmění). Podle Tvrzení 5.1.3 to nastává pouze v případě, že předchozích i bitů čísla n je. +. +... +.(+). Protože však n < µ m, tak i < m 1 (jinak by NAF reprezentace čísla n byla shodná s NAF reprezentací čísla µ m a tudíž by platilo n = µ m ) a nejvyšší nenulový bit čísla n + 1 bude podle Algoritmu 5.1.1 bit + na pozici i + 1. Číslo µ m + 1 má nejvyšší nenulový bit - podle Důsledku 5.1.4. Zbývá ukázat, že nejvyšší nenulový bit NAF reprezentací čísel µ m + 2,..., 2 m 1 je -. To dokážeme indukcí analogicky jako pro čísla 1,..., µ m. Důsledek 5.1.9. Mějme čísla 0, 1, 2,..., 2 m 1 (v tomto pořadí). Pak pro NAF reprezentace těchto čísel platí (1) 0 má všechny bity nulové; (2) následujících µ m čísel má nejvyšší nenulový bit + ; (3) zbylých 2 m µ m 1 čísel má nejvyšší nenulový bit -. Důkaz. Plyne z Tvrzení 5.1.8. Z Tvrzení 5.1.6 víme, že hodnota čísla µ m je 2 3 (2m 1). To nám dává jasnější obraz o počtu čísel z Důsledku 5.1.9. Vidíme, že přibližně 2/3 těchto čísel mají nejvyšší nenulový bit + a jen asi třetina čísel má nejvyšší nenulový bit -. Tvrzení 5.1.8 můžeme zobecnit a odvodit hodnotu nejvyššího nenulového bitu v prvních s bitech NAF reprezentací čísel 0, 1, 2,..., 2 m 1. Tvrzení 5.1.10. Uvažujme NAF reprezentace čísel 0, 1, 2,..., 2 m 1 (v tomto pořadí) a nějaké číslo 1 s m. Pak (1) v intervalech i 2 s, (i + 1) 2 s 1 pro sudá i, t.ž. 0 i < 2 m s platí (a) první číslo má prvních s bitů nulových; (b) následujících µ s čísel má v prvních s bitech NAF reprezentace nejvyšší nenulový bit +, přičemž poslední číslo této skupiny má prvních s bitů +. +.... +.(+) ; (c) zbývajících 2 s µ s 1 čísel má v prvních s bitech NAF reprezentace nejvyšší nenulový bit - ; (2) v intervalech i 2 s, (i + 1) 2 s 1 pro lichá i, t.ž. 0 i < 2 m s platí (a) první číslo má prvních s bitů nulových; (b) následujících 2 s µ s 1 čísel má v prvních s bitech NAF reprezentace nejvyšší nenulový bit +, přičemž poslední číslo této skupiny má prvních s bitů. +. +.... +(.) ; (c) zbývajících µ s čísel má v prvních s bitech NAF reprezentace nejvyšší nenulový bit -. Důkaz. Budeme vycházet z důkazu Tvrzení 5.1.8 s tím rozdílem, že při odvozování vlastností čísel na prvních s bitech nemůžeme uvažovat pouze počítání modulo 2 s. Je to z toho důvodu, že pokud máme číslo x a známe prvních s bitů (nultý až (s 1) ní bit) jeho NAF reprezentace, tak určení prvních s bitů NAF

5.1. VLASTNOSTI NAF REPREZENTACE 25 reprezentace čísla x+1 závisí ještě na s tém bitu NAF reprezentace čísla x. Stačí si proto uvědomit, že přenos do s tého bitu (a tedy jeho změna) nastává každých 2 s čísel. Nejprve dokážeme bod (1). Uvažujme intervaly čísel i 2 s, (i+1) 2 s 1 pro sudá i, t.ž. 0 i < 2 m s. V každém z těchto intervalů platí, že první číslo intervalu má prvních s bitů NAF reprezentace nulových a s tý bit jeho NAF reprezentace je.. Bod (1) potom plyne přímo z Důsledku 5.1.9 pro m = s (přenos do s tého bitu nastává na konci skupiny čísel popsaných v bodě (1)(b)). Poslední číslo této skupiny čísel je pak číslo, jehož nejnižších s bitů je..... - a jehož s tý bit je + nebo -. Nyní dokážeme bod (2). Uvažujme intervaly čísel i 2 s, (i + 1) 2 s 1 pro lichá i, t.ž. 0 i < 2 m s. Z bodu (1) víme, že první číslo v každém z těchto intervalů má prvních s bitů NAF reprezentace nulových a s tý bit jeho NAF reprezentace je + nebo -. Uvažujme pouze prvních s 1 bitů NAF reprezentace tohoto čísla. Pak prvních (s 1) bitů (nultý až (s 2) hý) je nulových a (s 1) ní bit je.. Body (a) a (b) tedy plynou z Důsledku 5.1.9 (stačí si uvědomit rovnost µ s 1 = 2 s µ s 1 z Tvrzení 5.1.5). Posledním číslem skupiny čísel popsané v bodě (2)(b) je číslo, jehož prvních s bitů NAF reprezentace je. +. +.... +(.) a s tý bit je + nebo -. Z Důsledku 5.1.4 plyne, že prvních s bitů NAF reprezentace čísla většího o 1 je -. -.... -.(-) a s tý bit je.. Bod (c) tedy plyne z Důsledku 5.1.9 (stačí si uvědomit rovnost 2 s+1 µ s+1 1 = µ s z Tvrzení 5.1.5). Poslední číslo této skupiny čísel je proto číslo, jehož nejnižších s bitů je..... - a jehož s tý bit je.. Důsledek 5.1.11. Uvažujme NAF reprezentace čísel 0, 1, 2,..., 2 m 1 (v tomto pořadí) a nějaké číslo 0 s < m. Pak (1) v intervalech (µ s + i 2 s+1, 2 s + µ s 1 + i 2 s+1 pro i, t.ž. 0 i < 2 m s 1 platí, že s tý bit jejich NAF reprezentace je + nebo - ; (2) v intervalech (2 s +µ s 1 +i 2 s+1, µ s +(i+1) 2 s+1 pro i, t.ž. 0 i < 2 m s 1 1 platí, že s tý bit jejich NAF reprezentace je. ; (3) v intervalu 0, µ s 2 m µ s, 2 m ) platí, že s tý bit jejich NAF reprezentace je.. Důkaz. Jde o změnu intervalů z Tvrzení 5.1.10. Interval popsaný v bodě (1) je spojením intervalů (1)(c), (2)(a) a (2)(b) Tvrzení 5.1.10, přičemž délka tohoto spojeného intervalu je (2 s µ s 1)+1+µ s 1 = 2µ s 1 +1 (využitím Tvrzení 5.1.5). Intervaly popsané v bodech (2) a (3) jsou spojením intervalů (2)(c), (1)(a) a (1)(b) Tvrzení 5.1.10, přičemž poslední takto spojený interval není souvislý. Délka těchto spojených intervalů je (2 s+1 µ s+1 1) + 1 + µ s = 2µ s + 1 (opět využitím Tvrzení 5.1.5). Pro určení hodnoty s tého bitu jejich NAF reprezentací si stačí uvědomit, že s tý bit NAF reprezentace se mění pouze při přičítání čísla 1 k posledním číslům skupin čísel (1)(b) a (2)(b) Tvrzení 5.1.10. Pro lepší představu znázorníme Tvrzení 5.1.10 graficky. Ze zmíněného tvrzení vyplývá, že body (1) a (2) tohoto tvrzení popisují intervaly délky 2 s, které se na-