Опубликован: 02.03.2017 | Доступ: свободный | Студентов: 2389 / 514 | Длительность: 21:50:00
Лекция 8:

Алгоритмы с открытыми ключами

8.3 Примеры атак на алгоритм RSA с большими числами

Приведем примеры атак с числами, размеры которых соответствуют реально применяем в системах защиты банковской информации.

Для работы с большими числами мы будем использовать систему компьютерной алгебры Maxima (см. параграф 1.16.1). Используемые нами функции подробно описаны в руководстве пользователя. Особенно полезен нам раздел "Number Theory".

8.3.1 Пример проведения атаки методом Ферма

Исходные данные:

N = 6915244609579137267327382519799379091524149293244816637691826 9398622964367867570234227167749609782487603063343406242777371955314645 2742388332988733993605091994058293499382971742490952474719828474075078 5896707348622744531600003265917743044563775026361237516233569510776114 8109796496185649768169137389070008752782413652613114179194481058554254 4448615819662193369744739530133016244020607483919296703035335756025782 1198618093610413148915963990789275952977743453275495105952399715239534 1404522821690462029654934969262380866920267097617165707930262759302606 756755216795383122881029602333988711966716180750531605801919527461

e =7423489;

шифртекст C = 465060673245728679820089043475674731352115350813536 29127993992486567556 7156900806763889151763924735496714794491888355277 38596815041010164916640784130 4910760438532601276748143258914433560279 13186272146910522595250621775809097843 8466376070439866602619174245254 91796789390336635629378578035857597525297590776 2618424271931719171731 88933063050921552961787237676274649516864417659967226409 6655987478676 94982197189302733688441148495741687268763633927764999172932586878 6575 5502667348346941062611020674418896448890646803651538990666737332006313 6883 39309056851281655672233726633413389794443264266190435226307846633 6457114523067

  1. Запустим систему Maxima. После появления приглашения командной строки (%i1) можно вводить команды.

  2. Введём в систему входные данные. Для этого после идентификатора нужно поставить двоеточие, а затем значение. Каждая команда заканчивается символом ";" или "$". Символ "$" обозначает, что результат вычислений не нужно выводить на экран. Например, для ввода в систему числа e введём:
    e:7423489$
         

    После нажатия Enter происходит выполнение команды. Аналогичным образом введём идентификаторы N, C.

  3. Проверим, что число N не является квадратом. Для вычисления числа \lfloor\sqrt{n}\rfloor для целого n используется команда isqrt. Для возведения в квадрат используется операция ^. Введём:
    srn:isqrt(N)$
    
    is(srn^2=N);
         
    Первая команда вычисляет целую часть корня от N и обозначает её идентификатором srn. Вторая команда проверяет, является ли N квадратом. В результате второй команды получим вывод:
    (%o5)    false
         

    Это говорит о том, что равенство \lfloor \sqrt{N} \rfloor^2 = N не выполняется, и число N - не квадрат целого числа. Надпись "\verb#(%05)#" обозначает, что далее идёт результат 5-й команды, которая была введена после приглашения "\verb#(%i5)#".

  4. Для каждого числа v_i = \lfloor\sqrt{N}\rfloor + i будем расчитывать w_i = v_i^2 - N и проверять, является ли w_i квадратом. Доллар вместо точки с запятой в конце выражения говорит системе не выводить на экран результаты промежуточных вычислений.
    (%i6) w1 : (srn+1)^2 - N$
    (%i7) is(isqrt(w1)^2=w1);
    (%o7)      false
    (%i8) w2 : (srn+2)^2 - N$
    (%i9) is(isqrt(w2)^2=w2);
    (%o9)      false
    (%i10) w3 : (srn+3)^2 - N$
    (%i11) is(isqrt(w3)^2=w3);
    (%o11)      false
    (%i12) w4 : (srn+4)^2 - N$
    (%i13) is(isqrt(w4)^2=w4);
    (%o13)      true
         

    Итак, N=(\mathtt{srn}+4)^2-\sqrt{w_4}^2.

  5. Теперь можно найти делители числа N:
    (%i14) p:srn+4-isqrt(w4);
    (%o14) 262968526816026736232636051189459874382446519148
           963617629027255104769945719755984982102707120117
           706525064015257076350250162229292374187259939548
           939791858838514297011479606873615542587565445952
           774014851457711890959298629102287714458214768091
           456036071496351940116236181014737608169537866387
           475270200449701600539
    (%i15) q:srn+4+isqrt(w4);
    (%015) 262968526816026736232636051189459874382446519148
           963617629027255104769945719755984982102707120117
           706525064015257076350250162229292374187259939548
           939791858918434644001891354485948817612831393943
           831874217795402559116173347849761999726607005334
           107474067053693923414485042904885419841498167834
           826934556836972951999
         
    Проверим, правильно ли мы нашли делители:
    (%i16) is(N=p*q);
    (%o16)     true
         

    Теперь нетрудно осуществить дешифровку.

  6. Найдём n=\varphi(N)=(p-1)(q-1):
    (%i17) n:(p-1)*(q-1);
    (%o17) 691524460957913726732738251979937909152414929324
           481663769182693986229643678675702342271677496097
           824876030633434062427773719553146452742388332988
           733993605091994058293499382971742490952474719828
           474075078589670734862274453160000326591774304456
           377502636123751623356951077611481097964961856497
           681691373890700087522564765989810607067292089561
           753346960966889279214097392158985030920845106212
           364219654648892933401895280839556667834036311647
           010551595182396506795549490371941105829837814339
           818401626212936221330490459000092664168447951206
           651159937454409858770432466166667495195921598056
           82710960700930681958448326848515244974924
         
  7. Найдём обратный к e по модулю n. Для нахождения обратного по модулю числа используется функция inv_mod.
    (%i18) d:inv_mod(e,n);
    (%o16) 159473778881412178951363380047548370299185595369
           293301556900463792194735837486992335590486755090
           118784764988909430054104623893214000053083933271
           592133656057039185769018422628707296349955436619
           729220378775558752251642918675436409902022493957
           029259927562211781124457194260217400235337672814
           214944366331695859094533195686344563818416832875
           322618995339315686613690403531225496361587681392
           769069101695698479902470067182274377952892405921
           601214570482225781950523126294764189240377630662
           614360117188441324480392776069704371618231484929
           589094831167041492978941304862403054017212391664
           53872109949533807664476342715222105274029
         
  8. Выполним дешифровку. Для возведения в степень по модулю нужно использовать функцию power_mod.
    (%i19) P:power_mod(C,d,N);
    (%o19)     20231718
         
  9. Используя таблицу 6.1 (см. "лекцию 6" ), переведём число в текст: "КМЗИ".

