VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA STROJNÍHO INŽENÝRSTVÍ ÚSTAV MATEMATIKY FACULTY OF MECHANICAL ENGINEERING INSTITUTE OF MATHEMATICS
MATEMATICKÉ METODY ZABEZPEČENÍ PŘENOSU DIGITÁLNÍCH DAT MATHEMATICAL SECURITY METHODS IN DIGITAL DATA TRANSFER
DIPLOMOVÁ PRÁCE MASTER'S THESIS
AUTOR PRÁCE
Bc. PETR BARTUŠEK
AUTHOR
VEDOUCÍ PRÁCE SUPERVISOR
BRNO 2014
Mgr. PETR VAŠÍK, Ph.D.
Vysoké učení technické v Brně, Fakulta strojního inženýrství Ústav matematiky Akademický rok: 2013/2014
ZADÁNÍ DIPLOMOVÉ PRÁCE student(ka): Bc. Petr Bartušek který/která studuje v magisterském navazujícím studijním programu obor: Matematické inženýrství (3901T021) Ředitel ústavu Vám v souladu se zákonem č.111/1998 o vysokých školách a se Studijním a zkušebním řádem VUT v Brně určuje následující téma diplomové práce: Matematické metody zabezpečení přenosu digitálních dat v anglickém jazyce: Mathematical security methods in digital data transfer Stručná charakteristika problematiky úkolu: Jedná se o oblast teorie kódování, v tomto případě se zaměřením na detekci chyb vznikajících při přenosu digitálních dat. Budou zkoumány algoritmy na hledání nedetekovaných chyb při přenosu dat kódovaných pomocí CRC algoritmu s cílem zkrátit dobu odhalení nedetekované chyby. Budou zkoumány různé polynomiální reprezentace CRC kódů z hlediska nedetekovaných chyb.
Cíle diplomové práce: Cílem je osvojení širších základů teorie kódování se zaměřením na detekci chyb vznikajících při přenosu digitálních dat. Dále aplikace a implementace konkrétních vylepšení detekčních algoritmů pro potřeby partnera z průmyslu. Součástí bude navržení softwarového řešení.
Seznam odborné literatury: Roman, Steven, Coding and Information Theory, Graduate Texts in Mathematics, Springer Verlag, 1992 Hamming, R. W. Coding and information theory, Prentice-Hall, New-Jersey 1950 Welsh D., Codes and cryptography, Oxford, University Press, New York, 1988 ADÁMEK, Jiří. Kódování. 1. vyd. Praha: SNTL - Nakladatelství technické literatury, 1989 Adámek, Jiří. Foundations of coding, John Wiley \& Sons, Inc. 1991
Vedoucí diplomové práce: Mgr. Petr Vašík, Ph.D. Termín odevzdání diplomové práce je stanoven časovým plánem akademického roku 2013/2014. V Brně, dne 22.11.2013 L.S.
_______________________________ prof. RNDr. Josef Šlapal, CSc. Ředitel ústavu
_______________________________ prof. RNDr. Miroslav Doupovec, CSc., dr. h. c. Děkan fakulty
Abstrakt: Tato diplomová práce se zabývá analýzou zabezpečení digitálních dat pomocí CRC. V práci je popsán princip bezpečnostního kódování, zejména pak zabezpečení dat pomocí CRC, u něhož je vysvětlen matematický princip zabezpečení, softwarová implementace a popis využívaných generujících polynomů. Hlavním cílem práce je pak testování nedetekovaných chyb a zjištění jejich počtu pro následný výpočet pravděpodobnosti vzniku nedetekované chyby. Práce je doplněna o několik programů naprogramovaných v prostředí Matlab.
Abstract: This master’s thesis deals with an analysis of digital security with CRC. In the thesis there is described a principle of coding theory, especially then digital security with CRC, for which there is explained a mathematical principle of their encoding and decoding, software implementation and a description of frequently used generator polynomials. The main aim of the thesis is a testing of undetected errors and a finding of number of these errors. After that it is used for the computation of probability with which undetected errors can occur. The thesis is supplemented with several programs which are programmed in the software Matlab.
Klíčová slova: CRC, bezpečnostní kódování, generující polynom, nedetekovaná chyba, look-up tabulka
Keywords: CRC, coding theory, generator polynomial, undetected error, look-up table
BARTUŠEK, P. Matematické metody zabezpečení přenosu digitálních dat. Brno: Vysoké učení technické v Brně, Fakulta strojního inženýrství, 2014. 66 s. Vedoucí diplomové práce Mgr. Petr Vašík, Ph.D.
Prohlašuji, že jsem diplomovou práci Matematické metody zabezpečení přenosu digitálních dat vypracoval samostatně pod vedením Mgr. Petra Vašíka, Ph.D s použitím materiálů uvedených v seznamu zdrojů. Petr Bartušek
Děkuji svému vedoucímu práce Mgr. Petru Vašíkovi, Ph.D za rady, připomínky a čas věnovaný při konzultacích k této diplomové práci. Dále bych chtěl také poděkovat RNDr. Davidu Kvapilovi a Ing. Andreji Weismanovi, spolupracovníkům ze společnosti UNIS, a.s., za vymyšlení tématu diplomové práce a poskytnutí jejich odborných rad při jejím zpracování. Petr Bartušek
Osnova 1 2
3
4 5 6
Úvod ............................................................................................................................ 6 Bezpečnostní kódování ................................................................................................ 7 2.1 Základní pojmy bezpečnostního kódování ........................................................... 8 2.2 Rozdělení bezpečnostního kódování .................................................................... 9 2.3 Vlastnosti kódů ................................................................................................... 10 CRC (Cyclic Redundancy Check) ............................................................................. 12 3.1 Základní pojmy a principy ................................................................................. 12 3.2 Zabezpečení dat pomocí CRC ............................................................................ 13 3.3 Softwarová implementace .................................................................................. 16 3.3.1 Algoritmus 1 – Naive .................................................................................. 17 3.3.2 Algoritmus 2 – Slow ................................................................................... 17 3.3.3 Algoritmus 3 – Fast ..................................................................................... 18 3.4 Generující polynomy a jejich detekční schopnosti ............................................ 25 3.4.1 Generující polynomy pro softwarovou implementaci ................................ 25 3.4.2 Matematický přístup k detekci chyb ........................................................... 28 3.5 Testování nedetekovaných chyb ........................................................................ 32 3.5.1 Brute Force přístup ..................................................................................... 34 3.5.2 Brute Force přístup – vylepšení .................................................................. 37 3.5.3 Clever přístup .............................................................................................. 42 3.6 Pravděpodobnost nedetekované chyby .............................................................. 60 Závěr .......................................................................................................................... 63 Zdroje......................................................................................................................... 64 Přílohy ....................................................................................................................... 65 6.1 Přílohy – Softwarová implementace .................................................................. 65
5
1 Úvod Tento text se zabývá analýzou zabezpečení digitálních dat pomocí kódu CRC (Cyclic Redundancy Check), který patří mezi bezpečnostní kódování, které je obecně popsáno v kapitole 2. Kromě základní terminologie je v této kapitole uvedeno i rozdělení a vlastnosti bezpečnostních kódů. Třetí kapitola se již konkrétně týká samotné analýzy CRC. Po zavedení základních pojmů je v kapitole 3.2 vysvětleno, jak probíhá samotné kódování a následná kontrola bezchybnosti přenosu po průchodu dat přenosovým kanálem. Část 3.3 se zabývá softwarovou implementací tří algoritmů – Naive, Slow a Fast. Součástí této práce je naprogramování jednotlivých algoritmů v programu Matlab a odvození výsledných vztahů pro implementaci nejrychlejšího algoritmu Fast, který využívá look-up tabulek. Odvození je provedeno podle již známého matematického důkazu pro přechod od algoritmu Naive k algoritmu Fast. V části 3.4 jsou uvedeny vhodné generující polynomy pro softwarovou implementaci a popis jejich matematických vlastností. V programu Matlab se podařilo naprogramovat funkci na rozklad polynomu na ireducibilní a primitivní polynomy, na základě níž jsou vytvořeny tabulky uvádějící detekční schopnosti jednotlivých generujících polynomů. Část 3.5 se zabývá testováním generujících polynomů. Všechny navržené postupy a naprogramované algoritmy v této kapitole jsou vlastním přínosem autora této práce. Na několika příkladech jsou uvedena jednotlivá vylepšení od algoritmu BruteForce1, přes algoritmus BruteForce2, až k algoritmu Clever. Všechny algoritmy jsou naprogramovány na testování jednoduchých, dvojných, trojných, čtverných, paterných a šesterných chyb, s určováním počtu chybových slov vedoucích na nedetekovanou chybu. Část 3.6 popisuje tři vztahy týkající se pravděpodobností výskytu nedetekované chyby. Jedná se o průměrnou pravděpodobnost nedetekované chyby, procento nedetekovaných chyb a pravděpodobnost nedetekované chyby.
6
2 Bezpečnostní kódování Před začátkem popisu bezpečnostního kódování je nutné si objasnit rozdíly v pojmech, ve kterých může dojít k nedorozumění (z důvodu názvosloví nebo z důvodu obecné představy a podvědomí). Těmito pojmy jsou zdrojové kódování, kryptografie a právě bezpečnostní kódování. Terminologie těchto pojmů se v různých monografiích liší a je voleno označení podle [8],[11]. Úpravy dat se provádějí z důvodu, aby bylo možné data přenést přenosovým kanálem. Přenosový kanál je zařízení, díky kterému jsou data přenášena mezi dvěma vzdálenými místy (internetový kabel, optická vlákna, telefonní linka, kanál rádiových vln, …) nebo mezi dvěma časově různými okamžiky (USB, CD, DVD, …). Během přenosu však dochází k porušení vyslaných dat, což si lze představit tak, že nastal šum. Ten může být způsoben nejrůznějšími vlivy, které na přenosový kanál působí (povětrnostní podmínky, vzdálenost přenosu, interference s ostatními zařízeními, poškrábání přenosové plochy, …). Jaký přenosový kanál bude použit je důležité z důvodu, že je potřeba znát podobu dat, v jakých budou přes kanál přenášena. Většina běžných zařízení v informačních technologiích využívá binární zápis. { }. Jedná se tedy o abecedu Tedy zápis, kdy každý prvek se nazývá bit a tvořenou pouze pomocí znaků a 1. Zdrojové kódování se zabývá změnou syntaktické abecedy vysílané zprávy a kompresí dat. Hlavním cílem je tedy přeměna zdrojových dat do abecedy vhodné pro daný přenosový kanál a zmenšení objemu dat ve zprávě. Komprese dat vede ke zrychlení při přenosu datového souboru, popř. ke snížení paměťového místa při jeho ukládání. Princip komprese je postaven na odstranění redundance (tj. nadbytečná informace) a využití jen nezbytně potřebné informace pro zachování dat k dalšímu použití. Kryptografie se zabývá šifrováním, jejím cílem je utajení informace před zásahem nebo odposlechem třetí strany. To je provedeno zašifrováním důležitých dat před přenosem a následným dešifrováním po získání bezchybných dat příjemcem po jejich průchodu přenosovým kanálem. Šifrování je tedy činnost, kterou si často běžný čtenář představuje pod pojmem kódování. Bezpečnostní (kanálové) kódování se zabývá detekcí a popř. i korekcí chyb způsobených šumem během průchodu dat přenosovým kanálem. Na rozdíl od komprese dat je proto potřeba zvýšit redundanci, která umožní příjemci detekovat a opravovat chyby. Zjednodušený model postupu vysílané zprávy od zdroje až po přijetí zprávy příjemcem znázorňuje obr. 1. Důležité je pořadí výše uvedených operací, které se s daty provádějí před a po průchodu přenosovým kanálem. Před vlastním přenosem kanálem probíhá nejprve zdrojové kódování, kde dochází k přeměně dat, nejčastěji do binární podoby a jejich kompresi pro urychlení přenosu. Na takto upravených datech probíhá šifrování následované bezpečnostním kódováním. Uvedené pořadí šifrování a bezpečnostního kódování je nutné. Zejména protože pro správné dešifrování je potřeba mít ověřenu bezchybnost přenesených dat, jinak by dešifrování nemohlo proběhnout. Po průchodu dat přenosovým kanálem tedy probíhá nejprve dekódování dat zajišťující detekci, popř. i možnou opravu chyb. Správně přenesená (opravená) data jsou následně dešifrována. Nakonec pomocí zdrojového dekódování proběhne zpětná dekomprese dat a jejich převod do abecedy příjemce. V některých situacích není potřeba provádět všechny zmíněné kroky a lze některé vynechat. Např. pokud není objem dat příliš velký, není potřeba provádět kompresi dat. V kanálech, kde nehrozí napadení dat třetí stranou, zase není potřeba šifrování.
7
Vysílaná zpráva
Komprese dat (zdrojové kódování)
Šifrování dat (kryptografie)
Kódování dat (bezpečnostní kódování)
Přenosový kanál
Přijatá zpráva
Dekomprese dat (zdrojové kódování)
Dešifrování dat (kryptografie)
Dekódování dat (bezpečnostní kódování)
Obr. 1: Zjednodušené schéma úpravy dat od vysílané zprávy ze zdroje až k přijaté zprávě
2.1 Základní pojmy bezpečnostního kódování Další text se už týká pouze bezpečnostního kódování, tedy podle obr. 1 poslední úpravou dat před vstupem do přenosového kanálu a následnou první úpravou dat po přenosu. Cílem bezpečnostního kódování je zvýšení redundance, aby bylo možné po přenosu dat kanálem detekovat a opravovat chyby vzniklé během přenosu. Podle toho, zda mohou kódy chyby pouze detekovat nebo i opravovat, se tyto kódy označují detekční nebo korekční. Detekční kódy jsou schopny detekovat určitý počet vzniklých chyb, ale nemohou žádnou chybu opravit. Z tohoto důvodu se používají v situacích, kdy není problém při zjištěné chybě zaslat data znovu přenosovým kanálem. Na druhé straně korekční kódy jsou schopny nejen detekovat určitý počet chyb, ale také určitý počet chyb opravit. Proto jsou tyto kódy využívány v situacích, kdy nelze data přenosovým kanálem znovu poslat nebo kdy je opětovné zaslání dat časově náročné nebo nákladné. Slovo (zpráva) délky je v teorii bezpečnostního kódování určitá -tice prvků , kde jsou znaky zvolené abecedy . Nejčastěji je , pak se jedná o binární posloupnost znaků 0 a 1. Informační slovo délky je zpráva, kterou chceme poslat přenosovým kanálem, a tudíž je potřeba mu přidat určitou redundanci. Přidáním nadbytečné informace v podobě znaků vznikne kódové slovo délky , které je přenášeno kanálem. Vlivem šumu, který představuje chybové slovo délky , dostaneme po přenosu přenesené kódové slovo délky , kde Kódové slovo délky
se tudíž skládá z
informačních znaků a
zabezpečujících znaků
Je-li počet znaků s hodnotou 1 v chybovém slově, pak během přenosu kanálem nastala -násobná chyba. Př. 1: Kódování pomocí kontroly sudé parity přidává za informační slovo jeden nadbytečný bit ( ) tak, aby v kódovém slově byl sudý počet 1. Pro informační slovo je kódové slovo . Pokud během přenosu nastane šum v podobě chybového slova 8
(jednoduchá chyba), přenesené kódové slovo bude kontrolou sudé parity lze detekovat chybu během přenosu.
, u něhož
Př. 2: Koktavý kód je takový, který každý znak v informačním slově ihned opakuje. Počet nadbytečných bitů informačního slova délky je tedy . Pro informační slovo je kódové slovo . Pokud během přenosu nastane šum v podobě chybového slova (2-násobná chyba), přenesené kódové slovo bude , u něhož lze kontrolou detekovat chybu během přenosu.
2.2 Rozdělení bezpečnostního kódování Podle způsobu zabezpečení informačních znaků (rozdělení dle [11]) lze bezpečnostní kódování dělit na 2 základní skupiny: Bezpečnostní kódování
Blokové kódy
Stromové kódy
Obr. 2: Rozdělení bezpečnostního kódování Jak u blokových tak i stromových kódů se nejprve celková zpráva rozdělí na několik bloků stejné délky . U blokových kódů se následně každý blok informačních znaků zabezpečí zvlášť, čímž vznikne pokaždé blok délky . Naproti tomu u stromových kódů se k zabezpečení -tého bloku informačních znaků využívá také bloků předcházejících, čímž opět vznikne pokaždé blok délky . Další rozdělení blokových a stromových kódů je znázorněno na obr. 3 a obr. 4. Podrobnější popis těchto kódů lze najít např. v [7], [8], [11]. Blokové kódy
Systematické
Lineární
Nesystematické
Nelineární
Lineární
Cyklické Obr. 3: Základní rozdělení blokových kódů
9
Ostatní
Stromové kódy
Lineární stromové kódy
Systematické
Mřížové kódy
Klouzavé blokové
Konvoluční
Systematické
Obr. 4: Základní rozdělení stromových kódů
2.3 Vlastnosti kódů Blokové kódy pracují s daným blokem dat a na rozdíl od stromových kódů nevyužívají bloků předchozích. Před kódováním má informační slovo vždy délku , zakódováním pak vznikne kódové slovo délky . Všechna slova mají znaky z abecedy (nejčastěji { } ), tudíž slovo . blokový kód nad abecedou o znacích je množina mající -tic nazývaných kódová slova. Kódování každé -tici (informační slovo) přiřazuje právě jedno kódové slovo z kódu Dekódování slovo délky
každé -tici (kódové slovo) z množiny
přiřazuje právě jedno informační
{ }, tudíž všechna slova jsou binární. Kódování je pak Př. 3: Běžně je abeceda zobrazení , dekódování je zobrazení . Př. 4:
blokový kód
kontroly sudé parity kóduje všechna informační slova délky 3: {
Blokový kód
}
je tudíž množina mající
kódových slov délky 4:
{
}
Podle rozdělení na obr. 3 mohou být blokové kódy systematické nebo nesystematické. U systematických blokových kódů lze kódové slovo délky rozdělit na informačních znaků, následovaných zabezpečujícími znaky ⏟
⏟
10
Př. 5: Systematický blokový kód je např. kód kontroly sudé parity, kde kódování je zobrazení . Pak pro informační slovo platí ⏟ ⏟
Nesystematický blokový kód je např. . Pak pro informační slovo platí
koktavý kód, kde kódování je zobrazení ⏟
⏟
⏟
⏟
⏟
⏟
Blokový kód nad abecedou o znacích mající kódových slov délky tvoří lineární kód právě tehdy, když jeho kódových slov tvoří -dimenzionální vektorový podprostor lineární prostoru . Tedy jak je v [1], [8] uvedeno, u lineárních kódů platí, že součet dvou kódových slov je opět kódové slovo. Také každá lineární kombinace kódových slov je kódové slovo. Lineární kód je cyklický, jestliže s každým slovem obsahuje i jeho cyklický posun . Velmi důležitou vlastností cyklických lineárních kódů je pak možnost vyjádřit kódová slova pomocí polynomů.
11
3 CRC (Cyclic Redundancy Check) CRC (Cyclic Redundancy Check) je cyklický lineární blokový kód (viz [8], [11], [12], [13]), který slouží k zabezpečení dat pro jejich průchod přenosovým kanálem. Aby nedošlo k mylné interpretaci, je potřeba říci, že někdy se lze setkat s označením CRC jako zkratkou pro Cyclic Redundancy Codes. Podle tohoto označení, které nebude v tomto textu využíváno, do těchto cyklických redundantních kódů patří kromě Cyclic Redundancy Check také např. BCH kódy nebo Reed-Solomonovy kódy.
3.1 Základní pojmy a principy Slovo má prvky a veškeré počítání tedy probíhá v aritmetice . Jak již bylo zmíněno, každé slovo délky lze vyjádřit jako odpovídající polynom stupně , kdy jednotlivé bity jsou koeficienty polynomu zapisované od nejvyšší mocniny. Tedy . Př. 6: Díky zápisu v polynomiální formě je možné využít matematických vlastností polynomů, zejména pak jejich dělení. V dalším textu je zvoleno označení, které je obdobné dříve zavedenému označení pro slova v bezpečnostním kódování. Zatímco slovo jakožto posloupnost bitů je označováno malým tučným písmenem, odpovídající polynom k tomuto slovu je označen stejným malým netučným písmenem a proměnnou uvedenou v závorce. Tohle označení jednoznačně odlišuje, zda se v textu myslí binární slovo nebo polynom. K jednotlivým slovům lze tedy přiřadit následující polynomy: – generující polynom – informační polynom (polynom zabezpečující zprávy) – polynom zbytku – kódový polynom (polynom zabezpečené zprávy) – chybový polynom – polynom přenesené zprávy – polynom syndromu – polynom podílu Základní myšlenkou zabezpečení pomocí CRC je to, že kódový polynom je beze zbytku dělitelný generujícím polynomem. Tato vlastnost je nezbytně nutná ke správnému ověření, zda nedošlo při přenosu k chybě a lze ji získat jednoduchou úpravou podílu dvou polynomů:
Protože se však počítá modulo 2, platí: Zcela zásadní pro kódování a dekódování pomocí CRC se jeví vhodný výběr generujícího polynomu. Jestliže je potřeba zabezpečit informační slovo délky (tomu odpovídá informační polynom stupně ) pomocí redundantních znaků tak, aby kódové slovo bylo délky (tomu odpovídá kódový polynom stupně ), musí být 12
generující polynom stupně . Z toho vyplývá, že stupeň generujícího polynomu určuje počet zabezpečovacích znaků . Generující polynom však ovlivňuje nejen vlastnosti, ale i efektivitu daného kódování. Zejména pak schopnost zjištění chyby způsobené šumem při průchodu přenosovým kanálem. Při špatné volbě generujícího polynomu může docházet ke zbytečnému nárůstu nedetekovaných chyb, které mohou být při další úpravě dat kritické. Dále bude vysvětleno, jaké dvě metody se využívají pro určení efektivity kódování pro daný generující polynom a podle jakých kritérií se volí vhodný generující polynom. Zatímco efektivitu kódování ovlivňuje výhradně volba generujícího polynomu, rychlost provedení kódování, následnou detekci chyb a dekódování pak ovlivňuje zejména jejich implementace. Hardwarová implementace využívající posuvných registrů byla možná i před nástupem moderních výkonných osobních počítačů a lze ji najít výhradně ve dvou provedeních ([8], [9], [11]). Softwarová implementace se začala používat až s rozvojem informačních technologií a lze v nich najít implementace od pomalých, které ovšem zabírají málo místa v paměti počítače, až po rychlé, které na druhou stranu v paměti počítače zabírají více místa. Dále se tento text zabývá softwarovou implementací. Bude ukázána implementace tří algoritmů od toho nejzákladnějšího až po nejrychlejší kódování pomocí look-up (vyhledávacích) tabulek.
3.2 Zabezpečení dat pomocí CRC Nechť je dáno informační slovo délky a vybrán generující polynom stupně . Pak kódování, detekci chyb a zpětné dekódování pomocí CRC lze rozdělit do několika kroků: 1) Informační polynom čímž vznikne polynom stupně nul za informační slovo.
stupně se vynásobí členem (platí ), . Tento krok odpovídá v binárním vyjádření připojení
2) Vzniklý polynom se vydělí generujícím polynomem . Pro další výpočty je polynom vzniklého podílu nepracuje.
a zjistí se zbytkový polynom nezajímavý a dále se s ním
3) Kódový polynom vznikne sečtením polynomu součinu stupně a zbytkového polynomu stupně . V binárním vyjádření tento krok představuje dosazení zbytku místo přidaných nul. 4) Takto vzniklý kódový polynom vstupuje do přenosového kanálu. Kvůli rušení, šumu atd. obdrží příjemce polynom přenesené zprávy stupně . Ten vznikne součtem kódového polynomu s chybovým polynomem stupně . 5a) Jelikož musí platit, že každý kódový polynom je dělitelný beze zbytku generujícím polynomem, příjemce si ověří bezchybnost přenosu vydělením polynomu přenesené zprávy generujícím polynomem . Zbytek po tomto dělení se nazývá syndrom (resp. polynom syndromu ). - je-li , pak a přenos kanálem proběhl bezchybně - je-li , pak a při přenosu nastala chyba 5b) Existuje také druhá možnost ověření bezchybnosti přenosu. Polynom přenášené zprávy se rozdělí na dva polynomy. Nejvyšších mocnin představuje polynom , 13
nejnižších mocnin představuje polynom . Polynom se vydělí generujícím polynomem . Zbytek po tomto dělení se nazývá syndrom (resp. polynom syndromu ). - je-li , pak a přenos kanálem proběhl bezchybně - je-li , pak a při přenosu nastala chyba 6) Jestliže proběhl přenos kanálem bezchybně, získá příjemce informační polynom, pokud se v polynomu přenesené zprávy vynuluje nejnižších členů (jsou-li nenulové) a takto vzniklý polynom se vydělí členem . Tímto se získá zpětně informační polynom stupně . Pozn: Zabezpečení zpráv pomocí CRC se využívá především jako detekční kód, lze jej však použít i jako korekční kód. K tomu je potřeba si do tabulky syndromů předpočítat k možným chybovým polynomům odpovídající polynomy syndromů , kde . Při tomto postupu lze po zjištění syndromu určit odeslaný kódový polynom jako Př. 7: Zabezpečení informačního polynomu generujícím polynomem . Při počítání je nutné provádět veškeré operace v aritmetice . Při kódování se postupuje podle výše uvedených bodů 1), 2) a 3). a) polynomiální vyjádření
b) binární vyjádření
Oba způsoby provedení výpočtu jsou možné a je vidět, že výsledný kódový polynom odpovídá výslednému kódovému slovu. Při následném přenosu může kódový polynom ovlivnit chybový polynom, a proto se po přenosu místo kódového polynomu obdrží polynom
14
přenesené zprávy. Kontrola polynomu přenesené zprávy přenosu nenastala chyba) probíhá podle bodu 5a):
(při
a) polynomiální vyjádření
b) binární vyjádření
Je vidět, že jak v polynomiálním tak i v binárním vyjádření vychází nulový syndrom. Tudíž lze uvažovat, že přenos proběhl bez chyby a polynom přenesené zprávy lze považovat za kódový polynom. I když toto uvažování vypadá na první pohled správné a v naprosté většině případů správné bude, je potřeba se zamyslet i nad případným výskytem nedetekované chyby. Nedetekované chyby jsou hlavní problém zabezpečení pomocí CRC a podrobněji bude rozebíráno v následujících kapitolách. Pro úplnost je potřeba vyzkoušet, co se stane, když při přenosu kanálem nastane chyba a kódový polynom je ovlivněn chybovým polynomem. Kontrola polynomu přenesené zprávy (při přenosu nastala 1 chyba ve 4. bitu) se provádí opět podle bodu 5a): a) polynomiální vyjádření
b) binární vyjádření
15
Tentokrát v obou případech vychází nenulový syndrom, a tudíž je jisté, že došlo při přenosu k chybě. Polynom přenesené zprávy tedy nelze v takovém případě prohlásit za kontrolní polynom. Jelikož se zabezpečení pomocí CRC využívá výhradně k detekci chyb, postupuje se v tomto případě tak, že se musí zpráva od odesílatele vyslat znovu a celý postup zopakovat.
3.3 Softwarová implementace Softwarová implementace ovlivňuje významným způsobem rychlost provedení kódování, následnou detekci chyb i dekódování. Lze se setkat s různými algoritmy, ty pomalé sice zabírají méně paměti počítače, ale jsou dobré nanejvýš k pochopení základů, jak zabezpečení pomocí CRC implementovat. Po pochopení nejjednodušší implementace lze přistoupit k rychlejším algoritmům. Ty sice zabírají v paměti počítače více místa a jsou složitější na pochopení, ale pro využití v praktických aplikacích jsou nezbytné. Dále bude v textu ukázána implementace tří algoritmů na zabezpečení dat pomocí CRC v programu MATLAB. Tyto algoritmy jsou sestaveny na základě pseudokódů naznačených v [14] a [15], kde se lze mimo jiné setkat s velmi trefnými názvy jednotlivých implementací, které jsou dále používané. Tyto názvy jsou Naive, Slow a Fast. Naive označuje naivní způsob implementace založený přímo na polynomiálním dělení, Slow popisuje o něco rychlejší algoritmus, který je ovšem stále ještě pomalý a na závěr Fast, který popisuje nejrychlejší algoritmus pomocí look-up tabulek. Při programování jednotlivých algoritmů lze v programu MATLAB přistoupit k problému dvěma způsoby. Prvním z nich je maticová forma. I když při programování nenastává žádný problém, je nakonec tento způsob implementace vyhodnocen při testování jako pomalejší, než druhý způsob implementace. Ten již využívá pro uložení jednotlivých proměnných typy uint8 (unsigned integer 8), uint16 (unsigned integer 16) a uint32 (unsigned integer 32), známé např. z programovacího jazyka C. Číslo vždy udává, kolik bitů lze do dané proměnné uložit. V jednotlivých algoritmech jsou využívány následující funkce: zeros(1,n) – posloupnost
nul v maticové formě
length(posl) – délka vektoru (v maticové formě) poslToDec(posl) – binární posloupnost
v maticové formě je převedena na
odpovídající číslo z desítkové soustavy decToPosl(c,n) – číslo
z desítkové soustavy je převedeno na binární posloupnost prvků vektoru (v maticové formě) o délce bitand(a,b) – bitový
čísel
a
bitxor(a,b) – bitový
čísel
a
bitshift(a,n) – bitový posun čísla
o
bitů, na uvolněné pozice jsou doplněny nuly
Generující polynom je uložen v globální proměnné GENPOLY, která je odpovídajícího typu uint podle stupně generujícího polynomu. Do ní je nutno ukládat číslo (označující generující polynom) převedené z šestnáctkové soustavy do desítkové soustavy. Bližší podrobnosti reprezentace generujícího polynomu pomocí čísla v šestnáctkové soustavě jsou popsány v kapitole týkající se generujících polynomů. V každém algoritmu se také nachází proměnná topbit označující pozici nejvyššího možného bitu ve zvoleném typu uint. Protože jsou jednotlivé algoritmy navrženy pro následné testování generujících polynomů, jsou jim předávány rozdílné vstupní argumenty a výsledné zbytkové slovo 16
(zbytkový polynom) je převedeno na binární posloupnost ve formě vektoru v maticovém zápisu. Tento výsledný tvar je vhodný pro analyzování a zkoumání dalších vlastností. 3.3.1 Algoritmus 1 – Naive Algoritmus nazývaný v [15] jako Naive je nejjednodušší implementací zabezpečení dat pomocí CRC. Algoritmus přímo provádí klasické polynomiální dělení v aritmetice a jeho implementace v programu MATLAB se pro generující polynomy stupně 16 realizuje následujícím způsobem: function crc = crcNaive16(zprava) global GENPOLY; topbit = bitshift(1, 15); zpravaRozsirena = [zprava zeros(1, 16)]; delka = length(zpravaRozsirena); zbytek = uint16(poslToDec(zprava(1:16))); for bit = 17:delka if(bitand(zbytek, topbit)) zbytek = bitshift(zbytek, 1) + uint16(zpravaRozsirena(bit)); zbytek = bitxor(zbytek, GENPOLY); else zbytek = bitshift(zbytek, 1) + uint16(zpravaRozsirena(bit)); end end crc = decToPosl(double(zbytek), 16); end
Popis algoritmu: Jako argument je celé funkci předávána binární posloupnost ve formě vektoru v klasickém maticovém zápisu. Poté je zpráva rozšířena o počet nul, který odpovídá stupni generujícího polynomu. Do zbytku, který je typu uint16, je uloženo prvních 16 bitů převedených na odpovídající číslo z desítkové soustavy. Pomocí cyklu se do proměnné bit postupně načítají další bity od pozice 17 až po poslední bit rozšířené zprávy. V každém průchodu cyklem se testuje, zda má aktuální zbytek na nejvyšším bitu (odpovídajícím koeficientu u nejvyšší mocniny polynomu) hodnotu 1. Jestliže ano, pak je na zbytku proveden bitový posun o 1 bit doleva, na nejnižší pozici je načten nový bit z rozšířené zprávy a na vzniklý zbytek je provedena binární operace s generujícím polynomem ve tvaru čísla v desítkové soustavě. Jestliže je podmínka vyhodnocena jako false, pak je na zbytku proveden pouze bitový posun o 1 bit doleva a na nejnižší pozici je načten nový bit z rozšířené zprávy. Po ukončení cyklu je číslo v desítkové soustavě převedeno na binární posloupnost ve formě vektoru v maticovém zápisu. Tento krok je proveden z důvodu dalšího testování. Pozn.: Algoritmy Naive pro generující polynomy stupně 8 a 32 jsou uvedeny v přílohách v kapitole 6.1. 3.3.2 Algoritmus 2 – Slow O něco důmyslnější je implementace, která je v [15] nazývána jako Slow. Ta na rozdíl od algoritmu Naive nenačítá data po bitech, ale po bytech. Takže polynomiální dělení není prováděno přes celou délku zprávy, ale vždy pouze přes délku jednoho bytu, tedy 8 bitů. 17
Implementace algoritmu v programu MATLAB se pro generující polynomy stupně 16 realizuje následujícím způsobem: function crc = crcSlow16(zprava, pocetBytu) global GENPOLY; topbit = bitshift(1, 15); zbytek = uint16(0); for byte = 1:pocetBytu zbytek = bitxor(zbytek, bitshift(zprava(byte), 8)); for bit = 1:8 if(bitand(zbytek, topbit)) zbytek = bitxor(bitshift(zbytek, 1), GENPOLY); else zbytek = bitshift(zbytek, 1); end end end crc = decToPosl(double(zbytek), 16); end
Popis algoritmu: Jako argument je celé funkci předávána posloupnost čísel v desítkové soustavě, která reprezentují jednotlivé byty. Tato posloupnost je ve formě vektoru v maticovém zápisu. Zbytek je typu uint16 a na začátku je inicializován na 0. Na rozdíl od implementace algoritmu Naive, jsou pro algoritmus Slow potřeba dva vnořené cykly. Vnější cyklus vždy načte nový byte, provede s ním bitový posun doleva o jeden byte, tedy 8 bitů (číslo reprezentující v binárním zápise pozice bitů 7-0 se dostane na pozice bitů 15-8) a s takto vzniklým číslem provede bitovou operaci s aktuálně uloženým číslem ve zbytku. Vnitřní cyklus je obdobný s cyklem z algoritmu Naive s tím rozdílem, že polynomiální dělení probíhá pouze přes 8 bitů a není potřeba načítat na nejnižší pozice bity z binární posloupnosti zprávy. Nejprve je vždy vyhodnocena podmínka, jestli je nejvyšší bit zbytku roven 1. Jestliže ano, pak je proveden bitový posun zbytku o 1 bit doleva a na vzniklém zbytku provedena bitová operace s generujícím polynomem ve tvaru čísla z desítkové soustavy. Jestliže je podmínka vyhodnocena negativně, je proveden pouze bitový posun zbytku o 1 bit doleva. Po ukončení cyklu je číslo v desítkové soustavě převedeno na binární posloupnost ve formě vektoru v maticovém zápisu. Tento krok je proveden z důvodu dalšího testování. Pozn.: Algoritmy Slow pro generující polynomy stupně 8 a 32 jsou uvedeny v přílohách v kapitole 6.1. 3.3.3 Algoritmus 3 – Fast Nejrychlejší implementace pro zabezpečení dat pomocí CRC je v [15] nazývána jako Fast. Jedná se o algoritmus využívající vyhledávání v look-up tabulkách. V praktických aplikacích je z důvodu rychlosti výpočtu tento algoritmus nejpoužívanější. Výrazné zrychlení oproti algoritmu Slow spočívá v tom, že není potřeba provádět polynomiální dělení pro 8 bitů ve vnitřním cyklu, protože si lze tento výpočet předpočítat a výsledné hodnoty uložit do look-up tabulky. Při inicializaci look-up tabulky se vypočítává zbytkové slovo (zbytkový polynom) pro každou možnou hodnotu jednoho bytu, tj. binární posloupnosti 8 bitů. Protože , je v look-up tabulce uloženo 256 zbytkových slov tak, 18
že na hodnotě , kde , je uloženo zbytkové slovo pro tuto hodnotu. Inicializace look-up tabulky tedy musí proběhnout před samotným algoritmem Fast a každý generující polynom musí mít vlastní look-up tabulku. Pro vyhledávání hodnoty v look-up tabulce je vždy potřeba znát 1 byte typu uint8, nalezená hodnota je pak typu uint8, uint16 nebo uint32, dle stupně aktuálně zvoleného generujícího polynomu. Jelikož ve většině publikací chybí vysvětlení přechodu od implementace klasického polynomiálního dělení (algoritmus Naive – výpočet po jednotlivých bitech) k implementaci pomocí look-up tabulek (algoritmus Fast – výpočet po bytech a pomocí tabulek), je na místě zde tento přechod vysvětlit. Na dalších stranách jsou odvozeny výsledné vztahy pro následnou softwarovou implementaci pomocí generujících polynomů stupně 8, 16 a 32. Jedná se o rozšíření náznaku výpočtů z [8], [10], využívajících pouze generující polynom stupně 16. I když jsou všechna odvození navzájem podobná a liší se v detailech, dávají pokaždé trochu jiný výsledný vztah. A protože se pro generující polynomy stupně 8, 16 a 32 využívá pro uložení v počítači vždy jiný typ - uint8, uint16, uint32, je vhodné ukázat odvození výsledných vztahů pro každý z těchto tří stupňů generujících polynomů. Z důvodu návaznosti na jednotlivá odvození a z důvodu nejčastější možné implementace těchto algoritmů v praxi jsou všechny algoritmy Fast včetně inicializace odpovídající look-up tabulky uvedeny přímo zde v textu a ne až jako součást příloh. Odvození pro generující polynom
stupně 8:
Nechť je informační polynom stupně zbytku). Tyto binární polynomy jsou ve tvaru
je kontrolní polynom (polynom
,
. Jelikož je zbytek po vydělení polynomu takový, že
polynomem
, existuje polynom
. Nyní se rozšíří původní zpráva o 1 byte, což odpovídá posunu původní zprávy o 8 bitů doleva (tj. vynásobí se ) a na nejnižší uvolněné pozice se dosadí nový byte . Nový rozšířený informační polynom (rozšířená zpráva)
lze zapsat ve tvaru
, a k němu nově vzniklý kontrolní polynom [ kde se
jako
],
[ ] značí zbytek po vydělení polynomu pomocí , obdržíme [
]
[
[
polynomem
. Vyjádří-li
]
]
.
Jelikož platí, že zbytek po vydělení součtu polynomů jiným polynomem je roven součtu zbytků jednotlivých polynomů, dostáváme [
]
[
]
19
[
]
⏟
[ Rozepsáním polynomů
[
]
[
]
]. a
se dostane .
Zavedením substituce
pro
se obdrží
a tudíž [
].
Interpretace výsledku: - koeficienty polynomu se získají jako operace odpovídajících si koeficientů nového bytu a kontrolního polynomu (koeficienty polynomu zabírají 8 bitů). Tyto spočtené binární koeficienty odpovídají číslu v desítkové soustavě ukládanému v algoritmu Fast do proměnné data. Tato proměnná určuje pozici hledané hodnoty v look-up tabulce crcTable (pozn.: v programu Matlab nelze číslovat pozice ve vektoru od 0, ale až od 1. Proto je proměnná data zvýšena o 1. Tudíž v crcTable je hodnota 0 na pozici 1, …, hodnota 255 je na pozici 256). [ ] - podle generujícího polynomu se vypočte nový zbytkový polynom pro polynom (koeficienty polynomu pak zabírají 8 bitů). Tento krok odpovídá získání výsledku z globální proměnné crcTable pro pozici data, který je uložen do proměnné zbytek. function crcInitTable8() global GENPOLY; global crcTable; topbit = bitshift(1, 7); zbytek = uint8(0); for pozice = 0:255 zbytek = uint8(pozice); for bit = 1:8 if(bitand(zbytek, topbit)) zbytek = bitxor(bitshift(zbytek, 1), GENPOLY); else zbytek = bitshift(zbytek, 1); end end crcTable(pozice + 1) = zbytek; end end
20
function crc = crcFast8(zprava, pocetBytu) global crcTable; data = uint8(0); zbytek = uint8(0); for byte = 1:pocetBytu data = bitxor(zprava(byte), zbytek); zbytek = crcTable(double(data) + 1); end crc = decToPosl(double(zbytek), 8); end
Odvození pro generující polynom
stupně 16:
Nechť je informační polynom stupně zbytku). Tyto binární polynomy jsou ve tvaru
je kontrolní polynom (polynom
,
. Jelikož je zbytek po vydělení polynomu takový, že
polynomem
, existuje polynom
. Nyní se rozšíří původní zpráva o 1 byte, což odpovídá posunu původní zprávy o 8 bitů doleva (tj. vynásobí se ) a na nejnižší uvolněné pozice se dosadí nový byte . Nový rozšířený informační polynom (rozšířená zpráva)
lze zapsat ve tvaru
, a k němu nově vzniklý kontrolní polynom [ [ kde Vyjádří-li se
jako
], ] značí zbytek po vydělení polynomu pomocí , obdržíme [
]
[
[
polynomem
.
]
]
.
Jelikož platí, že zbytek po vydělení součtu polynomů jiným polynomem je roven součtu zbytků jednotlivých polynomů, dostáváme [ [
] ]
[ ⏟
[ Rozepsáním polynomů
[
] ]
]. a
se dostane
21
[
]
. Zavedením substituce
se obdrží
pro
, a tudíž [ [
] ]
[
Protože stupeň polynomu [
]
je menší než stupeň ]
, tak
.
Interpretace výsledku: - koeficienty polynomu se získají jako operace odpovídajících si koeficientů nového bytu a vyššího bytu (vyšší byte odpovídá koeficientům u členů , nižší byte odpovídá koeficientům u členů ) původního kontrolního polynomu (koeficienty polynomu zabírají 8 bitů). Tyto spočtené binární koeficienty odpovídají číslu v desítkové soustavě ukládanému v algoritmu Fast do proměnné data. Tato proměnná určuje pozici hledané hodnoty v look-up tabulce crcTable. [ ] - podle generujícího polynomu se vypočte nový zbytkový polynom pro polynom (koeficienty polynomu pak zabírají 16 bitů). Tento krok odpovídá získání výsledku z globální proměnné crcTable pro pozici data. [ ] …koeficienty nového kontrolního polynomu pro rozšířenou zprávu o 1 byte se získají jako operace odpovídajících si koeficientů vypočteného kontrolního polynomu a nižšího bytu původního kontrolního polynomu posunutého o 1 byte doleva na nejvyšší byte (koeficienty polynomu r pak také zabírají 16 bitů). Výsledek je uložen do proměnné zbytek. function crcInitTable16() global GENPOLY; global crcTable; topbit = bitshift(1, 15); zbytek = uint16(0); for pozice = 0:255 zbytek = bitshift(uint16(pozice), 8); for bit = 1:8 if(bitand(zbytek, topbit)) zbytek = bitxor(bitshift(zbytek, 1), GENPOLY); else zbytek = bitshift(zbytek, 1); end end crcTable(pozice + 1) = zbytek; end end
22
function crc = crcFast16(zprava, pocetBytu) global crcTable; data = uint16(0); zbytek = uint16(0); for byte = 1:pocetBytu data = bitxor(zprava(byte), bitshift(zbytek, -8)); zbytek = bitxor(crcTable(double(data) + 1), bitshift(zbytek, 8)); end crc = decToPosl(double(zbytek), 16); end
Odvození pro generující polynom
stupně 32:
Nechť je informační polynom stupně zbytku). Tyto binární polynomy jsou ve tvaru
je kontrolní polynom (polynom
,
. Jelikož je zbytek po vydělení polynomu takový, že
polynomem
, existuje polynom
. Nyní se rozšíří původní zpráva o 1 byte, což odpovídá posunu původní zprávy o 8 bitů doleva (tj. vynásobí se ) a na nejnižší uvolněné pozice se dosadí nový byte . Nový rozšířený informační polynom (rozšířená zpráva)
lze zapsat ve tvaru
, a k němu nově vzniklý kontrolní polynom [ [ kde Vyjádří-li se
jako
], ] značí zbytek po vydělení polynomu pomocí , obdržíme [
]
[
[
polynomem
.
]
]
.
Jelikož platí, že zbytek po vydělení součtu polynomů jiným polynomem je roven součtu zbytků jednotlivých polynomů, dostáváme [ [
] ]
[ ⏟
[ Rozepsáním polynomů
[
] ]
]. a
se dostane
23
[
]
. Zavedením substituce
se obdrží
pro
a tudíž [ [
] ]
[
Protože stupeň polynomu [
]
je menší než stupeň ]
, tak
.
Interpretace výsledku: - koeficienty polynomu se získají jako operace odpovídajících si koeficientů nového bytu a nejvyššího bytu (nejvyšší byte odpovídá koeficientům u členů , nejnižší byte odpovídá koeficientům u členů ) původního kontrolního polynomu (koeficienty polynomu zabírají 8 bitů). Tyto spočtené binární koeficienty odpovídají číslu v desítkové soustavě ukládanému v algoritmu Fast do proměnné data. Tato proměnná určuje pozici hledané hodnoty v look-up tabulce crcTable. [ ] - podle generujícího polynomu se vypočte nový zbytkový polynom pro polynom (koeficienty polynomu pak zabírají 32 bitů). Tento krok odpovídá získání výsledku z globální proměnné crcTable pro pozici data. [ ] - koeficienty nového kontrolního polynomu pro rozšířenou zprávu o 1 byte se získají jako operace odpovídajících si koeficientů vypočteného kontrolního polynomu a nejnižších 3 bytů původního kontrolního polynomu posunutých o 1 byte doleva na nejvyšší 3 byty (koeficienty polynomu r pak také zabírají 32 bitů). Výsledek je uložen do proměnné zbytek. function crcInitTable32() global GENPOLY; global crcTable; topbit = bitshift(1, 31); zbytek = uint32(0); for pozice = 0:255 zbytek = bitshift(uint32(pozice), 24); for bit = 1:8 if(bitand(zbytek, topbit)) zbytek = bitxor(bitshift(zbytek, 1), GENPOLY); else zbytek = bitshift(zbytek, 1); end end crcTable(pozice + 1) = zbytek; end end
24
function crc = crcFast32(zprava, pocetBytu) global crcTable; data = uint32(0); zbytek = uint32(0); for byte = 1:pocetBytu data = bitxor(zprava(byte), bitshift(zbytek, -24)); zbytek = bitxor(crcTable(double(data) + 1), bitshift(zbytek, 8)); end crc = decToPosl(double(zbytek), 32); end
3.4 Generující polynomy a jejich detekční schopnosti Správná implementace algoritmu a výběr vhodného generujícího polynomu jsou dvě zásadní věci při zabezpečování dat pomocí CRC. Softwarová implementace je popsána v předchozí kapitole, tato kapitola se zabývá popisem vlastností a volbou generujících polynomů. Tento text se zabývá pouze softwarovou implementací, ve které se z důvodu uložení koeficientů generujících polynomů v paměti počítače využívá výhradně generujících polynomů stupně 8, 16, 32 a 64. Vybraný seznam pro ostatní stupně generujících polynomů, které se využívají více v hardwarových implementacích, lze nalézt ve [12]. Výběr generujícího polynomu je důležitý zejména z důvodu možného vzniku nedetekované chyby. Nedetekovaná chyba je taková, kdy ke kódovému polynomu je během přenosu přičten takový chybový polynom s minimálně jedním bitem obsahujícím jedničku, že vzniklý polynom přenesené zprávy má při kontrole bezchybnosti přenosu nulový syndrom . Potom je polynom přenesené zprávy prohlášen za kódový polynom, který je dále dekódován, a tudíž nedojde k odhalení vzniklé chyby. Tento jev, který se může během přenosu objevit, vzniká, pokud z kódového polynomu, při přičtení chybového polynomu, vznikne jiný kódový polynom. Při špatné volbě generujícího polynomu může docházet ke zbytečnému nárůstu nedetekovaných chyb, které mohou být při další úpravě dat kritické. 3.4.1 Generující polynomy pro softwarovou implementaci Jak již bylo řečeno, pro softwarovou implementaci se využívá výhradně generujících polynomů stupně 8, 16, 32 a 64. Pro uložení koeficientů generujících polynomů do paměti počítače je výhodné volit jejich zápis v šestnáctkové soustavě. Tato soustava bude dále označována zkratkou a před číslo v šestnáctkové soustavě budou přidávány dva znaky (tento zápis je běžný např. v programovacím jazyce C). Problém ovšem je, že v různých publikacích, zabývajících se problematikou CRC se lze setkat se dvěma různými způsoby zápisu. Pomocí zápisu čísla v šestnáctkové soustavě lze definovat posloupnost bitů o délce násobků 4. Tedy 0, 4, 8, 12, 16, 20, 24,…, do paměti počítače však lze ukládat pouze po bytech (1 byte = 8 bitů), tedy po násobcích 8. Jelikož ale generující polynom stupně 8 má délku 9 bitů, stupně 16 má délku 17 bitů a stupně 32 má délku 33 bitů, zapisuje se do šestnáctkové soustavy bez úvodního nebo naopak bez posledního bitu 1. Zápis v tomto textu je dále volen podle [12], [15], ve kterém se vynechává úvodní bit, což je koeficient u nejvyšší mocniny polynomu. Druhý možný způsob, kdy se vynechává poslední bit, tedy koeficient u nejnižší mocniny, lze najít převážně v článcích P. Koopmana ([3], [4], [5], [6]), který se zabývá volbou a objevováním nových vhodných generujících polynomů. Pokud se tento způsob zápisu v textu objeví, bude za zkratkou uvedeno označení v závorce (Koopman). 25
Př. 8: Generující polynom stupně 8 zadaný polynomem odpovídá v binárním zápise . V šestnáctkové soustavě lze tuto posloupnost bitů zapsat jako: : (Koopman): Př. 9: Generující polynom stupně 16 zadaný polynomem odpovídá v binárním zápise V šestnáctkové soustavě lze tuto posloupnost bitů zapsat jako:
.
: (Koopman): Pozn. Tyto způsoby zápisu odpovídají MSB (Most Significant Bit), kdy je binární zápis polynomu zapisován od nejvyšší mocniny polynomu. Lze se však setkat i se zápisem LSB (Least Significant Bit), kdy je binární zápis polynomu zapisován od nejnižší mocniny polynomu. V tomto textu je vždy volen zápis MSB. Př. 10: Rozdíl v zápisu polynomu pro binární posloupnost znaků
:
MSB: LSB: Následuje seznam generujících polynomů stupně 8, 16 a 32, které budou dále zkoumány. Tyto generující polynomy jsou uvedeny v [3], [5], [12]. Protože pro každý stupeň existuje hned několik známých generujících polynomů, jsou generující polynomy číslovány (číslování odpovídá jejich dále využívanému číslování ve vytvořených programech). Pro lepší identifikaci jsou také generující polynomy pojmenovány. Pojmenování je voleno podle běžného označení v [3], [8], [12]. Pokud je jméno označeno hvězdičkou, je voleno pojmenování použité pouze ve vytvořených programech. Dále je u každého generujícího polynomu uveden jeho zápis v polynomickém vyjádření a jeho označení v šestnáctkové soustavě (zápis v i (Koopman) formě). Č.
CRC-8
1 2 3 4 5 6 7 8
CCITT DALLAS CRC-8 SAE WCDMA DARC-8 C2 *NoName8_1
Polynom
hex 0x07 0x31 0xD5 0x1D 0x9B 0x39 0x2F 0x4D
hex (Koopman)
0x83 0x98 0xEA 0x8E 0xCD 0x9C 0x97 0xA6
Tabulka 1: Seznam dále zkoumaných generujících polynomů stupně 8
Č. 1 2
CRC-16
Polynom
CCITT IBM
hex 0x1021 0x8005
26
hex (Koopman)
0x8810 0xC002
3
T10-DIF
0x8BB7
0xC5DB
4
DNP
0x3D65
0x9EB2
5 6
DECT ARINC
0x0589 0xA02B
0x82C4 0xD015
7
*NoName16_1
0x1FB7
0x8FDB
8
*NoName16_2
0x2D17
0x968B
9
*NoName16_3
0x90D9
0xC86C
10
*NoName16_4
0x5935
0xAC9A
11
*NoName16_5
0x755B
0xBAAD
12
*NoName16_6
0xA7D3
0xD3E9
13 14
*NoName16_7 *NoName16_8
0x4003 0xA097
0xA001 0xD04B
15
*NoName16_9
0x5B93
0xADC9
Tabulka 2: Seznam dále zkoumaných generujících polynomů stupně 16
Č.
CRC-32
1
IEEE 802.3
2
3
0x04C11DB7
0x82608EDB
0x1EDC6F41
0x8F6E37A0
0x741B8CD7
0xBA0DC66B
0x814141AB
0xC0A0A0D5
0xF4ACFB13
0xFA567D89
0x32583499
0x992C1A4C
0x20044009
0x90022004
*Koopman_1 Q
5
*Castagnoli_2
7
hex (Koopman)
*Castagnoli_1
4
6
Polynom hex
*Koopman_2 *Koopman_3
27
8 9
*Castagnoli_3 *Koopman_4
0xA833982B
0xD419CC15
0x00210801
0x80108400
Tabulka 3: Seznam dále zkoumaných generujících polynomů stupně 32
3.4.2 Matematický přístup k detekci chyb Generující polynom je z matematického pohledu polynom, který lze rozložit na součin ireducibilních (nerozložitelných) polynomů, z nichž některé jsou primitivní (viz [8], [16]). Všechny dále uvažované polynomy jsou nad okruhem . Definice 1: Ireducibilní polynom je polynom, který nelze rozložit na součin polynomů nižších stupňů. Definice 2: Ireducibilní polynom , pro které , je
stupně .
je primitivní polynom, jestliže nejmenší
Důsledek 1: Každý primitivní polynom je ireducibilní. Podle těchto ireducibilních a primitivních polynomů lze zjistit, zda a kdy bude kód odolný proti jednoduchým chybám, proti dvojici chyb, proti lichému počtu chyb a proti shlukovým chybám. Tímto způsobem sice nelze zjistit přesný počet nedetekovaných chyb pro určitý počet vzniklých chyb (tj. počet bitů s hodnotou 1 v chybovém polynomu ), ale na druhou stranu lze zjistit, pro které počty vzniklých chyb k nedetekovaným chybám zcela jistě nedochází. Následuje několik tvrzení včetně důkazů (viz. [2], [9]), jaké vlastnosti musí zvolený generující polynom mít, aby detekoval všechny vzniklé chyby daného typu. a) jednoduché chyby Tvrzení 1: Cyklický kód vytvořený generujícím polynomem detekuje všechny jednoduché chyby. Pozn.: Nejjednodušší takový generující polynom je
s více než jedním členem, .
Důkaz: Vznik jedné chyby lze obecně zapsat tak, že chybový polynom je ve tvaru . Aby byla zaručena detekce všech možných jednoduchých chyb, je nutné, aby nebyl chybový polynom dělitelný beze zbytku generujícím polynomem . To je ovšem splněno, protože žádný polynom s více než jedním členem nedělí beze zbytku. □ b) jednoduché chyby a lichý počet chyb Tvrzení 2: Každý polynom dělitelný polynomem má sudý počet členů. Cyklický kód generovaný polynomem detekuje všechny jednoduché chyby a každý lichý počet chyb. Důkaz: Nechť polynom . Jelikož veškeré výpočty probíhají v aritmetice , tak pro dostaneme . Každý člen polynomu je roven 1 a protože součet musí být roven 0, je nutné, aby polynom měl sudý počet členů. □
28
c) jednoduché a dvojné chyby Tvrzení 3: Nechť generující polynom je primitivní polynom stupně , pak kód generovaný tímto polynomem detekuje všechny jednoduché a dvojné chyby, pokud pro délku kódu platí: . Důkaz: Detekce všech dvojných chyb vyžaduje, aby generující polynom nedělil beze zbytku polynom pro . Nechť , pak lze polynom rozložit na součin . Je vyžadováno, aby generující polynom nedělil beze zbytku polynom . Jelikož ale a protože je generující polynom primitivní stupně , tak nemůže dělit beze zbytku. Podle Tvrzení 1 generující polynom nedělí beze zbytku ani polynom . Tudíž takový generující polynom detekuje všechny jednoduché a dvojné chyby až do délky kódu . □ d) dvojné chyby a lichý počet chyb Tvrzení 4: Nechť tvaru pro délku kódu platí:
je primitivní polynom stupně , pak kód generovaný polynomem ve detekuje všechny dvojné chyby a každý lichý počet chyb, pokud .
Důkaz: Lichý počet chyb je detekován kvůli přítomnosti polynomu , jak je uvedeno v Tvrzení 2. Dvojné chyby jsou detekovány, protože je primitivní polynom stupně , jak je uvedeno v Tvrzení 3. □ e) shlukové chyby Pozn.: Shluková chyba délky je každá skupina chyb, ve které počet znaků mezi první a poslední chybou (včetně těchto chyb) je . Př. 11: Chybový polynom délky 5.
je shluková chyba
Tvrzení 5: Cyklický kód generovaný polynomem chyby do délky kódu (včetně).
stupně
detekuje všechny shlukové
Důkaz: Každá shluková chyba může být rozložena na součin ve tvaru , kde je stupně . Tato shluková chyba je detekována pokud generující polynom nedělí polynom beze zbytku. Jestliže z generujícího polynomu nelze vytknout , pak může generující polynom dělit pouze pokud dělí . Jestliže ale , pak g(x) je vyššího stupně než , a proto určitě generující polynom nedělí polynom beze zbytku. □ V programu Matlab byl vytvořen program pro hledání ireducibilních polynomů (script test_ired.m s funkcí najdiIredPoly.m), program pro určení primitivních polynomů (script test_prim.m s funkcí najdiPrimPoly.m), program pro rozklad polynomu na ireducibilní polynomy s určením, které z nich jsou primitivní (script test_rozklad.m s funkcí rozklad.m) a struktura se seznamem všech generujících polynomů stupně 8, 16, 32 uvedených a očíslovaných dle Tabulka 1, Tabulka 2 a Tabulka 3. Správná funkčnost funkcí pro hledání ireducibilních a primitivních polynomů byla ověřena vygenerováním všech těchto polynomů až do stupně 15 a porovnáním výsledků s [17], [18], [19]. Pro nalezené polynomy stupně 1 až 5 byla ověřena přímá shoda všech nalezených polynomů, pro polynomy vyššího stupně byl ověřen počet nalezených polynomů.
29
Ireducibilní polynomy ,
1 2 3 4
, ,
, ,
5
,
,
,
,
Tabulka 4: Seznam všech ireducibilních polynomů stupně
Počet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
1
2
3
6
9
18
30
56
99
186
335
630
1161
2182
Tabulka 5: Počet všech nalezených ireducibilních polynomů stupně Primitivní polynomy 1 2 3 4
, , ,
5
,
,
,
,
Tabulka 6: Seznam všech primitivních polynomů stupně
Počet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
1
2
2
6
6
18
16
48
60
176
144
630
756
1800
Tabulka 7: Počet všech nalezených primitivních polynomů stupně Na základě vytvořeného programu na rozklad binárních polynomů a uvedených tvrzení 1 - 5 byl vytvořen podrobný rozbor všech generujících polynomů stupně 8, 16, 32 uvedených v Tabulka 1, Tabulka 2 a Tabulka 3. Př. 12: Rozbor generujícího polynomu č.1 CRC-16-CCITT (uveden jako číslo 1 v pořadí generujících polynomů stupně 16, viz Tabulka 2). Rozklad polynomu na součin ireducibilních polynomů je , kde polynomy označené indexem # určují primitivní polynom. Podle uvedených Tvrzení 1 - 7 jsou zjišťovány detekční schopnosti cyklického kódu vytvořeného tímto generujícím polynomem: Tvrzení 1: Generující polynom má více než jeden člen, tudíž je možno detekovat všechny jednoduché chyby. Tvrzení 2, 4: Generující polynom je dělitelný polynomem , tudíž je možno detekovat každý lichý počet chyb. Tvrzení 3, 4: Generující polynom obsahuje ve svém rozkladu primitivní polynom stupně , tudíž je možno detekovat dvojité chyby až do délky kódu . Tvrzení 5: Generující polynom je stupně 16, tudíž je možno detekovat všechny shlukové chyby až do délky 16. 30
Výsledky rozboru vlastností cyklických kódů generovaných ostatními polynomy uveden formou následujících tabulek.
Detekuje všechny jednoduché chyby
Detekuje lichý počet chyb
1
ano
ano
2
ano
ano
3
ano
ano
4
ano
ne
5
ano
ano
6
ano
ne
7
ano
ano
8
ano
ne
Č. CRC-8
Detekuje dvojité chyby až do délky kódu ano ano ano ano ano ne ano ano
je
Detekuje všechny shlukové chyby délky 8 a kratší ano ano ano ano ano ano ano ano
Tabulka 8: Detekční schopnosti generujících polynomů stupně 8 na základě jejich matematických vlastností
Detekuje všechny jednoduché chyby
Detekuje lichý počet chyb
1
ano
ano
2
ano
ano
3
ano
ne
4
ano
ano
5
ano
ano
6
ano
ne
7
ano
ano
8 9 10
ano ano ano
ne ano ne
11
ano
ne
12
ano
ne
13
ano
ano
Č. CRC-16
Detekuje dvojité chyby až do délky kódu ano ano ano ano ano ano ano ne ne ne ano ano ano
31
Detekuje všechny shlukové chyby délky 16 a kratší ano ano ano ano ano ano ano ano ano ano ano ano ano
14
ano
ano
15
ano
ano
ano ano
ano ano
Tabulka 9: Detekční schopnosti generujících polynomů stupně 16 na základě jejich matematických vlastností
Č. CRC-32
1 2 3 4
Detekuje všechny jednoduché chyby ano
Detekuje dvojité chyby až do délky kódu
Detekuje lichý počet chyb ne
ano
ano
ano
ano
ano
ano
5
ano
ano
6 7 8 9
ano ano ano ano
ano ano ne ne
ne ano ne ano ano ne ne ne ne
Detekuje všechny shlukové chyby délky 32 a kratší ano ano ano ano ano ano ano ano ano
Tabulka 10: Detekční schopnosti generujících polynomů stupně 32 na základě jejich matematických vlastností
3.5 Testování nedetekovaných chyb Při průchodu kódového slova (kódového polynomu ) přenosovým kanálem dochází k šumu. Tento šum je v zavedeném označení vyjádřen chybovým slovem (chybovým polynomem ), které je přičteno ke kódovému slovu, čímž vznikne přenesené kódové slovo (přenesený kódový polynom ) Pokud tento případ nastane ( ), bylo ukázáno, že při kontrole následované ihned po přenosu dojde k detekování většiny chyb. V případě, že přítomná chyba není při kontrole detekována, nazývá se nedetekovaná chyba. Ta nastane v případě, že vzniklý přenesený kódový polynom je roven kódovému polynomu ̅ odlišnému od původního kódového polynomu . Pro přítomnost nedetekované chyby tedy musí platit ̅ Př. 13: V kapitole 3.2 byl ukázán postup zabezpečení informačního polynomu generujícím polynomem . Po zabezpečení vznikl kódový polynom . Co se však stane při kontrole přeneseného kódového polynomu , pokud při přenosu nastala chyba v podobě chybového polynomu ? Oproti předchozím ukázkám kontroly je tentokrát zvolen postup kontroly podle bodu 5b) z kapitoly 3.2:
32
a) polynomické vyjádření
b) binární vyjádření
Z kontroly pomocí polynomického i binárního vyjádření je vidět, že došlo k nedetekované chybě. Kontrola vyhodnotí přenesený kódový polynom jako bezchybný, i když byl chybový polynom . Pokud by byl zvolen postup kontroly podle bodu 5a) z kapitoly 3.2, vyšel by syndrom , což by opět vedlo na nedetekovanou chybu. Nedetekovaná chyba je pro zabezpečení pomocí CRC kritická. Pokud totiž nastane, nedojde k jejímu odhalení a data s chybou se šíří dál a jsou považována za bezchybná. V kapitole 3.4.2 byl ukázán matematický popis toho, jaké chyby daný generující polynom detekuje. Bohužel však tímto přístupem nelze zjistit počet všech možných nedetekovaných chyb při zvolené délce kódového slova . A právě zjištění podílu nedetekovaných chyb při zvolené délce kódového slova a zvoleném počtu bitů s hodnotou 1 v chybovém polynomu si klade za cíl následující kapitola. V článcích P. Koopmana [3], [5] lze najít postup, jak vybrat nejvhodnější generující polynom. V těchto článcích autor označuje počet nedetekovaných chyb při zvoleném počtu bitů 1 v chybovém slově . pak označuje nejmenší počet bitů 1 v chybovém polynomu , pro které je . A právě na základě hodnot je prováděn výběr nejvhodnějšího generujícího polynomu ze všech možných generujících polynomů požadovaného stupně. Co však v těchto článcích není uvedeno (ani v jiné odborné literatuře) je to, jakým způsobem počet nedetekovaných chyb zjistit. I když cílem práce není přímo výběr nejlepšího generujícího polynomu, nýbrž pro zvolený generující polynom určit podíl nedetekovaných chyb, je i zde potřeba počet nedetekovaných chyb zjistit. Z výše zmíněných důvodů jsou veškeré dále zmíněné a navrhnuté postupy testování nedetekovaných chyb vlastním přínosem autora této práce. Při testování nedetekovaných chyb je využita vlastnost lineárních kódů, že součet dvou kódových slov (kódových polynomů) je opět kódové slovo (kódový polynom). Nedetekovaná chyba nastane v případě, že chybový polynom a současně vzniklý přenesený kódový polynom je kódovým polynomem 33
Jelikož však je kódový polynom, musí být kódový polynom také chybový polynom . Při testování a ověřování nedetekovaných chyb je tedy výhodné pracovat pouze s chybovým polynomem (na kódovém polynomu tudíž nezáleží). 3.5.1 Brute Force přístup Jak již název kapitoly napovídá, jedná se o metodu testování založenou na ověřování nedetekované chyby pro všechny možné kombinace (tedy o postup metodou hrubé síly bez jakýchkoliv vylepšení). Pro co možná nejrychlejší způsob provedení testů jsou použity pouze algoritmy Fast (viz. kapitola 3.3.3) využívající look-up tabulek. Test, zda daný chybový polynom vede na nedetekovanou chybu, je postaven přesně na myšlence uvedené na začátku kapitoly 3.5 a znázorněném vzorovém příkladu. Protože se testují pouze chybové polynomy , je nedetekovaná chyba identifikována, pokud je nově vypočítaný syndrom polynomu roven polynomu . Počet provedených testů, tj. počet provedení algoritmu Fast, je kombinační číslo ( ) kde je délka uvažovaného slova (chybového slova ) a je počet bitů s hodnotou 1 v tomto slově. Počet provedených testů odpovídá počtu způsobů, kterými lze v chybovém slově umístit bitů s hodnotou 1. Př. 14: Pro slova délky a je nutno ke zjištění počtu nedetekovaných jednoduchých, nedetekovaných dvojných, nedetekovaných trojných, nedetekovaných čtverných a nedetekovaných paterných chyb otestovat daným postupem za použití odpovídajícího algoritmu Fast (dle stupně generujícího polynomu) následující počet možností: Pro (
)
(
)
34
(
)
(
)
(
)
Pro (
)
(
)
(
)
(
)
(
)
Z uvedených výpočtů je dobře patrno, že s narůstající délkou a zejména pak se zvyšujícím se číslem udávajícím počet bitů 1 v chybovém slově výrazně roste počet možností potřebných pro testování. Algoritmus dále označovaný jako BruteForce1 pro zjištění počtu nedetekovaných chyb byl naprogramován ve funkci testuj_Error.m a spouští se ze skriptu testovani.m. Tyto i další potřebné funkce se nacházejí ve složce BruteForce1 (viz přílohy). Správnost navrženého algoritmu byla ověřena porovnáním s výsledky z [3]. Porovnané výsledky včetně přibližného času potřebného pro výpočet jsou uvedeny v následujících tabulkách. 35
č. CRC8 6 3 Čas výpočtu
1 bit
2 bity
3 bity
4 bity
5 bitů
0 0 0,006 s
66 0 0,197 s
0 0 2,956 s
2039 2984 42,414 s
0 0 403,377 s
Tabulka 11: Tabulka udávající počet nedetekovaných chyb v chybovém slově délky pro zvolený počet (počet bitů 1 v chybovém polynomu) a pro zvolený generující polynom stupně 8. Uvedené doby výpočtu platí pro každý generující polynom zvlášť, nikoliv dohromady.
č. CRC16 1 9 Čas výpočtu
1 bit
2 bity
3 bity
4 bity
5 bitů
0 0 0,007 s
0 0 0,283 s
0 0 5,120 s
84 0 77,876 s
0 0 934,135 s
Tabulka 12: Tabulka udávající počet nedetekovaných chyb v chybovém slově délky pro zvolený počet (počet bitů 1 v chybovém polynomu) a pro zvolený generující polynom stupně 16. Uvedené doby výpočtu platí pro každý generující polynom zvlášť, nikoliv dohromady. Z uvedených časů potřebných pro výpočet lze odvodit, že takovýto postup testování je naprosto nevhodný. Pokud by testování jednoho chybového slova trvalo přibližně ̇ pak by celkový výpočet počtu nedetekovaných chyb na délce ̇
̇
̇
pro
trval ̇
Jelikož však s rostoucí délkou se zvyšuje i čas pro otestování jednoho slova (pro je to už přibližně 0,001 s) netrval by pro uvedený výpočet ̇ , nýbrž již ̇ ̇ dní. S dalším zvyšováním délky , popř hodnoty , by testování tímto postupem mohlo zabrat měsíce či roky. Aby se tedy dal určovat počet nedetekovaných chyb, je potřeba vymyslet rychlejší způsob testování. Pro nalezení rychlejšího způsobu zjištění počtu nedetekovaných chyb je potřeba se blíže podívat, jak konkrétně vypadají chybová slova, nejlépe pak pro menší, ale libovolné hodnoty a pro generující polynomy nízkého stupně. Tyto předpoklady navržený algoritmus nesplňuje, protože může určovat počty nedetekovaných chyb pouze pro délky , které jsou násobky 8 (z důvodu použití algoritmů Fast) a pro generující polynomy stupně 8, 16 a 32. Pro možnost testování malých dat pro libovolný generující polynom byl navržen totožný postup testování, založený ovšem na algoritmu Naive navíc naprogramovaný v maticové podobě bez použití typů uint. Tímto je možné docílit možnosti testování nedetekovaných chyb pro libovolnou délku a generující polynomy libovolného stupně. Algoritmus, dále označovaný jako BruteForce1_Matrix, je naprogramován ve funkci testuj_Error.m a spouští se ze skriptu testovani.m. Tentokrát jsou však tyto i další potřebné funkce umístěny ve složce BruteForce1_Matrix (viz. přílohy). Tento algoritmus dává naprosto stejné výsledky jako algoritmus BruteForce1, ale s výrazně horší dobou potřebnou pro výpočet. Na testování malých dat je však tento algoritmus ideální. 36
3.5.2 Brute Force přístup – vylepšení Jak již bylo řečeno, pro nalezení rychlejší metody pro testování nedetekovaných chyb je potřeba se podívat, jak vypadají chybová slova, která vedou na nedetekované chyby. Protože pro začátek je lepší zkoumat malé délky chybového slova a generující polynomy nižších stupňů (dojde k nedetekovaným chybám u menší délky ), je zvolen pro výpis hodnot algoritmus BruteForce1_Matrix. Př. 15: Vypsání všech chybových slov s trojnými chybami vedoucími na nedetekovanou chybu při volbě délky a s využitím generujícího polynomu . Počet možností potřebných pro otestování všech možností je: (
)
Vypsání chybových slov vedoucích na nedetekované chyby:
Z vypsaných hodnot lze vypozorovat: - 1. typ nedetekované chyby - 2. typ nedetekované chyby - 3. typ nedetekované chyby - posun 2. typu o 1 pozici - posun 3. typu o 1 pozici - posun 2. typu o 2 pozice - posun 2. typu o 3 pozice - posun 2. typu o 4 pozice - posun 2. typu o 5 pozic Počet možností pro otestování chybových slov vedoucích na nedetekované chyby, ze kterých lze zjistit všechny možné typy chyb (bez jejich posunů), jsou všechna chybová slova, která mají bit s hodnotou 1 na první pozici: ( ) Př. 16: Vypsání všech chybových slov s dvojnými chybami vedoucími na nedetekovanou chybu při volbě délky a s využitím generujícího polynomu . Počet možností potřebných pro otestování všech možností je: (
)
37
Vypsání chybových slov vedoucích na nedetekované chyby:
Podobně jako v minulém příkladě, i zde lze vypozorovat podobnou závislost: - 1. typ nedetekované chyby - posun 1. typu o 1 pozici - posun 1. typu o 2 pozice - posun 1. typu o 3 pozice - posun 1. typu o 4 pozice Počet možností pro otestování chybových slov vedoucích na nedetekované chyby, ze kterých lze zjistit všechny možné typy chyb (bez jejich posunů), jsou všechna chybová slova, která mají bit s hodnotou 1 na první pozici: (
)
Ze zmíněných příkladů lze učinit závěrečné pozorování: Pozorování 1: Pro zjištění počtu nedetekovaných chyb na délce obsahujícího
(
chybového slova
bitů s hodnotou 1 není potřeba otestovat všech ( ) kombinací, nýbrž pouze
) kombinací, které mají na první pozici bit s hodnotou 1. Z nalezených typů je potřeba
další nedetekované chyby dopočítat tak, že každý určený typ se posouvá o 1 pozici doprava, dokud se -tý bit s hodnotou 1 nenachází na poslední pozici. Pozn.: Z několika pozorování pro různé délky a pro různé generující polynomy vyplývá, že všechny možné typy chybových slov, lze zjistit s uvažováním bitu 1 na první pozici. Tj. nenastane případ, že by se objevil nový typ chyby až s prvním bitem 1 např. na druhé nebo dalších pozicích. Zjištěné poznatky shrnuje následující věta: Věta 1: Nechť je dán generující polynom stupně a nechť kódová slova mají délku (kódové polynomy jsou stupně ), kde . Jestliže k-násobná chyba , vede na nedetekovanou chybu, pak také k-násobné chyby (se stejnými vzdálenostmi mezi jednotlivými koeficienty s hodnotou 1 jako u ) vedou na nedetekované chyby. Důkaz: Aby k-násobná chyba vedla na nedetekovanou chybu, musí být polynom beze zbytku dělitelný generujícím polynomem . Protože není beze zbytku dělitelné generujícím polynomem , musí být polynomem beze zbytku dělitelný polynom . Jestliže je polynom beze zbytku dělitelný generujícím polynomem , pak také všechny polynomy jsou beze zbytku dělitelné generujícím polynomem , a tudíž vedou na nedetekované chyby. □ 38
Př. 17: Pro slova délky a je v tomto příkladě ukázáno porovnání počtu chybových slov pro , potřebných k otestování pomocí navrhovaného vylepšeného algoritmu oproti algoritmu BruteForce1 (číslo uvedené u výpočtu v závorce): Pro (
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
Pro (
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
(
)
39
Z uskutečněných výpočtů je vidět velmi výrazné snížení počtu chybových slov nutných k otestování. Na základě uvedeného pozorování je upraven algoritmus BruteForce1 na BruteForce2, ve kterém se testují pouze kombinace chyb s bitem 1 na první pozici a ostatní nedetekované chyby jsou dopočítávány pro potřebný počet posunů o 1 pozici. Algoritmus BruteForce2 je naprogramován ve funkci testuj_Error.m a spouští se ze skriptu testovani.m. Tyto i další potřebné funkce jsou umístěny ve složce BruteForce2 (viz. přílohy). Správnost navrženého algoritmu byla opět ověřena porovnáním s výsledky z [3]. Porovnané výsledky včetně přibližných časů potřebných pro výpočet jsou uvedeny v následujících tabulkách. č. CRC8 6 3 Čas výpočtu Čas (BruteForce1)
1 bit
2 bity
3 bity
4 bity
5 bitů
0 0 0,0004 s 0,006 s
66 0 0,005 s 0,197 s
0 0 0,160 s 2,956 s
2039 2984 2,746 s 42,414 s
0 0 35,775 s 403,377 s
Tabulka 13: Tabulka udávající počet nedetekovaných chyb v chybovém slově délky pro zvolený počet (počet bitů 1 v chybovém polynomu) a pro zvolený generující polynom stupně 8. Uvedené doby výpočtu platí pro každý generující polynom zvlášť, nikoliv dohromady a jsou porovnány s dobou výpočtu pomocí algoritmu BruteForce1.
č. CRC16 1 9 Čas výpočtu Čas (BruteForce1)
1 bit
2 bity
3 bity
4 bity
5 bitů
0 0 0,0005 s 0,007 s
0 0 0,007 s 0,283 s
0 0 2,491 s 5,120 s
84 0 4,938 s 77,876 s
0 0 73,751 s 934,135 s
Tabulka 14: Tabulka udávající počet nedetekovaných chyb v chybovém slově délky pro zvolený počet (počet bitů 1 v chybovém polynomu) a pro zvolený generující polynom stupně 16. Uvedené doby výpočtu platí pro každý generující polynom zvlášť, nikoliv dohromady a jsou porovnány s dobou výpočtu pomocí algoritmu BruteForce1. Aby bylo možné ukázat navrhované zlepšení na malých datech, byl opět vytvořen obdobný způsob testování, ale s využitím algoritmu Naive v maticové podobě. Algoritmus označovaný dále BruteForce2_Matrix je naprogramován ve funkci testuj_Error.m a spouští se ze skriptu testovani.m. Tyto i další potřebné funkce jsou umístěny ve složce BruteForce2_Matrix (viz přílohy). Př. 18: Určení počtu všech chybových slov , s čtvernými chybami, vedoucími na nedetekovanou chybu při volbě délky a s využitím generujícího polynomu . Porovnání výpočtu pomocí algoritmu BruteForce1_Matrix a BruteForce2_Matrix. a) BruteForce1_Matrix Počet možností potřebných pro otestování je:
40
(
)
Vypsání všech chybových slov vedoucích na nedetekované chyby: - 1. typ nedetekované chyby - 2. typ nedetekované chyby - 3. typ nedetekované chyby - 4. typ nedetekované chyby - 5. typ nedetekované chyby - 6. typ nedetekované chyby - posun 1. typu o 1 pozici - posun 2. typu o 1 pozici - posun 3. typu o 1 pozici - posun 4. typu o 1 pozici - posun 5. typu o 1 pozici - posun 1. typu o 2 pozice - posun 2. typu o 2 pozice - posun 5. typu o 2 pozice - posun 2. typu o 3 pozice - posun 2. typu o 4 pozice b) BruteForce2_Matrix Počet možností potřebných pro otestování je: (
)
( )
Vypsání potřebných chybových slov vedoucích na nedetekovanou chybu a odvození výpočtu všech nedetekovaných chyb podle vzorce udávajícího počet možných posunů daného typu chybového slova.
Celkový počet nedetekovaných chyb je tedy: Počet 16 nedetekovaných chyb vyšel i algoritmem BruteForce1_Matrix a je tedy prokázána shodnost obou algoritmů. Algoritmus BruteForce2 tedy přináší oproti předchozímu algoritmu výrazné zkrácení doby potřebné pro výpočet z důvodu výrazného snížení počtu chybových slov nutných k otestování.
41
3.5.3 Clever přístup Předchozí algoritmy BruteForce1 a BruteForce2 jsou založeny na testování všech možných chybových slov, popř. s bitem 1 na první pozici, ze kterých se určují ty, jenž vedou na nedetekovanou chybu. I když algoritmus BruteForce2 přináší obrovské snížení počtu chybových slov potřebných k otestování, nevyužívá tento přístup matematických vlastností generujících polynomů popsaných v kapitole 3.4.2. Cílem této kapitoly je tedy propojení zmíněných matematických vlastností generujících polynomů s algoritmem BruteForce2 pro získání ještě výraznějšího snížení počtu chybových slov potřebných k otestování. Z důvodu využívání matematických vlastností, které platí vždy pouze pro speciální případy, je potřeba zkoumat zvlášť případy jednotlivých druhů chyb. V následujících odstavcích jsou vysvětlena navrhovaná vylepšení pro jednoduché, dvojné, trojné a čtverné chyby, ke kterým se dospělo z pozorování výsledků zjištěných testováním pomocí algoritmu BruteForce2_Matrix. Všechny tyto postupy lišící se pouze druhem chyby jsou dále nazývány Clever. 3.5.3.1 Testování jednoduchých chyb Jednoduchá chyba je taková, u které chybové slovo obsahuje v celé své délce pouze jeden bit s hodnotou 1. I když algoritmus BruteForce2 sníží počet chybových slov potřebných k otestování na jedinou možnost (bit s hodnotou 1 se nachází na první pozici), na základě Tvrzení 1 z kapitoly 3.4.2 není potřeba testovat ani tuto jedinou možnost. Uvedené tvrzení totiž říká, že generující polynom s více než jedním členem detekuje všechny jednoduché chyby. Jednoduché chyby tedy není potřeba již dále vůbec testovat, protože počet nedetekovaných chyb je vždy 0. Př. 19: Porovnání počtu chybových slov s jednoduchou chybou potřebných k otestování na délce slova pomocí algoritmů BruteForce1, BruteForce2 a Clever. a) BruteForce1 Počet možností potřebných pro otestování je: (
)
b) BruteForce2 Počet možností potřebných pro otestování je: (
)
(
)
c) Clever Počet možností potřebných pro otestování je 0. 3.5.3.2 Testování dvojných chyb Dvojná chyba je taková, u které chybové slovo obsahuje v celé své délce právě dva bity s hodnotou 1. Pro další popis je potřeba rozdělit generující polynomy podle jejich rozkladu na ireducibilní a primitivní polynomy do tří typů. Dále u rozkladu generujících polynomů označuje index # primitivní polynom (polynom bez indexu # je pouze ireducibilní) a označuje nejvyšší stupeň primitivního polynomu daného rozkladu.
42
Typ I: generující polynomy ve tvaru
Typ II: generující polynomy tvaru
Typ III: generující polynomy tvaru
3.5.3.2.1 Generující polynomy typu I Následuje bližší prozkoumání dvojných chyb pro generující polynomy typu I. Z důvodu úspory místa nejsou dále chybová slova vedoucí na nedetekovanou chybu kompletně vypisována, ale jsou pouze vypisovány pozice bitů v těchto slovech, které mají hodnotu 1. Hodnoty jsou odděleny pomlčkou a jsou testována pouze chybová slova s bitem na první pozici rovným 1. Tvrzení 3 a 4 z kapitoly 3.4.2 říkají, že generující polynomy typu I detekují všechny dvojné chyby až do délky kódu , kde je stupeň primitivního polynomu. Př. 20: Výpis pozic bitů, které mají hodnotu 1 v chybových slovech délky vedoucích na nedetekovanou chybu. Vypsané hodnoty jsou shodné pro všechny uvedené generující polynomy. a)
, generující polynomy:
Nejvyšší stupeň primitivního polynomu je . Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici:
Jak je vidět, pozice druhého bitu s hodnotou 1 se opakuje po 15 pozicích. Číslo 15 také vychází ze vzorce z uvedených Tvrzení 3 a 4, tj. . První nedetekovaná chyba se vyskytuje až na délce slova 16, což ověřuje správnost obou tvrzení. Z definice primitivního polynomu ihned plyne, že 2. bit s hodnotou 1 je na pozici .
43
b)
, generující polynomy:
Nejvyšší stupeň primitivního polynomu je . Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici:
Jak je vidět, pozice druhého bitu s hodnotou 1 se opakuje po 31 pozicích. Číslo 31 také vychází ze vzorce z uvedených Tvrzení 3 a 4, tj. . První nedetekovaná chyba se vyskytuje až na délce slova 32, což ověřuje správnost obou tvrzení. c)
, generující polynom:
Nejvyšší stupeň primitivního polynomu je . Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici:
Jak je vidět, pozice druhého bitu s hodnotou 1 se opakuje po 63 pozicích. Číslo 63 také vychází ze vzorce z uvedených Tvrzení 3 a 4, tj. . První nedetekovaná chyba se vyskytuje až na délce slova 64, což ověřuje správnost obou tvrzení. d)
, generující polynom:
Nejvyšší stupeň primitivního polynomu je . Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici: Jak je vidět, pozice druhého bitu s hodnotou 1 se opakuje po 127 pozicích. Číslo 127 také vychází ze vzorce z uvedených Tvrzení 3 a 4, tj. . První nedetekovaná chyba se vyskytuje až na délce slova 128, což ověřuje správnost obou tvrzení. Pozn.: To, že první nedetekovaná chyba chybového slova nastane tehdy, když je druhý bit s hodnotou 1 na pozici , plyne přímo z definice primitivního polynomu. Ze zmíněných příkladů lze učinit závěrečné pozorování: Pozorování 2: U generujících polynomů typu I nastává nedetekovaná chyba vždy, když druhý bit s hodnotou 1 je vzdálen o násobky pozic od prvního bitu. Číslo značí nejvyšší stupeň primitivního polynomu. Zjištěné poznatky shrnuje pro primitivní generující polynomy následující věta: Věta 2: Nechť je primitivní generující polynom stupně . Pak pro každé platí, že chybové polynomy , kde , vedou na nedetekovanou chybu.
44
Důkaz: Důkaz se provede matematickou indukcí. Dále nechť je bitový zápis polynomu , je bitová posloupnost znaků a je bitová posloupnost znaků. Nyní se ve dvou krocích provede samotný důkaz na binárním vyjádření polynomiálního dělení. Z předcházejícího textu vyplývá, že se uvažují chybová slova, která mají chybový bit s hodnotou 1 na první pozici. 1) Podle definice primitivního polynomu stupně platí, že nejmenší , pro které , je (v aritmetice je ). Dále se postupuje pomocí algoritmu na dělení polynomů v binární podobě znázorněném v kapitole 3.2. ⏟ - pozice ⏟
(zb2)
Vyšel nulový zbytek. Podle bodu 5a) z kapitoly 3.2 vede pro na nedetekovanou chybu.
chybový polynom
2) Nutno ukázat, že pokud platí pro , pak platí pro . Pokud je druhý bit s hodnotou 1 na pozici , tj. pro , pak chybový polynom vede na nedetekovanou chybu. Protože dále je pro potřeba mít druhý bit s hodnotou 1 na pozici, je na pozici hodnota 0. ⏟
⏟
- pozice
⏟
(zb2)
⏟
(zb2)
Vyšel nulový zbytek. Podle bodu 5a) z kapitoly 3.2 vede pro chybový polynom na nedetekovanou chybu. Tudíž pro chybový polynom vede na nedetekovanou chybu. □
45
Pomocí tohoto pozorování lze pro generující polynomy stupně určovat počet nedetekovaných chyb pro libovolnou délku bez jakéhokoliv testování chybových slov. Tohle vylepšení je naprogramováno ve funkci spoctiNedetekErr2Typ1.m a spouští se ze skriptu test.m. Tyto i další potřebné funkce jsou uloženy ve složce Clever (viz přílohy). Př. 21: Porovnání algoritmů BruteForce1, BruteForce2 a Clever při určení počtu nedetekovaných dvojných chyb na délce s využitím generujícího polynomu (CRC8 číslo 4 viz Tabulka 1). a) BruteForce1 Počet možností potřebných pro otestování je: (
)
Zjištěný počet nedetekovaných chyb je: b) BruteForce2 Počet možností potřebných pro otestování je: (
)
(
)
Zjištěný počet nedetekovaných chyb je: c) Clever Počet možností potřebných pro otestování je: 0 Nejvyšší stupeň primitivního polynomu je . Nedetekovaná chyba nastane vždy, když je druhý bit s hodnotou 1 posunut od prvního o pozic. Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici a výpočtem hodnoty udávající dopočet posunů o 1 pozici do zvolené délky:
Celkový počet nedetekovaných chyb:
Př. 22: Porovnání časů výpočtů pomocí algoritmů BruteForce2 a Clever pro určení počtu nedetekovaných dvojných chyb na délce za použití generujícího polynomu (CRC16 číslo 1 viz. Tabulka 2). a) BruteForce2 Počet možností potřebných pro otestování je: (
)
(
)
Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ ̇
46
b) Clever Počet možností potřebných pro otestování je: 0 Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ *c) BruteForce1 (pouze teoreticky) Bez praktického ověření lze provést výpočet potřebného času i pro BruteForce1. Počet možností potřebných pro otestování je: (
)
Čas potřebný pro výpočet: ̇
̇
̇
̇
̇
Na tomto příkladě je výborně vidět, jaké jsou možnosti výpočtu pomocí algoritmu Clever. Zatímco algoritmus Clever, při vhodné volbě generujícího polynomu, počítá i pro velké hodnoty délky počet nedetekovaných dvojných chyb v řádu tisícin sekundy, algoritmus BruteForce2 stejný úkol zvládá v řádech minut. Výpočet pomocí algoritmu BruteForce1 by už zabral necelý jeden rok. 3.5.3.2.2 Generující polynomy typu II Následuje bližší prozkoumání dvojných chyb pro generující polynomy typu II. Uvedená vylepšení jsou opět součástí algoritmu Clever. Stejně jako v předchozí kapitole ani zde nejsou chybová slova kompletně vypisována, ale jsou uvedeny pouze pozice bitů s hodnotou 1. Př. 23: Výpis pozic bitů, které mají hodnotu 1 v chybových slovech délky nedetekovanou chybu. a)
vedoucích na
, generující polynom:
Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici:
Jak je vidět, pozice druhého bitu s hodnotou 1 je vždy vzdálena od prvního bitu o násobky 5 pozic. Číslo 5 lze získat jako vzdálenost bitů s hodnotou 1 z první nedetekované chyby, protože . b)
, generující polynom:
Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici:
47
Jak je vidět, pozice druhého bitu s hodnotou 1 je vždy vzdálena od prvního bitu o násobky 17 pozic. Číslo 17 lze získat jako vzdálenost bitů s hodnotou 1 z první nedetekované chyby, protože 18 . Na základě Tvrzení 5 z kapitoly 3.4.2 dojde k detekci všech shlukových chyb až do délky stupně generujícího polynomu, není tedy potřeba testovat chybová slova se vzdáleností bitů s hodnotou 1 menší, než je stupeň generujícího polynomu. Př. 24: Ukázka nutnosti testování chybových slov u generujícího polynomu typu II . - není potřeba testovat (vzdálenost 1) - není potřeba testovat (vzdálenost 2) - není potřeba testovat (vzdálenost 3) - není potřeba testovat (vzdálenost 7) - nutno testovat (vzdálenost 8) - nutno testovat (vzdálenost 9)
Podle zjištěných poznatků lze učinit pozorování: Pozorování 3: U generujících polynomů stupně typu II není potřeba testovat chybová slova se vzdáleností bitů s hodnotou 1 bližší než . Dále stačí testovat chybová slova pouze do nalezení první nedetekované chyby. Jestliže má toto chybové slovo bity s hodnotou 1 na pozicích a , pak další nedetekované chyby nastanou u chybových slov, kde je druhý bit s hodnotou 1 vzdálen od prvního bitu o pozic. Na rozdíl od vylepšení pro generující polynomy typu I je pro generující polynomy typu II potřeba testovat několik chybových slov, i tak ale dochází k výraznému vylepšení. Navrhnuté vylepšení ztrácí svoji efektivitu, pokud na zadané délce nedojde k žádné nedetekované chybě. Pak je vylepšení oproti algoritmu BruteForce2 pouze v nepotřebě testování úvodních chybových slov z důvodu platnosti zmíněného Tvrzení 5 z kapitoly 3.3.2. Tohle vylepšení je naprogramováno ve funkcích spoctiNedetekErr2Typ2_8.m, spoctiNedetekErr2Typ2_16.m, spoctiNedetekErr2Typ2_32.m a spouští se ze skriptu test.m. Tyto i další potřebné funkce jsou uloženy opět ve složce Clever (viz přílohy). Př. 25: Porovnání algoritmů BruteForce1, BruteForce2 a Clever při určení počtu nedetekovaných dvojných chyb na délce s využitím generujícího polynomu (CRC8 číslo 6 viz Tabulka 1). a) BruteForce1 Počet možností potřebných pro otestování je: (
)
Zjištěný počet nedetekovaných chyb je: 48
b) BruteForce2 Počet možností potřebných pro otestování je: (
)
(
)
Zjištěný počet nedetekovaných chyb je: c) Clever Počet otestovaných chybových slov potřebných pro nalezení první nedetekované chyby: 10 První nedetekovaná chyba: Další nedetekované chyby již není potřeba hledat testováním chybových slov. Nedetekovaná chyba nastane vždy, když je druhý bit s hodnotou 1 posunut od prvního o pozic. Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici a výpočtem hodnoty udávající dopočet posunů o 1 pozici do zvolené délky:
Celkový počet nedetekovaných chyb: Př. 26: Porovnání časů výpočtů pomocí algoritmů BruteForce2 a Clever pro určení počtu nedetekovaných dvojných chyb na délce za použití generujícího polynomu (CRC16 číslo 10 viz Tabulka 2). a) BruteForce2 Počet možností potřebných pro otestování je: (
)
(
)
Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ ̇
b) Clever Počet možností potřebných pro otestování je: Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ *c) BruteForce1 (pouze teoreticky) Bez praktického ověření lze opět provést výpočet potřebného času i pro BruteForce1. Počet možností potřebných pro otestování je: (
)
Čas potřebný pro výpočet: ̇
̇
̇
̇
̇
Tento příklad opět názorně ukazuje, že i pro generující polynomy typu II lze výrazně zkrátit dobu potřebnou pro výpočet. 49
3.5.3.2.3 Generující polynomy typu III Následuje bližší prozkoumání dvojných chyb pro generující polynomy typu III. Uvedená vylepšení jsou velice podobná vylepšením pro generující polynomy typu II a jsou opět součástí algoritmu Clever. Stejně jako v předchozích kapitolách ani zde nejsou chybová slova kompletně vypisována, ale jsou uvedeny pouze pozice bitů s hodnotou 1. Př. 27: Výpis pozic bitů, které mají hodnotu 1 v chybových slovech délky vedoucích na nedetekovanou chybu. Generující polynom je .
,
Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici:
Jak je vidět, pozice druhého bitu s hodnotou 1 je vždy vzdálena od prvního bitu o násobky 93 pozic. Číslo 93 lze získat jako vzdálenost bitů s hodnotou 1 z první nedetekované chyby, protože (tj. stejná úvaha jako pro generující polynomy typu II). V předchozí kapitole bylo Tvrzení 5 z kapitoly 3.4.2, říkající, že dojde k detekci všech shlukových chyb až do délky stupně generujícího polynomu, využito k tomu, že není potřeba testovat chybová slova se vzdáleností bitů s hodnotou 1 menší než je stupeň generujícího polynomu. Ovšem na základě Tvrzení 3 z kapitoly 3.4.2 dojde k detekci všech dvojných chyb až do délky kódu , kde je nejvyšší stupeň primitivního polynomu. Jestliže je tedy generující polynom stupně typu III s nejvyšším stupněm primitivního polynomu , pak není potřeba testovat chybová slova se vzdáleností bitů s hodnotou 1 menší, než je maximum z hodnot a , tj. . Př. 28: Ukázka nutnosti testování chybových slov u generujícího polynomu typu III Stupeň generujícího polynomu: Nejvyšší stupeň primitivního polynomu: - není potřeba testovat (vzdálenost 1) - není potřeba testovat (vzdálenost 2) - není potřeba testovat (vzdálenost 30) - nutno testovat (vzdálenost 31) - nutno testovat (vzdálenost 32)
Podle zjištěných poznatků lze učinit pozorování: Pozorování 4: U generujících polynomů stupně typu III s nejvyšším stupněm primitivního polynomu není potřeba testovat chybová slova se vzdáleností bitů s hodnotou 1 menší než je . Dále stačí testovat chybová slova pouze do nalezení první nedetekované chyby. Jestliže má toto chybové slovo bity s hodnotou 1 na pozicích a , pak další nedetekované chyby nastanou u chybových slov, kde je druhý bit s hodnotou 1 vzdálen od prvního bitu o pozic. 50
Generující polynomy typu III mají tedy obdobné vylepšení jako generující polynomy typu II s tím rozdílem, že mohou většinou vynechat více počátečních chybových slov. Navržené vylepšení ztrácí opět svoji efektivitu, pokud na zadané délce nedojde k žádné nedetekované chybě. Pak je vylepšení oproti algoritmu BruteForce2 opět pouze v nepotřebě testování úvodních chybových slov z důvodu platnosti zmíněných Tvrzení 3 a 5 z kapitoly 3.4.2. Tohle vylepšení je naprogramováno ve funkcích spoctiNedetekErr2Typ3_8.m, spoctiNedetekErr2Typ3_16.m, spoctiNedetekErr2Typ3_32.m a spouští se ze skriptu test.m. Tyto i další potřebné funkce jsou uloženy opět ve složce Clever (viz přílohy). Př. 29: Porovnání algoritmů BruteForce1, BruteForce2 a Clever při určení počtu nedetekovaných dvojných chyb na délce s využitím generujícího polynomu (CRC8 číslo 3 viz Tabulka 1). a) BruteForce1 Počet možností potřebných pro otestování je: (
)
Zjištěný počet nedetekovaných chyb je: b) BruteForce2 Počet možností potřebných pro otestování je: (
)
(
)
Zjištěný počet nedetekovaných chyb je: c) Clever Počet otestovaných chybových slov potřebných pro nalezení první nedetekované chyby: První nedetekovaná chyba: Další nedetekované chyby již není potřeba hledat testováním chybových slov. Nedetekovaná chyba nastane vždy, když je druhý bit s hodnotou 1 posunut od prvního o pozic. Chybová slova vedoucí na nedetekované chyby s bitem 1 na první pozici a výpočtem hodnoty udávající dopočet posunů o 1 pozici do zvolené délky:
Celkový počet nedetekovaných chyb: Př. 30: Porovnání časů výpočtů pomocí algoritmů BruteForce2 a Clever pro určení počtu nedetekovaných dvojných chyb na délce za použití generujícího polynomu (CRC16 číslo 10 viz Tabulka 2). a) BruteForce2 Počet možností potřebných pro otestování je:
51
(
)
(
)
Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ ̇
b) Clever Počet možností potřebných pro otestování je: Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ ̇ *c) BruteForce1 (pouze teoreticky) Bez praktického ověření lze opět provést výpočet potřebného času i pro BruteForce1. Počet možností potřebných pro otestování je: (
)
Čas potřebný pro výpočet: ̇
̇
̇
̇
̇
K výraznému zlepšení, oproti algoritmům BruteForce1 a BruteForce2, dochází u všech tří typů generujících polynomů. Jednoznačně nejlepšího vylepšení je dosaženo pro generující polynomy typu I, u nichž lze přesný počet nedetekovaných chyb pro libovolnou délku chybového slova určit bez jakéhokoliv testování. U ostatních dvou vylepšení pro generující polynomy typu II a III nelze jednoznačně říci, které je lepší. Oba algoritmy musí provádět testování chybových slov až do nalezení první nedetekované chyby. Zatímco algoritmus pro typ III vynechává více úvodních chybových slov, dochází u něj na druhou stranu k pozdější detekci první nedetekované chyby.
3.5.3.3 Testování trojných chyb Trojná chyba je taková, u které chybové slovo obsahuje v celé své délce právě tři bity s hodnotou 1. V dalších odstavcích jsou ukázána vylepšení pro dva speciální případy generujících polynomů. Těmi jsou generující polynomy obsahující při svém rozkladu výraz a primitivní generující polynomy, tj. . 3.5.3.3.1 Generující polynomy obsahující výraz U generujících polynomů obsahujících výraz je situace velmi jednoduchá z důvodu platnosti Tvrzení 2 a 4 z kapitoly 3.4.2. Tato tvrzení říkají, že výraz zajistí detekci každého lichého počtu chyb. Není tedy potřeba testovat žádná chybová slova a počet nedetekovaných chyb je vždy . Př. 31: Porovnání počtu chybových slov s trojnou chybou, potřebných k otestování na délce slova pomocí algoritmu BruteForce1, BruteForce2 a Clever.
52
a) BruteForce1 Počet možností potřebných pro otestování je: (
)
b) BruteForce2 Počet možností potřebných pro otestování je: (
)
(
)
c) Clever Počet možností potřebných pro otestování je: 3.5.3.3.2 Primitivní generující polynomy Následuje bližší prozkoumání generujících polynomů ve tvaru , kde je stupeň primitivního polynomu (zároveň i celého generujícího polynomu). Primitivní polynom hrál důležitou roli ve vylepšených algoritmech pro testování dvojných chyb a nejinak tomu je i nyní. Uvedená vylepšení jsou opět součástí algoritmu Clever. Ani zde nejsou chybová slova kompletně vypisována, ale jsou uvedeny pouze pozice bitů s hodnotou 1. Prozkoumávána jsou opět pouze chybová slova s bitem 1 na první pozici a z nalezených nedetekovaných chyb jsou dopočítávány posuny tohoto slova doprava, jak je vysvětleno u algoritmu BruteForce2. Pro úvodní příklad s malou délkou chybových slov je nutno opět využít algoritmus BruteForce2_Matrix. Př. 32: Výpis pozic bitů, které mají hodnotu 1 v chybových slovech délky , vedoucích na nedetekovanou chybu při volbě generujícího polynomu . V tomto příkladě budou zavedeny určité úpravy v označení (z důvodu úspory místa): první bit s hodnotou 1 v chybovém slově = 1. bit druhý bit s hodnotou 1 v chybovém slově = 2. bit třetí bit s hodnotou 1 v chybovém slově = 3. bit chybové slovo vedoucí na nedetekovanou chybu = slovo Na základě této dohody je zavedeno další označení: vzdálenost 2. bitu od 1. bitu = vzdálenost 3. bitu od 2. bitu = čísla v hranatých závorkách mají význam: [ a)
]
,
Zvolený generující polynom je primitivní: Nejvyšší stupeň primitivního polynomu je ] -[ - posun 3. bitu od 1. slova o 15 pozic - posun 3. bitu od 2. slova o 15 pozic ] -[ - posun 3. bitu od 4. slova o 15 pozic - posun 3. bitu od 5. slova o 15 pozic ] -[ 53
- posun 3. bitu od 7. slova o 15 pozic - posun 3. bitu od 8. slova o 15 pozic ] -[ - posun 3. bitu od 10. slova o 15 pozic ] -[ - posun 3. bitu od 12. slova o 15 pozic - posun 3. bitu od 13. slova o 15 pozic ] -[ - posun 3. bitu od 15. slova o 15 pozic - posun 3. bitu od 16. slova o 15 pozic ] -[ - posun 3. bitu od 18. slova o 15 pozic - posun 3. bitu od 19. slova o 15 pozic ] -[ - posun 3. bitu od 21. slova o 15 pozic ] -[ - posun 3. bitu od 23. slova o 15 pozic ] -[ - posun 3. bitu od 25. slova o 15 pozic ] -[ - posun 3. bitu od 27. slova o 15 pozic - posun 3. bitu od 28. slova o 15 pozic ] -[ - posun 3. bitu od 30. slova o 15 pozic ] -[ - posun 3. bitu od 32. slova o 15 pozic ] -[ - posun 3. bitu od 34. slova o 15 pozic - posun 2. a 3. bitu od 1. slova o 15 pozic - posun 3. bitu od 36. slova o 15 pozic - posun 2. a 3. bitu od 4. slova o 15 pozic - posun 3. bitu od 38. slova o 15 pozic - posun 2. a 3. bitu od 7. slova o 15 pozic - posun 3. bitu od 40. slova o 15 pozic - posun 2. a 3. bitu od 10. slova o 15 pozic - posun 2. a 3. bitu od 12. slova o 15 pozic - posun 3. bitu od 43. slova o 15 pozic - posun 2. a 3. bitu od 15. slova o 15 pozic - posun 3. bitu od 45. slova o 15 pozic - posun 2. a 3. bitu od 18. slova o 15 pozic - posun 3. bitu od 47. slova o 15 pozic - posun 2. a 3. bitu od 21. slova o 15 pozic - posun 2. a 3. bitu od 23. slova o 15 pozic - posun 2. a 3. bitu od 25. slova o 15 pozic - posun 2. a 3. bitu od 27. slova o 15 pozic - posun 3. bitu od 52. slova o 15 pozic - posun 2. a 3. bitu od 30. slova o 15 pozic - posun 2. a 3. bitu od 32. slova o 15 pozic - posun 2. a 3. bitu od 34. slova o 15 pozic 54
- posun 2. a 3. bitu od 36. slova o 15 pozic - posun 2. a 3. bitu od 38. slova o 15 pozic - posun 2. a 3. bitu od 40. slova o 15 pozic - posun 2. a 3. bitu od 43. slova o 15 pozic - posun 2. a 3. bitu od 45. slova o 15 pozic - posun 2. a 3. bitu od 47. slova o 15 pozic - posun 2. a 3. bitu od 52. slova o 15 pozic Jak je vidět, ze všech 63 chybových slov vedoucích na nedetekovanou chybu jich je pouze 14 (označeny červeně), jejichž bity nejsou pouze posunem nějakého jiného chybového slova. Všechny posuny, ať již pouze 3. bitu nebo 2. a zároveň 3. bitu, jsou bez výjimky přesně o 15 pozic. Číslo 15 také vychází ze vzorce z uvedených Tvrzení 3 a 4 z kapitoly 3.4.2, tj. . Tudíž po nalezení 14 chybových slov označených červeně lze další nedetekované chyby již dopočítat analyticky podle posunů patřičných bitů o 15 pozic. Další velmi zajímavou záležitost u 14 zvýrazněných slov lze objevit při prozkoumání vzdáleností jednotlivých bitů s hodnotou 1. Tyto vzdálenosti udávají hodnoty v hranatých závorkách. Vzdálenost roste u nalezených slov postupně od 1 do 14 a ani jednou se žádná vzdálenost neopakuje. Co je ještě zajímavější, že i vzdálenost nabývá hodnot pouze mezi a také se ani jedna vzdálenost neopakuje. Hodnoty vzdálenosti sice nejsou seřazeny postupně, ale opravdu každá hodnota od 1 do 14 je zastoupena právě jednou. Tohle ovšem znamená, že při hledání některého chybového slova označeného červeně se vzdáleností již stačí prohledávat mezi vzdálenostmi , která ještě nebyla využita v předchozích nalezených slovech. To znamená, že u zadaného příkladu je potřeba vzdálenost vybírat pro ze 14 možností, pro ze 13 možností, …, pro již pouze ze 2 možností a pro zbývá jediná možnost. Tohle zjištění má obrovský význam pro následné vylepšení algoritmu Clever pro trojné chyby. Pozn.: Proč se objevuje maximální hodnota vzdáleností 14 a ne hodnota 15, která je zjistitelná ze vzorce a také uvažovaná ve vylepšeném algoritmu, bude vyjasněno až u pozorování detekce čtverných chyb. b)
,
Zvolený generující polynom je primitivní: Nejvyšší stupeň primitivního polynomu je I u tohoto primitivního generujícího polynomu stupně 5 lze najít všechny vypozorované vlastnosti ze zadání a). Všechny posuny 3. bitu, popř. 2. a zároveň 3. bitu, jsou o 31 pozic, což je opět hodnota, ke které se lze dostat pomocí vzorce . Všechny vzdálenosti a , která jsou u chybových slov, jenž nejsou pouhým posunem, mají hodnoty od do . Vzdálenosti opět postupně rostou od do . Hodnoty vzdálenosti nejsou opět seřazeny postupně, ale každá hodnota od do je zastoupena právě jednou. To znamená, že je potřeba vzdálenost vybírat pro ze 30 možností, pro z 29 možností, …, pro již pouze ze 2 možností a pro zbývá jediná možnost. Pozn.: Proč se objevuje maximální hodnota vzdáleností 30 a ne hodnota 31, která je zjistitelná ze vzorce a také uvažovaná ve vylepšeném algoritmu, bude vyjasněno až u pozorování detekce čtverných chyb. 55
Podle zjištěných poznatků lze učinit pozorování: Pozorování 5: U primitivních generujících polynomů stupně , stačí pro nalezení chybových slov vedoucích na nedetekovanou chybu testovat pozice bitů s hodnotou 1, kde vzdálenost 2. bitu od 1. bitu a vzdálenost 3. bitu od 2. bitu je . Je-li nalezena nedetekovaná chyba u některé vzdálenosti mezi danými bity, pak tuto vzdálenost mezi těmito bity již není potřeba dále prohledávat. Další nedetekované chyby je potřeba dopočítat ze zjištěných chybových slov patřičným počtem posunů 3. bitu, popř. 2. a zároveň 3. bitu, o pozic doprava. Pro určení celkového počtu nedetekovaných chyb je potřeba navíc dopočítat posun každého chybového slova o 1 pozici doprava, dokud se 3. bit nenachází na poslední pozici. Navrhované vylepšení je výhodné pro chybová slova délky , kde je stupeň primitivního generujícího polynomu. Tohle vylepšení je naprogramováno ve funkcích spoctiNedetekErr3Typ1_8.m, spoctiNedetekErr3Typ1_16.m, spoctiNedetekErr3Typ1_32.m a spouští se ze skriptu test.m. Tyto i další potřebné funkce jsou uloženy ve složce Clever (viz přílohy). Pozn.: Počet potřebných chybových slov pro otestování je v nejhorším případě dán vztahem
protože ke každé možnosti vzdálenosti je potřeba v průměru otestovat polovinu možností vzdáleností (při praktickém testování se jedná místo poloviny zhruba o třetinu někdy pouze čtvrtinu možností). Př. 33: Porovnání časů výpočtů pomocí algoritmů BruteForce2 a Clever pro určení počtu nedetekovaných trojných chyb na délce při použití generujícího polynomu (CRC8 číslo 4, viz Tabulka 1). a) BruteForce2 Počet možností potřebných pro otestování je: (
)
(
)
Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ ̇
b) Clever Počet možností potřebných pro otestování je: Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ Jelikož stupeň primitivního polynomu je . Počet možností odpovídá zhruba výrazu , což znamená, že v průměru bylo potřeba testovat 64 možností pro vzdálenost .
56
*c) BruteForce1 (pouze teoreticky) Bez praktického ověření lze opět provést výpočet potřebného času i pro BruteForce1. Počet možností potřebných pro otestování je: (
)
Čas potřebný pro výpočet: ̇
̇
̇
̇
Na rozdíl od testování dvojných chyb, kde se podařilo nalézt vylepšení pro všechny generující polynomy, u testování trojných chyb je vylepšení nalezeno pouze pro dva speciální případy. Těmi jsou generující polynomy obsahující při svém rozkladu výraz a primitivní generující polynomy. 3.5.3.4 Testování čtverných chyb Čtverná chyba je taková, u které chybové slovo obsahuje, v celé své délce , právě čtyři bity s hodnotou 1. Vylepšení algoritmu Clever pro čtverné chyby spočívá v určité analogii s algoritmem pro trojné chyby. Vylepšení pro čtverné chyby platí pro všechny generující polynomy typu I zavedených u detekce dvojných chyb. Jedná se o generující polynomy tvaru nebo . Ukázat podrobný rozbor jako u detekce trojných chyb by zabralo příliš místa, a proto je v následujícím příkladě vypsáno pouze prvních pár chybových slov vedoucích na nedetekovanou chybu. Poté je doplněn již pouze slovní rozbor. Opět je potřeba zavést určité úpravy v označení (z důvodu úspory místa): první bit s hodnotou 1 v chybovém slově = 1. bit druhý bit s hodnotou 1 v chybovém slově = 2. bit třetí bit s hodnotou 1 v chybovém slově = 3. bit čtvrtý bit s hodnotou 1 v chybovém slově = 4. bit chybové slovo vedoucí na nedetekovanou chybu = slovo Na základě této dohody je zavedeno další označení: vzdálenost 2. bitu od 1. bitu = vzdálenost 3. bitu od 2. bitu = vzdálenost 4. bitu od 3. bitu = čísla v hranatých závorkách mají význam: [
]
Př. 34: Výpis pozic bitů, které mají hodnotu 1, v chybových slovech délky vedoucích na nedetekovanou chybu při volbě generujícího polynomu Zvolený generující polynom je primitivní: Nejvyšší stupeň primitivního polynomu je ] -[ - posun 4. bitu od 1. slova o 15 pozic - posun 4. bitu od 2. slova o 15 pozic ] -[ - posun 4. bitu od 4. slova o 15 pozic 57
, .
- posun 4. bitu od 5. slova o 15 pozic ] -[ - posun 4. bitu od 7. slova o 15 pozic - posun 4. bitu od 8. slova o 15 pozic - posun 3. a 4. bitu od 1. slova o 15 pozic - posun 2., 3. a 4. bitu od 1. slova o 15 pozic Při kompletním prozkoumání všech slov lze vypozorovat, že všechny posuny 4. bitu, popř. 3. a zároveň 4. bitu, popř. 2., 3. a zároveň 4., jsou o 15 pozic, což je hodnota, ke které se lze dostat pomocí vzorce . Všechny vzdálenosti , a , které jsou u chybových slov, jenž nejsou pouhým posunem, mají hodnoty od do . Vzdálenosti postupně rostou od do 15, také hodnoty vzdálenosti postupně rostou od 1 do 15, až hodnoty vzdálenosti nejsou seřazeny postupně. Ale každá hodnota od do 15 je ve zastoupena právě jednou, až na jednu drobnost. Pro každou vzdálenost je z čísel vynechána právě jedna možnost, jak pro vzdálenost , tak pro vzdálenost . Tohle je zdůvodnění toho, na co odkazovaly příklady z předchozí kapitoly, proč je do algoritmu uvažováno hodnot a ne pouze (čísla 15 a 31 byly totiž zrovna ty, které byly vynechány). V tomto příkladě jsou např. pro vzdálenost vynechány hodnoty vzdáleností a . Tato zajímavost s vynecháním právě jednoho čísla u vzdáleností a ovšem nijak neovlivní vylepšení algoritmu. Jediné co se při provádění algoritmu stane, je, že nevypadne z uvažovaných možností 1 hodnota. Podle zjištěných poznatků lze učinit pozorování: Pozorování 6: U generujících polynomu tvaru nebo , kde je nejvyšší stupeň primitivního polynomu, stačí pro nalezení chybových slov vedoucích na nedetekovanou chybu testovat pozice bitů s hodnotou 1, kde vzdálenost 2. bitu od 1. bitu, vzdálenost 3. bitu od 2. bitu a vzdálenost 4. bitu od 3. bitu je . Je-li pro určitou vzdálenost nalezena nedetekovaná chyba s hodnotami vzdáleností a { } , pak pro tuto vzdálenost již není potřeba vzdálenosti a dále prohledávat. Další nedetekované chyby je potřeba dopočítat, ze zjištěných chybových slov, patřičným počtem posunů 4. bitu, popř. 3. a zároveň 4. bitu, popř. 2., 3. a zároveň 4. bitu, o pozic doprava. Pro určení celkového počtu nedetekovaných chyb je potřeba ještě navíc dopočítat posun každého takto zjištěného chybového slova o 1 pozici doprava, dokud se 4. bit nenachází na poslední pozici. Navrhované vylepšení je výhodné pro chybová slova délky , kde je stupeň primitivního generujícího polynomu. Tohle vylepšení je naprogramováno ve funkcích spoctiNedetekErr4Typ1_8.m, spoctiNedetekErr4Typ1_16.m, spoctiNedetekErr4Typ1_32.m a spouští se ze skriptu test.m. Tyto i další potřebné funkce jsou uloženy ve složce Clever (viz přílohy). Pozn.: Počet potřebných chybových slov pro otestování je v nejhorším případě dán vztahem
58
protože ke každé možnosti vzdálenosti a každé možnosti vzdálenosti , je potřeba otestovat v průměru polovinu možností vzdáleností (při praktickém testování se jedná místo poloviny zhruba o třetinu někdy pouze čtvrtinu možností). Př. 35: Porovnání časů výpočtů pomocí algoritmů BruteForce2 a Clever pro určení počtu nedetekovaných čtverných chyb na délce při použití generujícího polynomu (CRC8 číslo 1, viz Tabulka 1). a) BruteForce2 Počet možností potřebných pro otestování je: (
)
(
)
Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ ̇
b) Clever Počet možností potřebných pro otestování je: Zjištěný počet nedetekovaných chyb je: Čas potřebný pro výpočet: ̇ Jelikož nejvyšší stupeň primitivního polynomu je možností odpovídá zhruba výrazu potřeba testovat možností pro vzdálenost .
. Počet , což znamená, že v průměru bylo
*c) BruteForce1 (pouze teoreticky) Bez praktického ověření lze opět provést výpočet potřebného času i pro BruteForce1. Počet možností potřebných pro otestování je: (
)
Čas potřebný pro výpočet: ̇
̇
̇
̇
̇
Příklad opět ukazuje, že pro vhodný generující polynom lze, při určité délce slova, velmi výrazně zkrátit dobu potřebnou pro výpočet.
chybového
3.5.3.5 Ostatní chyby Algoritmus Clever je naprogramován tak, aby využíval pro zvolený generující polynom co nejoptimálnější metodu. Pro typy generujících polynomů, které nejsou uvedeny u detekce trojných a čtverných chyb, je využíván algoritmus BruteForce2. Algoritmus BruteForce2 je využíván také pro detekci paterných a šesterných chyb. Výjimku tvoří detekce paterných chyb pro generující polynomy tvaru , kde výraz zajišťuje detekci všech těchto chyb. Postup výpočtu podle BruteForce2 je pro algoritmus Clever naprogramován ve funkcích spoctiNedetekErr3_8.m spoctiNedetekErr3_16.m spoctiNedetekErr3_32.m spoctiNedetekErr4_8.m
59
spoctiNedetekErr4_16.m spoctiNedetekErr4_32.m spoctiNedetekErr5_8.m spoctiNedetekErr5_16.m spoctiNedetekErr5_32.m spoctiNedetekErr6_8.m spoctiNedetekErr6_16.m spoctiNedetekErr6_32.m a spouští se ze skriptu test.m. Funkce jsou uloženy ve složce Clever (viz přílohy).
3.6 Pravděpodobnost nedetekované chyby Pokud je stanoven počet nedetekovaných chyb, je možné, pro zvolený generující polynom, určovat hodnoty procenta nedetekovaných chyb (percentage of undetected errors) nebo pravděpodobnost nedetekované chyby (probability of undetected errors). Obě tyto hodnoty však vyžadují znalost počtu nedetekovaných chyb. Je-li potřeba popsat vhodnost generujícího polynomu stupně bez znalosti počtu nedetekovaných chyb, používá se hodnota nazývaná průměrná pravděpodobnost nedetekované chyby (average probability of undetected errors). Tato hodnota je zavedena v [6] vztahem
a je využívána např. v normě ARINC 665-3 při popisu doporučených generujících polynomů [20]. Výhodou tohoto vztahu je, že nezávisí ani na délce chybových slov ani na hodnotě udávající počet bitů s hodnotou 1 v těchto chybových slovech. Nicméně pro přesnější ohodnocení generujícího polynomu je potřeba jeho popis pomocí hodnot nebo . Pro následující popis je zvoleno označení dle [3], [6]. je zjištěný počet nedetekovaných chyb při zvolené hodnotě (počet bitů s hodnotou 1 v chybovém slově), je nejmenší hodnota , pro kterou je . Př. 36: Je-li pro zvolený generující polynom a zvolenou délku chybového slova počet nedetekovaných jednoduchých ( ) chyb , počet nedetekovaných dvojných ( ) chyb a počet nedetekovaných trojných ( ) chyb , pak . Pro zvolený generující polynom , chybové slovo délky a zvolenou hodnotu (obvykle se jedná o hodnotu ), je procento nedetekovaných chyb procentuální hodnota z podílu počtu nedetekovaných chyb a celkového počtu možných chyb ( ) Hodnota však nijak nezávisí na přenosovém kanále. Pro nejkomplexnější popis, který závisí na použitém přenosovém kanále, je potřeba použít pravděpodobnost nedetekované chyby . Pro výpočet je ovšem potřeba znát hodnotu (bit error rate) daného přenosového kanálu. Hodnota říká, s jakou pravděpodobností nastane během přenosu jednoduchá chyba. Obvyklé hodnoty pro jsou , a . Platí pak, že -násobná chyba nastane s pravděpodobností . 60
Př. 37: Při
je přítomnost dvojné chyby krát méně pravděpodobné , než nastání jednoduché chyby. Přítomnost trojné chyby je již krát méně pravděpodobné , než přítomnost jednoduché chyby. známa, pak je možné pravděpodobnost nedetekované chyby
Pokud je hodnota spočítat dle vztahu
∑[
]
Tento vztah by dával nejpřesnější výsledek, ale vyžadoval by znalost pro . Proto se volí jako největší , pro které je známá hodnota . Dostatečně přesná aproximace je i pomocí vzorce kde
.
Př. 38: Výpočet průměrné pravděpodobnosti nedetekované chyby generující polynomy .
pro zvolené
a) Stupeň generujícího polynomu je
, a proto
̇ b) Stupeň generujícího polynomu je
, a proto
̇ Vypočtené výsledky se shodují s hodnotami uvedenými v normě ARINC 665-3 (viz [20]). Př. 39: Výpočet procenta nedetekovaných čtverných chyb pro generující polynom .
ve slovech délky
Dle Tabulka 12 z kapitoly 3.5.1 nastane na této délce 84 nedetekovaných čtverných ( chyb, a proto ( )
)
( )
Př. 40: Výpočet pravděpodobnosti nedetekované chyby ve slovech délky pro generující polynom (CRC8 č. 6). Uvažovaná hodnota . Dle Tabulka 11 z kapitoly 3.5.1 je počet nedetekovaných jednoduchých, trojných i paterných chyb 0, počet nedetekovaných dvojných chyb je 66 a počet nedetekovaných čtverných chyb je 2039. Přesnější výsledek lze dostat pomocí vzorce
61
∑[
]
̇
̇
Dostatečně přesný výsledek však pro
dává i vzorec ̇
Je vidět, že tato aproximace je dostatečně přesná.
62
4 Závěr Tato diplomová práce se zabývá analýzou zabezpečení digitálních dat pomocí CRC (Cyclic Redundancy Check). Po zavedení základních pojmů a objasnění principu zabezpečení dat, je vysvětlena softwarová implementace. V programu Matlab se povedla implementace tří algoritmů – Naive, Slow a Fast. Protože přechod od algoritmu Naive k algoritmu Fast je v publikacích vysvětlován pouze pro generující polynomy stupně 16, jsou v tomto textu provedeny důkazy i pro generující polynomy stupně 8 a 32. Odvozené vztahy z těchto důkazů jsou přímo využívány při implementaci nejrychlejšího algoritmu Fast. Na základě známých matematických tvrzení je dále v diplomové práci proveden rozbor generujících polynomů stupně 8, 16 a 32. Tento rozbor vznikl pomocí programu vytvořeného ve vývojovém prostředí Matlab, který umožňuje rozklad polynomu na součin ireducibilních polynomů s označením polynomů primitivních. Hlavním cílem diplomové práce je navržení způsobu testování nedetekovaných chyb. Postupně je v textu vysvětlován přechod od časově nejnáročnějšího algoritmu BruteForce1, přes jeho urychlení, tj. algoritmus BruteForce2, až po algoritmus Clever. Pro přechod od BruteForce1 k BruteForce2 se povedlo provést matematický důkaz a navržené vylepšení platí pro libovolné druhy chyb. Pro další urychlení již bylo potřeba využít uvedených matematických tvrzení, zkoumat zvlášť jednoduché, dvojné, trojné a čtverné chyby a vhodně rozdělit generující polynomy do tří různých typů. Tím vznikl algoritmus Clever, u kterého zejména pro dvojné chyby došlo k výraznému zkrácení doby potřebné pro výpočet díky omezení počtu možností chybových slov nutných k otestování. Důkaz se zde povedl provést sice pouze pro speciální typ generujících polynomů, které jsou ve tvaru primitivních polynomů, na druhou stranu dosažené výsledky pro tento typ generujících polynomů umožňují zjištění počtu nedetekovaných chyb na základě analytického výpočtu bez nutnosti jakéhokoliv testování chybových slov. Všechny tři zmíněné postupy testování jsou opět naprogramovány v programu Matlab. Zjištěný počet nedetekovaných chyb je využíván pro určování pravděpodobnosti výskytu nedetekované chyby a v textu jsou popsány tři vztahy – průměrná pravděpodobnost nedetekované chyby, procento nedetekovaných chyb a pravděpodobnost nedetekované chyby. Dosažené výsledky jsou využívány ve firmě UNIS, a.s., v jejíž spolupráci tato diplomová práce vznikala.
63
5 Zdroje [1] ADÁMEK, J.: Kódování. SNTL, Praha, 1989. [2] GILBERT, W. J. – NICHOLSON, W. K.: Modern algebra with application. 2nd Edition. WILEY, New Jersey, 2004. [3] KOOPMAN, P. – CHAKRAVARTY, T.: Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded Networks. The International Conference on Dependable Systems and Networks (DSN), 2004. [4] KOOPMAN, P. – RAY, J.: Efficient High Hamming Distance CRCs for Embedded Networks. Institute for Software Research. June 25, 2006, Paper 691. [5] KOOPMAN, P.: 32-Bit Cyclic Redundancy Codes for Internet Applications. The International Conference on Dependable Systems and Networks (DSN), 2002. [6] KOOPMAN, P. – MAXINO, T. C.: The Effectiveness of Checksums for Embedded Control Networks. IEEE Transaction on Dependable and Secure Computing. JanuaryMarch, 2009, 6(1), p. 59-72. [7] MATOUŠEK, R.: Metody kódování. Brno, 2006. [8] MOON, T. K.: Error Correction Coding: Mathematical Methods and Algorithms. WILEY, New Jersey, 2005. [9] PETERSON, W. W. – BROWN, D. T.: Cyclic Codes for Error Detection. Jan., 1960. p. 228-234. [10] RAMABADRAN, T. V. – GAITONDE, S. S.: A Tutorial on CRC Computations. IEEE Micro. 1988, p. 62-75. [11] ŠILHAVÝ, P.: Datová komunikace. Brno, 2011. [12] http://en.wikipedia.org/wiki/Cyclic_redundancy_check [13] http://en.wikipedia.org/wiki/Mathematics_of_CRC [14] http://en.wikipedia.org/wiki/Computation_of_CRC [15] http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code [16] http://en.wikipedia.org/wiki/Primitive_polynomial_(field_theory) [17] http://theory.cs.uvic.ca/inf/neck/PolyInfo.html [18] http://mathworld.wolfram.com/IrreduciblePolynomial.html [19] http://mathworld.wolfram.com/PrimitivePolynomial.html [20] http://www.docin.com/p-241919707.html
64
6 Přílohy Všechny vytvořené programy jsou dostupné na přiloženém CD.
6.1 Přílohy – Softwarová implementace Algoritmus Naive pro generující polynom stupně 8: function crc = crcNaive8(zprava) global GENPOLY; topbit = bitshift(1, 7); zpravaRozsirena = [zprava zeros(1, 8)]; delka = length(zpravaRozsirena); zbytek = uint8(poslToDec(zprava(1:8))); for bit = 9:delka if(bitand(zbytek, topbit)) zbytek = bitshift(zbytek, 1) + uint8(zpravaRozsirena(bit)); zbytek = bitxor(zbytek, GENPOLY); else zbytek = bitshift(zbytek, 1) + uint8(zpravaRozsirena(bit)); end end crc = decToPosl(double(zbytek), 8); end
Algoritmus Naive pro generující polynom stupně 32: function crc = crcNaive32(zprava) global GENPOLY; topbit = bitshift(1, 31); zpravaRozsirena = [zprava zeros(1, 32)]; delka = length(zpravaRozsirena); zbytek = uint32(poslToDec(zprava(1:32))); for bit = 33:delka if(bitand(zbytek, topbit)) zbytek = bitshift(zbytek, 1) + uint32(zpravaRozsirena(bit)); zbytek = bitxor(zbytek, GENPOLY); else zbytek = bitshift(zbytek, 1) + uint32(zpravaRozsirena(bit)); end end crc = decToPosl(double(zbytek), STUPENcrc); end
65
Algoritmus Slow pro generující polynom stupně 8: function crc = crcSlow8(zprava, pocetBytu) global GENPOLY; topbit = bitshift(1, 7); zbytek = uint8(0); for byte = 1:pocetBytu zbytek = bitxor(zbytek, zprava(byte)); for bit = 1:8 if(bitand(zbytek, topbit)) zbytek = bitxor(bitshift(zbytek, 1), GENPOLY); else zbytek = bitshift(zbytek, 1); end end end crc = decToPosl(double(zbytek), 8); end
Algoritmus Slow pro generující polynom stupně 32: function crc = crcSlow32(zprava, pocetBytu) global GENPOLY; topbit = bitshift(1, 31); zbytek = uint32(0); for byte = 1:pocetBytu zbytek = bitxor(zbytek, bitshift(zprava(byte), 24)); for bit = 1:8 if(bitand(zbytek, topbit)) zbytek = bitxor(bitshift(zbytek, 1), GENPOLY); else zbytek = bitshift(zbytek, 1); end end end crc = decToPosl(double(zbytek), 32); end
66