Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posibnik_1_0.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
7.93 Mб
Скачать
  1. Алгоритм rsa

Піонерська стаття Діффі і Хеллмана [DIFF76b] знаменувала появу нового підходу в криптографії і насправді кинула виклик криптологам пропозицією знайти криптографічний алгоритм, який відповідав би всім вимогам, що висуваються криптосистемам із загальним ключем. Одними з перших відповіли на цей виклик в 1977 році Рон Райвест (Ron Rivest), Аді Шамір (Adi Shamir) і Льон Адлеман (Len Adleman) із МТІ, а відповідна публікація з'явилася в 1978 році [RIVE78]. Схема Райвест-Шаміра-Адлемана (RSA) стала відтоді єдиною отримала широке визнання і практично застосовуваною схемою шифрування з відкритим ключем.

Схема RSA являє собою блоковий шифр, в якому і відкритий текст, і шифрований текст представляються цілими числами з діапазону від 0 до n - 1 для деякого n. У цьому розділі ми обговоримо RSA в певних подробицях, починаючи з пояснення алгоритму. Потім будуть розглянуті обчислювальні та криптоаналітичних аспекти RSA

Опис алгоритму

Схема, розроблена Райвест, Шамір і Адлеманом, заснована на висловлюваннях зі степенями. Відкритий текст шифрується блоками, кожен з яких містить двійкове значення, менше деякого заданого числа n. Це означає, що довжина блоку повинна бути менше або дорівнює log2(n). На практиці довжина блоку вибирається рівною 2k бітів, де 2k <n <2k+1, Шифрування й дешифрування для блоку відкритого тексту М і блоку шифрованого тексту С можна представити у вигляді наступних формул:

Як відправник, так і одержувач повинні знати значення n. Відправник знає значення e, і тільки одержувачу відомо значення d. Таким чином, дана схема є алгоритмом шифрування з відкритим ключем KU = (e, n) і особистим ключем KR = (d, n). Щоб цей алгоритм міг використовуватися для шифрування з відкритим ключем, повинні бути виконані наступні вимоги.

  1. Мають існувати такі значення е, d та n, що Med =M mod n для всіх М < n.

  2. Мають відносно легко обраховуватись Мe та Cd для всіх значень М < n.

  3. Має бути практично неможливо знайти d по наявних е та п.

Поки що ми сфокусуємо увагу на першій вимозі, а решта розглянемо пізніше. Необхідно знайти співвідношення виду

Тут як не можна краще підійде наслідок теореми Ейлера, представленої: для таких будь-яких двох простих чисел р і q, і таких будь-яких двох цілих чисел n і m, що n = pq i 0 <m <n, і довільного цілого числа k виконуються наступні співвідношення

де ф(n) є функцією Ейлера, значення якої дорівнює числу позитив них цілих чисел, менших n і взаємно простих з n. Як показано в розділі 7, випадку простих р і q маємо ф(pq) = (р-1) (q-1). Тому необхідне відношення виходить за умови

Це еквівалентно наступним співвідношенням:

тобто e і d є взаємно зворотними по модулю ф(n). Зверніть увагу, що відповідно до правил арифметики в класах відрахувань це може мати місце тільки тоді, коли d (а отже, і e) є взаємно простим з ф(n). В еквівалентному записі gcd (ф(n), d) = 1.

Тепер у нас є все, щоб представити схему RSA. Компонентами схеми є:

р та q — два прості числа (секретні, вибираються),

n = pq (відкрите, обчислюється),

таке е, що

gcd(ф(n),е) = 1, 1 < е < ф(п) (відкрите, вибирається),

d ≡ е-1 mod ф(п) (секретне, обчислюється).

Особистий ключ складається з {d, n}, а відкритий - з {е, n}. Припустимо, що користувач А опублікував свій відкритий ключ і тепер користувач В збирається переслати йому повідомлення М. Тоді користувач В обчислює С = M e (mod n) і пересилає С. Отримавши цей шифрований текст, користувач А дешифрує його, обчислюючи М = Cd (mod n).

Має сенс навести тут обгрунтування цього алгоритму. Ми вибрали e і d такі, що

Таким чином,