8.3.2 Пример выполнения атаки "бесключевое чтение"

Исходные~данные:

N= 2519590847565789349402718324004839857142928212620403202777713 7836043662020707595556264018525880784406918290641249515082189298559149 1761845028084891200728449926873928072877767359714183472702618963750149 7182469116507761337985909570009733045974880842840179742910064245869181 7195118746121515172654632282216869987549182422433637259085141865462043 5767984233871847744479207399342365848238242811981638150106748104516603 7730605620161967625613384414360383390441495263443219011465754445417842 4020924616515723350778707749817125772467962926386356373289912154831438 167899885040445364023527381951378636564391212010397122822120720357;

e_{1} = 1011163; e_{2} = 1110521;

C_{1} = 1475325512646127242922491234336573821326644830122724857802651 82834500418 6248451852916071172167393901484963211012186813420799457345 60638901218485778028 8088167762693301487173478582573846232471858233011 05429274234279863037579651294 1305440048424158412512493520129752032822 49047843226000864924203675006878533759 4689790689579026501643817929120 04105626763672704672827848013136399268699306662 7592945775958095422456 50919791860840020082746913903995338683355323748300077852 4222905192914 54785850041002811165491890932478197036280409606904111958813351896 3410 8240519966700126623731566589570806848893829480888979012581343525399802 490

C_{2} = 1168960834050268961897324310220295239101276316289170220279034 24838605267 3641103792818084219415738429514299664733141986982322386646 78264765952517495919 5383277543494845172200901017398976983581548883677 72471406710688871011254842119 0717106834141930230321678867355741169178 64117261510578555710832001442414172654 4343094430367130161092842091138 95716177545680184852854836102034397952992257055 3742268402669724738982 06540435293792709985777111719850811784302488645684794421 4372490969359 76159712998481145184343878513509137590163314701862659532716478010 6260 3880245750910942198158465793549050643147723479955672632110054161976725 720

  1. Запустим системы компьютерной алгебры Maxima и введём в неё исходные данные (подробнее см. предыдущий пример).

  2. Найдём наибольший общий делитель e_1 и e_2 и коэффициенты его линейного представления. Для этого необходим пакет extgcd.
    (%i6) [u1,u2,v]:igcdex(e1,e2);
    (%o6)        [- 185750, 169131, 1]
         
  3. Теперь, когда 1 = u_1 \cdot e_1 + u_2 \cdot e_2, найдём m=m^{u_1 \cdot e_1 + u_2 \cdot e_2} = c_1^{u_1} \cdot c_2^{u_2}. Для этого используем функцию возведения в степень по модулю power_mod, которая при возведении в отрицательную степень автоматически находит элемент, обратный по модулю:
    (%i7) m:mod(power_mod(c1,u1,N) * power_mod(c2,u2,N),N);
    (%o7) 17109930102028242618171032184099141023232413249933
          18272110992310172310331523109923101326101410991299
          14121527281899283727413399142421211926241299273410
         

Теперь, используя таблицу 6.1 (см. "лекцию 6" ), нетрудно прочитать зашифрованный текст:

ЗА ФАКТОРИЗАЦИЮ ДАННОГО ЧИСЛА НАЗНАЧЕНА НАГРАДА В ДВЕСТИ ТЫСЯЧ ДОЛЛАРОВ США
    

Действительно, за разложение на множители данного модуля положена награда в 200~000 долларов США. Маловероятно, что такая награда была бы назначена, если бы операция факторизации чисел такого размера была бы легкой задачей. Приведенный пример показывает, что криптосистема хоть и была построена на основе числа, надежность которого оценивается столь большой суммой, из-за неверной реализации и нарушения правил безопасного использования алгоритма RSA была проведена успешная атака на такую систему.

Евгений Шаров
Евгений Шаров

как начать заново проходить курс, если уже пройдено несколько лекций со сданными тестами?

Юлия Мышкина
Юлия Мышкина

Обучение с персональным тьютором осуществляется по Скайпу или посредством переписки?