У овом одељку, желим да вам дам неколико примера шифара тока, које се користе у пракси.
Почећу од два стара примера, који не би
требало да се користе у новим системима. Међутим, и даље су доста заступљени,
тако да само желим да напоменем њихова имена, тако да би вам били познати ови концепти.
Прва шифра тока о којој желим да вам говорим је RC4, која је развијена
1987. Желим само да вам дам њен уопштени опис,
а онда ћемо да говоримо о њеним слабостима. RC4 има као улаз
неку вредност променљиве дужине - семе; овде ћемо као пример да узмемо
128 битова за семе, које се затим користи као кључ за шифру тока.
Прво што уради јесте да прошири 128-битни тајни кључ на 2048 битова,
који се користе као унутрашње стање генератора. Након што се уради
ово проширење, извршава се врло једноставна петља, где сваки пролаз
кроз петљу враћа као излаз један бајт. Тако да, у суштини, генератор може да се извршава
колико год пута желите, и сваки пролаз даје један бајт. RC4 је заправо врло заступљен.
Користи се уобичајено у HTTPS-у.
Гугл га на пример користи у свом HTTPS-у. Користи се и у WEP-у који
смо разматрали у претходном одељку, али ту се користи неправилно
тако да није нимало безбедан. Током година,
пронађене су неке слабости у RC4, тако да се препоручује да се у новим пројектима
не користи, већ да се користи савремени псеудо-случајни генератор који ћемо да
разматрамо при крају овог одељка. Споменућу само две његове слабости.
Прва, која је у ствари мало чудна, ако погледате други бајт
излаза RC4, испоставља се да је други бајт делимично пристрасан. Када би RC4 био потпуно
случајан, вероватноћа да други бајт буте 0
била би тачно 1 / 256. Постоји 256 могућих бајтова, тако да вероватноћа
да буде 0 треба да буде 1 / 256. Испоставља се да је за RC4 ова вероватноћа
у ствари 2 / 256, што значи да ако користите RC4 да шифрујете
поруку, постоји извесна вероватноћа да се други бајт уопште не шифрује. Другим речима,
биће ХОR-ован са 0 са два пута већом вероватноћом него што треба да буде.
Значи 2 / 256 уместо 1 / 256. Узгред треба да кажем да не постоји
ништа посебно везано за други бајт. Испоставља се да су први и трећи бајт
такође пристрасни. Тако да постоји препорука, да ако се користи RC4,
треба да се занемати првих 256 бајтова излаза, и да се
излаз генератора користи почев од бајта 257. Првих пар бајтова
је пристрасно, тако да их само занемарите.
Други напад који је откривен, јесте да ако погледате врло дугачак излаз из RC4,
постоји повећана вероватноћа да се добије низ 00. Другим речима,
постоји мало већа вероватноћа да се добије ових 16 битова (2 бајта) 0, 0, него што би требало.
Да је RC4 сасвим насумичан, вероватноћа да се појави 00 била би тачно (1 / 256) на 2.
Испоставља се да је RC4 делимично пристрасан, тако да вероватноћа износи (1 / 256) на 3.
Ова пристрасност се појављује тек након излаза дужине неколико гигабајта података.
Ипак, овако нешто може да се користи како би се предвидео генератор
и свакако може да послужи да би се разликовао излаз генератора
од истински случајног низа. Та чињеница да се 00 појављује чешће него што би требало
је показатељ разлике. У последњем одељку већ смо говорили
о нападима који користе везу између кључева, који су били уперени на WEP, а који показују
да ако се користе блиско повезани кључеви, тада је могуће
да се дође до полазног кључа. Дакле то су слабости које су уочене у RC4, тако да
се препоручује да нови системи не користе RC4, већ да уместо тога користе
савремене псеудо-насумичне генераторе. Други пример који желим да вам дам је
врло слаба шифра тока која се користи код шифровања двд филмова. Када купите
двд у радњи, сам филм се шифрује коришћењем шифре тока која се назива
систем за кодирање садржаја, CSS. CSS се показао као врло слаба шифра тока,
која лако може да се пробије, и ја желим да вам покажем како ради алгоритам напада.
Одрадићемо овај пример да бисте видели како изгледа алгоритам напада,
али постоје многи системи који користе управо овај напад да декриптују
шифроване двд-јеве. CSS шифра тока заснива се на нечему што воле пројектанти хардвера.
Развијена је да буде хардверска шифра тока,
која се лако хардверски примењује, а заснива се на механизму регистра са
линијским повратним померањем. Ово је регистар
који се састоји од једнобитних поља.
Постоје нека поља, не сва, која називамо доточним пољима,
а њихове вредности се доводе у ХОR,
а затим се на сваки циклус клока, регистар помера на десно. Последњи бит отпада
а нови први бит постаје излаз из овог ХОR-а.
Видите да је ово једноставан механизам за примену, и заузима врло мало транзистора.
Само померај удесно, последњи бит отпада, а први бит постаје
ХОR претходних битова. Дакле почетна вредност - семе - код овог регистра је
заправо његово почетно стање.
На њему се заснива више шифара тока. Ево и неких примера.
Рекли смо да двд шифровање користи два оваква регистра. То ћу да вам покажем за који тренутак.
GSM шифровање садржи два алгоритма, А51 и А52,
који користе 3 регистра померања. Bluetooth шифровање садржи алгоритам Е0, такође
шифру тока, са 4 регистра. Испоставља се да су сви они доста слаби,
и да заиста не би требало да се ослања на њих ради шифровања саобраћаја,
али су сви уграђени у хардвер, тако да је сада мало теже да се измени то што хардвер ради.
Најједноставнији од њих, CSS, може јако згодно да се нападне,
тако да хајде да вам покажем како се изводи овај напад.
Кључ за CSS је 5-бајтни, тј. 40-битни, 5 х 8 је 40 битова.
Ограничили су се на 40 битова зато што је двд шифровање развијено
у време када је прописима извоза из САД био дозвољен само извоз
алгоритама за шифровање где је кључ само 40 битова. Тако да су пројектанти CSS-а били
ограничени на јако, јако кратке кључеве. Њихов поступак је следећи:
користе се два регистра померања, један 17-битни,
и други 25-битни,
нешто дужи. Њима се почетна вредност задаје
на следећи начин. Дакле кључ изгледа овако.
Почне се са јединицом, која се придодаје на прва два бајта кључа.
А то је почетно стање регистра померања.
И другом регистру померања се почетно стање задаје на сличан начин.
Јединица придружена на последња 3 бајта кључа,
што се спушта као почетно стање регистра. Можете да видите да су прва два бајта
- 16 битова, плус почетни, то је укупно 17 битова, а за други регистар померања
24 бита плус један - то је 25 битова. Примећујете да смо искористили свих 5 битова кључа.
Затим се ови регистри померања покрећу у осам циклуса, тако да се њима добија
по 8 излазних битова. Излази пролазе кроз овај сабирач који извршава
сабирање по модулу 256. Дакле ово је блок сабирања по модулу 256. Постоји још једна
техничка ствар која се извршава - додаје се пренесени бит
из претходног блока. Али то није тако важно.
Дакле примећујете да у сваком блоку радимо сабирање по модулу 256
да бисмо занемарили бит преноса, мада се он у ствари додаје као 0 или 1 у збир
у наредном блоку. Тако да се у сваком пролазу добија по један бајт.
Затим се овај бајт наравно користи, у XOR-у са одговарајућим
бајтом филма који се шифрује. Тако да је ово врло једноставна шифра тока,
потребно је врло мало хардвера за имплементирање. Извршава се брзо, чак и на
јефтином хардверу, и шифрује филмове. Шифра се лако пробија
у времену оквирно 2 на 17. Да вам покажем како.
Претпоставимо да пресретнете филм, овде имамо рецимо
шифрован филм који желите да дешифрујете, и будући да је шифрован
немате никакву представу о томе шта је овде. Међутим, само захваљујући томе
што двд шифровање користи MPEG датотеке, ви знате префикс
отвореног текста, на пример можда је ово 20 бајтова. Дакле знамо да
ако извршите ХОR ових двеју ствари,
добијате почетни одељак од PRG-а. Дакле добићете
првих 20 бајтова излаза из CSS-a.
Дакле ево шта ћемо да урадимо. Имамо првих 20 бајтова излаза.
Урадимо сада следеће. Покушамо свих 2 на 17 могућих вредности за први
регистар померања. Дакле 2 на 17 могућих вредности. За сваку вредност,
за сваку од ових 2 на 17 почетних вредности регистра, одрадићемо пролазак
кроз регистар за 20 бајтова. Дакле добијамо 20 бајтова од овог
првог регистра, за сваки од 2 на 17 могућих почетних вредности.
Сетите се да имамо пун излаз из CSS-a. Тако да можемо
да узмемо овај излаз, и да га одузмемо од 20 бајтова
које смо добили из првог регистра, тако да ако је наш погодак за почетно стање првог регистра
исправан, оно што добијемо је првих 20 бајтова излаза
из другог регистра. Зато што је то оно што је по дефиницији излаз из CSS система.
Испоставља се да је посматрајући 20-бајтни низ, врло лако
да се закључи да ли је овај 20-бајтни низ потекао од 25-битног регистра померања или не.
Ако није, онда знамо да је наша претпоставка за 17-битни регистар померања била
погрешна, и тада прелазимо на следећи покушај за регистар,
па на следећи, итд. Све док коначно не погодимо право почетно стање
17-битног регистра померања, а тада заправо добијамо
да 20 бајтова које смо узели као кандидате за излаз 25-битног регистра
јесу заиста могући излаз из 25-битног регистра. А тада, не само да смо
открили право почетно стање за 17-битни регистар, већ смо открили
и право почетно стање за 25-битни регистар. А тада можемо да предвидимо
преостале излазе из CSS-a, и наравно, користећи ово, можемо да дешифрујемо остатак филма.
Можемо да откријемо преостали отворени текст.
О овоме смо и раније говорили. Испричао сам ово мало брже, али надам се
да је било јасно. Такође ћемо да урадимо вежбу за домаћи над овом врстом шифара тока
тако да ћете да стекнете представу како раде ови алгоритми напада.
И требало би још да напоменем да сада постоје многи системи са отвореним софтвером
који заправо користе овај начин рада да декриптују податке шифроване CSS-ом.
Сада када смо видели две слабе шифре, пређимо на боље примере; заправо
бољи псеудо-насумични генератори потичу од такозваног еСтрим пројекта. Ово је пројекат
који је завршен у 2008-ој, и њиме је квалификовано 5 различитих шифара тока,
али ћу овде да вам представим само једну. Пре свега, параметри за
ове шифре тока се мало разликују од оног на шта смо до сада навикли.
Дакле ове шифре тока као и обично имају семе. Али поред тога, имају и такозвану.
привремену вредност, видећемо како се она користи за који тренутак.
Дакле имамо два улаза: семе и привремену вредност, коју ћемо ускоро да објаснимо.
Наравно добија се јако велики излаз, n је
много, много веће него s. Под привременом вредношћу подразумевам вредност која
неће бити поновљена докле год је кључ исти. Ускоро ћу то мало темељније да
објасним. За сада, само је посматрајте као јединствену вредност која се не
понавља све док је вредност кључа иста. Једном када имате псеудо-насумични генератор (ПНГ),
са којим шифрујете, добијате шифру тока као и раније, осим што сада, као што видите,
ПНГ узима као улазне вредности и кључ и привремену вредност. Уз својство
да се пар (k, r), дакле (кључ, привремена вредност), никад, никад не понавља.
Никад се не користи више него једном. Суштина је у томе, да кључ може да се поново употреби,
зато што привремена вредност чини пар јединственим, зато што се k и r заједно
користе само једном. Пар је јединствен. Дакле привремена вредност је згодна досетка
која нас поштеђује тога да прелазимо на нови кључ сваки пут. Конкретан пример
из еСтрима који желим да вам покажем је Салса 20.
То је шифра тока која је развијена како за софтверску тако и за хардверску
примену. Ово је занимљиво. Разумели сте да су неке шифре тока
развијене за софтвер, као RC4. Све што се врши њоме је развијено на такав начин
да софтверску примену чини брзом, док су неке друге шифре тока развијене
за хардвер, на пример CSS, која користи регистар померања нарочито развијен
да хардверску примену учини јефтином. Добра ствар код Салсе је
што је развијена на такав начин, да осим што је лака за примену у хардверу, њена
софтверска примена је такође јако брза. Да вам објасним како Салса ради. Салса
узима 128-битне или 256-битне кључеве. Објаснићу вам 128-битну верзију.
Ово је семе. Затим се узима и привремена вредност, као и раније, која је
у овом случају 64 бита. И ствара се велики излаз. Како ово
заправо ради? Сама функција је одређена на следећи начин. За дате
вредности кључа и привремене вредности, ствара се јако дугачак, псеудонасумични
низ, које год дужине је потребно. А то ћу чини користећи ову функцију коју ћу да означим
са H. Функција Н има три улаза. Кључ, тј. семе k,
привремену вредност r, и бројач који се повећава из корака у корак. Дакле иде
од нуле, до 1, 2, 3, 4, докле год је потребно. Значи,
одређујући вредност за Н за ове k, r и растући бројач, добијамо
низ који је оне дужине коју хоћемо. Све што имам да урадим јесте да опишем како функција
Н ради. Хајде да то и урадимо. Она ради на следећи начин.
Почнемо тако што проширимо стања на прилично велику вредност, 64-бајтну,
на следећи начин. Поставимо константу на почетак,
т0, ово је 4 бајта, 4-бајтна константа,
Салса вам задаје вредност за т0. Затим стављамо k које је
16 бајта. Затим ставимо још једну константу. Поново, ово је 4 бајта.
Као што сам рекао, ова константа има унапред задату вредност. Затим ставимо
привремену вредност, која је 8 бајта. Затим ставимо индекс - то је бројач - 0,
1, 2, 3, 4, који заузима још 8 бајта. Затим ставимо још једну константу,
т2, која заузима још 4 бајта. Затим поново ставимо кључ, ово је додатних
16 бајтова. Најзад стављамо и трећу константу, т3, која је
4-бајтна. Као што само рекао, сабравши ово имамо укупно 64
бајта. Дакле проширили смо кључ, привремену вредност и бројач до 64
бајта. Значи кључ се јавља два пута. А затим применимо
функцију, назваћу је малим словом h. Дакле применимо ову функцију h,
а она је 1-на-1, дакле додељује 64-бајтну вредност за 64-бајтни улаз.
Она је потпуно иверзибилна. Дакле функција h је
иверзибилна функција. То значи да за задати улаз добијамо један излаз, и за задати
излаз добијамо улаз. Развијена је нарочито на такав начин да буде, као прво, лака
за примену у хардверу, а као друго, на х86 је нарочито лака за примену зато што
х86 има SSE2 скуп наредби, који подржава све операције потребне
за ову функцију. Она је врло, врло брза. Захваљујући томе, Салса је јако брза
шифра тока. Ово се затим извршава поново, и поново, и поново. Дакле врши
се ова функција h поново и добије још 64 бајта. И тако даље,
ово се одради 10 пута. Дакле све ово овде се понавља 10 пута,
дакле применити h 10 пута. Само по себи, ово и није тако насумично.
Неће да изгледа насумично зато што, као што сам рекао, H је потпуно иреверзибилна.
Имајући коначни излаз, лако је да се обрне h и да се врати
до изворног улаза и провери да ли улаз има праву грађу. Зато се изврши још једна
ствар, а то је да се изврши XOR над улазом и коначним излазом. У ствари,
ово није XOR већ збир. Врши се сабирање реч по
реч. Имамо 64 бајта, сабирамо реч по реч, 4 бајта
у истом кораку, и коначно добијамо излаз од 64 бајта, и то је то. То је цели
псеудо-насумични генератор. Дакле то је цела функција h.
Као што сам објаснио, цела ова конструкција овде јесте функција Н. Она се рачуна
тако што се бројач i повећава од 0 на 1, 2, 3 итд.
То вам даје псеудо-насумични низ који је оне дужине која вам треба.
Не постоје значајни напади на ово. Безбедност овог система је
јако близу 2 на 128. Видећемо шта то значи нешто касније.
То је јако брза шифра тока, и хардверски и софтверски. Колико
можемо да видимо, изгледа непредвидиво као што је и захтев за шифру тока.
Треба да напоменем да пројекат еСтрим има 5 шифара тока попут
ове. Одабрао сам Салсу зато што ми делује најелегантније. Али могу да вам дам
неке вредности перформанси. Овде можете да видите вредности перформанси за
машину типа х86, на 2.2 гигахерца. И можете да видите да је RC4 заправо најспорији.
Зато што он и не користи заправо предности хардвера,
јер обавља само бајтне операције. Тако да има много изгубљених циклуса.
Али кандидати еСтрима, како Салса тако и овај
други кандидат, Сосеманук (треба рећи да су ово еСтрим финалисти,
шифре тока које је одобрио еСтрим пројекат), као што видите
постигли су значајну стопу. Ово је 643 мегабајта у секунди
на овој архитектури, више него довољно за један филм, ово су у ствари прилично упечатљиве
стопе. Дакле, сада сте видели примере двеју старих шифара тока које не би требало
да се користе, као и нападе на ове шифре. Видели сте како изгледају савремене шифре тока
са привременом вредношћу. И видите вредности перформански за ове
савремене шифре тока, тако да ако вам буде била потребна шифра тока, можете да користите неку
од финалиста еСтрима, на пример Салсу.