Значить, ed має вигляд kф(n)+1. Але за наслідком теореми Ейлера, для таких будь-яких двох простих чисел р та q і цілих чисел n = pq і М, що 0 <М <n, виконуються співвідношення

Тому Med≡M mod n. Тепер ми маємо

Рис. 8.1 резюмує алгоритм RSA, а на рис. 8.2 показаний приклад його застосування. У цьому прикладі ключі обчислюються наступним чином.

Вибирається два простих числа, р = 7 та q = 17.

Обчислюється n = pq = 7 х 17 = 119.

Обчислюється ф(n) = (р - 1)(q - 1) = 96.

Вибирається et взаємно просте з ф(n)=96 і менше, ніж ф(n); в даному випадку е = 5.

Визначається таке d, що de = 1 mod 96 і d <96. Відповідним значенням буде d = 77, так як 77 х 5 = 385 = 4 х 96 + 1.

У результаті виходять відкритий ключ KU = {5,119} і приватний ключ KR = {77,119}. У даному прикладі показано використання цих ключів з введеним відкритим текстом М = 19. При шифруванні 19 підноситься в п'яту степінь, що в результаті дає 2476099. В результаті ділення на 119 визначається залишок, рівний 66. Отже, 195 ≡ 66 mod 119, і тому шифрованим текстом буде 66. Щоб дешифрувати з'ясовується, що 6677= 19 mod 119.

Обрахунок ключів

Вибір p,q

p і q мають бути простими

Обрахунок n=p×q

Обрахунок ϕ(n) = (p-1)(q-1)

Вибір цілого e

gcd(ϕ(n),e)=1, 1 < e < ϕ(n)

Обрахунок d

d≡e-1 mod ϕ(n)

Відкритий ключ

KU={e,n}

Особистий ключ

KR={d,n}

Шифрування

Відкритий текст

M < n

Шифрований текст

C = Me (mod n)

Дешифрування

Відкритий текст

C

Шифрований текст

M = Cd (mod n)

Рис. 8.1. Алгоритм RSA

Рис. 8.2 Приклад використання алгоритму RSA

Обчислювальні аспекти

Тепер розглянемо питання складності обчислень, необхідних при використанні RSA. Насправді тут слід розглянути два питання: обчислення ключів та шифрування / дешифрування. Спочатку ми досліджуємо процес шифрування і дешифрування, а потім звернемося до обчислення ключів.

Шифрування й дешифрування

Як шифрування, так і дешифрування в RSA припускає використання операції піднесення цілого числа в цілий степінь по модулю n. Якщо зведення в степінь виконувати безпосередньо з цілими числами і тільки потім проводити порівняння за модулем n, то проміжні значення виявляться просто величезними. На щастя, тут можна скористатися властивостями арифметики в класах вирахувань:

Таким чином, ми можемо розглядати проміжні результати по модулю n. Це робить обчислення практично можливими.

Іншою проблемою є ефективна реалізація операції піднесення до степеня, так як у випадку застосування RSA ми повинні мати справу з потенційно великими показниками. Щоб продемонструвати, наскільки тут можна збільшити ефективність обчислень, припустимо, що необхідно обчислити х16. Прямолінійний підхід зажадає 15 множень, як показано нижче

Однак такого ж кінцевого результату можна досягти і за допомогою всього чотирьох множень, якщо повторно зводити в квадрат проміжні результати, отримуючи при цьому х2, х4, x8, х16.

У загальному випадку припустимо, що нам потрібно знайти значення аm, де а і m є позитивними цілими числами. Якщо уявити m у вигляді двійкового числа bkbk-1 ... b0, то

і тому

Таким чином, для обчислення abmod n можна використовувати алгоритм, показаний нижче. На рис. 8.3 ви бачите приклад послідовності значень, одержуваних у результаті виконання цього алгоритму. Зверніть увагу на те, що змінна с, в принципі, не потрібна - вона включена в алгоритм тільки з метою забезпечення наочності. Кінцеве значення с буде значенням показника обчислюваного степеня.

c←0; d←1

for i ← k downto 0

do c ← 2 × c

d ← (d × d) mod n

if bj = 1

then c ← c + 1

d ← (d × a) mod n

return d

i

9

8

7

6

5

4

3

2

1

0

bi

1

0

0

0

1

1

0

0

0

0

c

1

2

4

8

17

35

70

140

280

560

d

7

49

157

526

160

241

298

166

67

1

Рис. 8.3. Результати виконання алгоритму швидкого піднесення до степеня для ab mod n при a = 7, b = 560 = 1000110000, n = 561.

Обчислення ключів

Перед тим як звернутися до криптосистеми з відкритим ключем, кожна сторона повинна генерувати пару ключів. Це означає виконання наступних завдань:

■ визначення двох простих чисел р і q;

■ вибір одного з чисел е або d і обчислення другого.

Спочатку розглянемо процедуру вибору р і q. З огляду на те що значення nm pq буде відомо будь-якому потенційному супротивникові, то для того, щоб не допустити можливості знаходження р і q за допомогою простого перебору варіантів, ці прості числа повинні бути обрані з досить великої множини (тобто р i q повинні бути великими числами). Водночас метод знаходження великих простих чисел повинен бути практично ефективним.

На сьогоднішній день немає хороших методів обчислення довільно великих простих чисел, тому для вирішення цієї проблеми доводиться вдаватися до різних хитрощів. Найчастіше процедура полягає у виборі випадкового непарного число приблизно бажаної величини і з'ясування, чи є це число простим. Якщо виявиться, що число простим не є, вибирається наступне випадкове число, поки не буде знайдено просте.

Для перевірки того, що числа прості, існує цілий ряд тестів (див. на-приклад, [KNUT98], де можна знайти описи ряду таких тестів). Майже всі такі тести носять імовірнісний характер. Це означає, що тест визначить тільки, що дане ціле число, ймовірно, просте. Незважаючи на відсутність повної впевненості, такі тести можуть виконуватися так, щоб забезпечити впевненість з імовірністю, як завгодно близькою до 1. Наприклад, алгоритм Міллера-Рабіна (Miller-Rabin), один з найбільш ефективних і популярних з таких алгоритмів. Для цього і більшості інших подібних алгоритмів процедура перевірки простоти даного цілого числа n полягає у виконанні ряду обчислень, в яких використовується n і деяке випадково обране ціле число а. Якщо n не витримує тестування, то n простим не є. Якщо n витримує одне тестування, то n може виявитися простим, а може і не бути простим. Якщо ж n успішно проходить цілий ряд таких "випробувань" з різними випадково обраними значеннями а, це дає нам велику міру впевненості в тому, що n насправді є простим числом.

Коротко процедуру вибору простого числа можна представити в наступному вигляді.

Виберіть непарне ціле число n деяким випадковим чином (наприклад, використовуючи генератор псевдовипадкових чисел)..

Виберіть ціле число а <n деяким випадковим чином..

Виконайте імовірнісний тест на простоту, наприклад тест Міллера-Рабіна. Якщо n не витримує тестування, відкиньте дане значення n і перейдіть до п. 1.

Якщо n витримує достатню кількість повторних тестів, прийміть дане значення n як підходяще, в іншому випадку перейдіть до п. 2.

Це процедура дещо втомлює. Однак не забувайте про те, що цей процес виконується відносно нечасто - тільки тоді, коли потрібна нова пара (KU, KR).

При цьому непогано знати, як багато чисел, швидше за все, виявляться відкинутими перш, ніж виявиться просте число. Одна з теорем теорії чисел, відома під назвою теореми про прості числа, стверджує, що прості числа близько N розподіляються в середньому по одному на кожні ln(N) цілих чисел. Таким чином, в середньому доведеться протестувати близько ln(N) цілих чисел перш, ніж знайдеться просте число. Насправді через те, що всі парні цілі числа можна відкинути відразу ж, істинний порядок задається числом ln(N)/2. Наприклад, якщо шукати прості числа в області величин порядку 2200, то для знаходження простого числа потрібно близько ln(2200)/2 = 70 спроб.

Після визначення простих чисел р і q процес обчислення ключів завершується вибором значення е і обчисленням d або, навпаки, вибором значення d і обчисленням е. У першому випадку необхідно спочатку вибрати таке е, що gcd (ф(n), е) = 1, а потім обчислити de-1 mod ф(n). На щастя, є один алгоритм, який в один і той же час обчислює найбільший спільний дільник двох цілих чисел і, якщо найбільший спільний дільник виявляється рівним 1, визначає зворотне для одного з цілих чисел по модулю іншого. Цей алгоритм, надалі званий узагальненим алгоритмом Евкліда, описаний в главі 7. Процедура полягає в генеруванні випадкових чисел і порівнянні їх з ф(n) до тих пір, поки не буде знайдено число, взаємно просте з ф(n). Тепер ми знову можемо запитати, як багато випадкових чисел доведеться перевірити перш ніж буде знайдено відповідне число, тобто число, взаємно просте з Ф(n). Легко показати, що ймовірність того, що два обраних випадково числа виявляться взаємно простими, дорівнює приблизно 0,6 - це означає, що для знаходження відповідного цілого значення знадобиться всього кілька перевірок.

Захищеність алгоритму RSA

Трьома можливими підходами до криптоаналізу алгоритму RSA є наступні:

  • Простий перебір. Передбачає перевірку всіх можливих особистих ключів.

  • Математичний аналіз. Існує кілька підходів такого роду, але всі вони по суті еквівалентні знаходженню множників добутку двох простих чисел.

  • Аналіз тимчасових витрат. Спирається на аналіз часу виконання алгоритму дешифрування.

Захист проти простого перебору в разі RSA залишається той ж, що і для всіх інших криптосистем, - використання великого простору ключів. З цієї точки зору чим більше бітів в е і d, тим краще. Однак через складність обчислень як при генеруванні ключів, так і при шифруванні / дешифруванні, чим більшим виявляється розмір ключа, тим повільніше працює система.

У цьому розділі для алгоритму RSA ми представляємо короткий огляд можливостей його криптоаналізу при використанні математичного підходу та підходу на основі аналізу тимчасових витрат.

Проблема розкладання на множники

Можна виділити наступні три математично різних підходи до криптоанализу RSA.

Розкладання n на два його простих множника. Це дозволить обчислити ф (n) = (р-1) (q-1), на підставі чого можна буде визначити d = e -1(mod ф (n))

Визначення безпосередньо n без того, щоб спочатку визначати р і q. Це також дозволить визначити d = e -1(mod ф (n)).

Визначення безпосередньо d без того, щоб спочатку визначати ф (n)

У більшості випадків обговорення питань криптоанализа шифру RSA стосується завдання розкладання значення n на два його простих множника. Завдання визначення ф(n) по даному n виявляється еквівалентним задачі розкладання n на множники [RIBE96]. Для відомих сьогодні алгоритмів проблема визначення d за даними е і n виявляється такою, що вимагає принаймні таких же витрат часу, як і проблема розкладання на множники [КА1Л95]. Отже, витрати на вирішення завдання розкладання на множники можна використовувати як еталон при оцінці ступеня захищеності RSA.

Для великих n з великими простими множниками розкладання на множники є серйозною проблемою, але не настільки, як потрібно. Вражаючою ілюстрацією цього може служити наступна історія. У 1977 році три винахідника алгоритму RSA наважилися запропонувати читачам популярного журналу Scientific American розкрити шифрування повідомлення, яке вони помістили в розділі "Математичні ігри" Мартіна Гарднера (Martin Gardner). За розшифровку цього повідомлення вони запропонували нагороду в 100 дол. За їх оцінками, завдання не могло бути вирішене раніше, ніж приблизно через 40 квадрильйонів років. Але в квітні 1994 року група користувачів Internet зажадала виплати призової суми після всього восьми місяців спільної роботи в Internet. У запропонованому завданні використовувався відкритий ключ завдовжки в 129 десяткових знаків (довжина n), що дорівнює приблизно 428 бітам. І точно так само, як і для DES, RSA Laboratories оголосили конкурси для шифрів з довжинами ключів в 100, 110, 120 і більше знаків. Останньою з вирішених завдань є завдання для RSA-130, в якій довжина ключа дорівнює 130 десятковим знакам [COWE96]. Наявні на сьогодні результати показані в табл. 8.1. Одиницею міри складності завдання в даному випадку є MIPS-рік - обсяг роботи, виконуваної протягом року процесором, що здійснює обробку одного мільйона команд в секунду, що приблизно еквівалентно виконанню 3x1013 команд. Так, машина на базі Pentium з частотою 200 МГц показує швидкість близько 50 MIPS.

Таблиця 8.1. Прогрес у вирішенні проблеми розкладання на множники

Число

десяткових знаків

Приблизне­ число бітів

Дата рішення

Необхідне

число

MIPS-років

Застосований алгоритм

100

332

Квітень 1991 р.

7

Квадратичне сито

110

366

Квітень 1992 р.

75

Квадратичне сито

120

398

Червень 1993 р.

830

Квадратичне сито

129

428

Квітень 1994 р.

5000

Квадратичне сито

130

431

Квітень 1996 р.

500

Сито в полі чисел загального виду

З таблиці. 8.1 випливає дивовижний факт, що стосується важливості використовуваного методу. Аж до недавнього часу для розкладання на множники застосовувався підхід, відомий під назвою методу квадратичного сита. Для криптоаналізу RSA-130 використовувався новий алгоритм, званий методом сита в полі чисел загального вигляду, що дозволило скоротити обсяг обчислювальних зусиль майже на 10% порівняно з тими, що були потрібні раніше для аналізу RSA-129.

Загроза ключам великої довжини тут подвійна: безперервне зростання обчислювальної потужності сучасних комп'ютерів і безперервне удосконалення алгоритмів розкладання на множники. Як бачите, застосування абсолютно нового алгоритму призвело до істотного скорочення часу на вирішення завдання. Можна очікувати подальшого удосконалення методу сита в полі узагальнених чисел, не виключається також можливість появи нових, ще більш досконалих алгоритмів. Наприклад, наявний вже сьогодні споріднений алгоритм, що використовує метод сита в полі чисел спеціального виду, дозволяє розкладати на множники числа спеціального виду значно швидше, ніж метод сита в полі чисел загального вигляду. На рис. 8.4 представлені результати порівняння цих двох алгоритмів. Логічно чекати появи результатів, які дадуть можливість збільшити швидкість виконання розкладання на множники в загальному випадку до показників, які будуть рівні або навіть вище показників методу сита в полі чисел спеціального виду [ODLY95]. Тому доводиться бути вельми обережним у виборі довжини ключа для RSA. У перспективі недалекого майбутнього здається розумним вибір довжини ключа в діапазоні від 1024 до 2048 бітів.

На додачу до проблеми вибору розміру n дослідниками був виявлений ряд інших обмежень. Щоб уникнути вибору значень n, які можуть бути розкладені на множники з меншими зусиллями, винахідники алгоритму пропонують наступні обмеження щодо p і q.

Рис. 8.4. MIPS-роки, необхідні для розкладання на множники

  1. Значення р і q повинні відрізнятися по довжині всього на кілька розрядів. Наприклад, і p, і q повинні потрапляти в діапазон від 1075 до 10150.

  2. Як (р - 1), так і (q - 1) повинні містити в своїх разложениях досить великий простий множник.

  3. gcd (p - 1, q - 1) повинен бути досить малим.

Крім того, було показано, що якщо е < n і d < n1/4, то d можна визначити досить легко [WIEN90].

Аналіз часових витрат

Якщо комусь потрібні інші докази того, що захист криптографічного алгоритму виявляється непростим завданням, то для цього якнайкраще підійде опис методу аналізу часових витрат. Як переконливо продемонстрував фахівець-консультант з криптографії Пол Кочер (Paul Kocher), противник отримує можливість визначити особистий ключ, аналізуючи витрати часу, які потрібні комп'ютеру для розшифровки повідомлень [КОСН96]. Аналіз часових витрат можна використовувати не тільки у випадку RSA, але і з іншими системами шифрування з відкритим ключем. Атаки такого роду виявляються небезпечними з двох причин: вони можуть вестися з найнесподіваніших напрямків і передбачати аналіз тільки шифрованого тексту.

Аналіз часових витрат почасти аналогічний підходу зломщика, який відгадує комбінацію замку сейфа, спостерігаючи за тим, скільки часу потрібно власнику для того, щоб повернути пристрій замка від цифри до цифри. Можна було б пояснити суть цього підходу на прикладі алгоритму зведення в ступінь в арифметиці класів відрахувань, представленого вище в описі алгоритму, але даний підхід можна адаптувати до будь-якої реалізації, що не припускає виконання алгоритму за фіксований час. У розглянутому тут алгоритмі зведення в степінь виконується біт за бітом, з одним множенням на кожній ітерації і додатковим множенням, виконуваних для кожного біта, рівного 1.

Як зазначає Кочер у своїй роботі, найпростіше зрозуміти суть пропонованого підходу на прикладі, відповідному екстремального нагоди. Припустимо, що система шифрування використовує функцію множення в класах відрахувань, яка виконується дуже швидко майже у всіх випадках, крім невеликого їх числа, коли множення займає значно більше часу. Аналіз проводиться біт за бітом, починаючи з першого зліва біта bk. Припустимо, що перші j бітів вже відомі. (Щоб отримати значення показника ступеня, слід почати j = 0 і повторювати процедуру аналізу до тих пір, поки не стануть відомими всі біти показника.) Для наявного шифрованого тексту противник може виконати перші j ітерацій циклу for. На наступному етапі виконання операції залежить від значення невідомого біта показника ступеня. Якщо цей біт дорівнює 1, то виконується оператор d ← (d×a) mod n. Для кількох значень a та d множення виконується надзвичайно повільно, і супротивник знає, для яких саме. Тому, якщо час виконання алгоритму дешифрування завжди помітно збільшується, коли ця конкретна ітерація виконується при значенні біта, рівному 1, то, виявивши відповідну затримку, можна зробити висновок про те, що даний біт дорівнює 1. Якщо ж для цілої серії спостережень алгоритм завжди виконується досить швидко, то цей біт повинен бути рівним 0.

На практиці реалізації зведення в ступінь в класах відрахувань не мають настільки різко виражених варіацій у часі, щоб тривалість виконання однієї ітерації могла перевищити середній час виконання всього алгоритму в цілому. Але мають місце в реальності варіації все ж таки достатні для того, щоб їх аналіз виявився практично корисним. Більш конкретну інформацію по цій темі ви знайдете в [КОСН96].

Хоча аналіз часових витрат і виявляється серйозною загрозою, проти нього є прості контрзаходи, наприклад наступні.

Постійний час виконання операції піднесення до степеня. Зміна алгоритму таким чином, щоб всі піднесення до степеня займали одне і те ж час від початку виконання до повернення результату. Зробити це просто, але при цьому збільшується загальний час виконання алгоритму.

Випадкові затримки. Менший вплив на загальний час виконання викликає додавання в алгоритм піднесення до степеня випадкових затримок, що зменшує користь від аналізу часових витрат. Але при цьому, як зазначає Кочер, якщо захищається, додасть недостатньо перешкод, противник буде все ще в стані за допомогою додаткових вимірів провести криптоаналіз і в умовах впливу випадкових затримок.

Маскування. Множення шифрованого тексту на випадкове число перед тим, як виконувати зведення в степінь. Це не дозволить противнику дізнатися, які біти шифрованого тексту оброблялися в комп'ютері, і, таким чином, не дасть йому можливості провести порозрядну аналіз, який є істотною частиною підходу, заснованого на аналізі часових витрат.

У деяких продуктах RSA Data Security передбачається можливість використання функції маскування. У них операція М = Сd mod n з особистим ключем виконується наступним чином.

  1. Генерується секретне випадкове число r в діапазоні від 0 до n - 1.

  2. Обчислюється С' = Сre mod n, де е є відкритим значенням показника ступеня.

  3. Обчислюється М '= (С')d mod n для звичайної реалізації RSA.

  4. Обчислюється М = M' r-1 mod n. У цій рівності r-1 являє собою мультиплікативне зворотне значення r mod n. Можна показати, що відповідний результат буде очевидно коректним, якщо зауважити, що red mod n = r mod n.

RSA Data Security стверджує, що при використанні функції маскування загальна продуктивність знижується на величину від 2 до 10%.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]