Смекни!
smekni.com

Дискретний логарифм (стр. 1 из 2)

Реферат на тему:

Дискретний логарифм


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

Означення. Нехай G – скінченна циклічна група порядка n. Нехай g – генератор G та bÎ G. Дискретним логарифмом числа b за основою g називається таке число x (0 £ x£ n - 1), що gx = b та позначається x = loggb.

Проблема дискретного логарифму. Нехай p – просте число, g – генератор множини Zp*, yÎZp*. Знайти таке значення x(0 £x£p - 2), що gxºy (modp). Число x називається дискретним логарифмом числа yза основою g та модулем p.

Узагальнена проблема дискретного логарифму.Нехай G – скінченна циклічна група порядка n, g – її генератор, bÎ G. Необхідно знайти таке число x (0 £ x£ n - 1), що gx = b.

Розширенням узагальненої проблеми може стати задача розв’язку рівняння gx = b, коли знято умову циклічності групиG, а також умову того, що g – генератор G (в такому випадку рівняння може і не мати розв’язку).

Приклад.g = 3 є генератором Z7*: 31 = 3, 32 = 2, 33 = 6, 34 = 4, 35 = 5, 36 = 1.

log34 = 4 (mod 7), тому що розв’язком рівняння 3x = 4 буде x = 4.

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

Доведення. Нехай kÎG, x = logak, y = logbk, z = logab. Тоді ax = by = (az)y, звідки x = zymodn. Підставимо в останню рівність замість змінних логарифмічні вирази:

logak =(logab) (logbk) modn

або

logbk =(logak) (logab)-1modn.

З останньої рівності випливає справедливість теореми.

Примітивний алгоритм

Для знаходження loggb (g – генератор G порядка n, bÎ G) будемо обчислювати значення g, g2, g3, g4, ... поки не отримаємо b. Часова оцінка алгоритму – O(n). Якщо n– велике число, то час обчислення логарифму є достатньо великим і тому алгоритм є неефективним.

Алгоритм великого та малого кроку

Першим детермінованим алгоритмом для обчислення дискретного логарифму був алгоритм великого та малого кроку, запропонований Шанком (Shank) [1].

Для обчислення loggb в групі Zn*необхідно зробити наступні кроки:

1. Обчислити a = é ù ;

2. Побудувати списокL1 = 1, ga, g2a, ..., g (за модулем n);

3. Побудувати списокL2 = b, bg, bg2, ..., bga - 1 (за модулем n);

4. Знайти число z, яке зустрілося в L1 та L2.

Тоді z = bgk = gla для деяких k та l. Звідси b = gla - k = gx; x = la - k.

Два питання постає при дослідженні роботи наведеного алгоритму:

1. Чи завжди знайдеться число, яке буде присутнім в обох списках?

2. Як ефективно знайти значення z?

Запишемо x = sa + t для деяких s, t таких що 0 £s, t < a. Тоді b = gx = gsa + t. Домножимо рівність на ga- t, отримаємо: bga- t = gs(a + 1). Значення зліва обов’язково зустрінеться в L2, а справа – в L1.

Відсортуємо отримані списки L1 та L2 за час O(a * loga). За лінійний час проглядаємо списки зліва направо порівнюючи їх голови: якщо вони рівні, то значення z знайдене, якщо ні – то видалити менше число і продовжити перевірку.

Приклад. Розв’язати рівняння: 2xº 11 (mod 13).

a = é ù = 4;

L1: 1, 24º 3, 28º 9, 212º 1, 216º 3;

L2: 11, 11 * 2 º 9, 11 * 22º 5, 11 * 23º 10;

Число 9 зустрілося в обох списках. 11 * 2 º 28, 11 º 27, звідки x = 7.

Відповідь: x = 7.

Інший підхід до реалізації алгоритму великого та малого кроку можна отримати якщо рівність b = gsa + t (a = é ù , 0 £s, t < a) переписати у вигляді b * (g-a)s = gt. Обчислимо g-a та складемо таблицю значень gt, 0£t < a. Далі починаємо знаходити значення b * (g-a)s, s = 0, 1, … перевіряючи їх наявність у таблиці gt. Як тільки знаходяться такі s та t, алгоритм зупиняється.

Приклад. Обчислити log23 в групі Z19* .

3 = 2x = 2sa+1, 3 * (2-a)s = 2t. Складемо таблицю 2t, 0£t < é ù = 5:

t 0 1 2 3 4
2t 1 2 4 8 16

2-1º 10 (mod 19), оскільки 2 * 10 º 1 (mod 19).

Тоді 3 * (2-5)s(mod 19) º 3 * (105)s (mod 19) º 3 * 3s (mod 19)

Обчислюємо 3 * 3s, s = 0, 1, … :

s 0 1 2
3 * 3s 3 9 8

Значення 8, яке отримали при s = 2, присутнє в таблиці 2t, 0£t < 5.

Звідси3 * (2-5)2 = 23або 3 = (25)2* 23 = 25*2+3 = 213.

Відповідь: 3 = 213, тобто log23 = 13.

Алгоритм Полард - ро

Нехай G – циклічна група з порядком n (n – просте). Розіб’ємо елементи групи G на три підмножини S1, S2 та S3, які мають приблизно однакову потужність. При цьому необхідне виконання умови: 1 Ï S2. Визначимо послідовність елементів xi наступним чином:

x0 = 1, xi+1 = , i ³ 0 (1)

Ця послідовність у свою чергу утворить дві послідовності ci та di , що задовольняють умові

xi =

та визначаються наступним чином:

с0 = 0, сi+1 = , i³ 0 (2)

та

d0 = 0, di+1 = , i ³ 0 (3)

Алгоритм буде працювати циклічно шукаючи таке знчення i, для якого xi = x2i. Для таких значень будуть мати місце рівність = або = . Логарифмуючи останню рівність за основою a, матимемо:

(di - d2i) * logabº (c2i - ci) mod n

Якщо di¹d2i (modn), то це рівняння може бути ефективно розв’язано для обчислення logab.

Алгоритм

Вхід: генератор a циклічної групи G з порядком nта елемент bÎ G.

Вихід: дискретний логарифм x = logab.

1. x0¬ 1, c0¬ 0, d0¬ 0.

2. fori = 1, 2, ... do

2.1. За значеннями xi-1, ci-1, di-1 та x2i-2, c2i-2, d2i-2 обчислити значення xi, ci, di та x2i, c2i, d2i використовуючи формули (1), (2), (3).

2.2. if (xi = x2i) then

r¬ (di - d2i) modn;

if (r = 0) thenreturn (FALSE); // розв’язку не знайдено

x¬r-1 (ci - c2i) mod n.

return (x).

Якщо алгоритм завершується невдачею (повертає FALSE), то можна запустити його вибравши інші початкові значення c0, d0 з інтервалу [1; n - 1] та поклавши x0 = .

Приклад. Обчислити log29в групі Z19*.

Побудуємо наступну таблицю значень послідовностей xi, ci, di:
i xi ai bi x2i a2i b2i
1 9 0 1 18 1 1
2 18 1 1 4 4 2
3 17 2 1 4 8 6
4 4 4 2 4 16 14
5 17 4 3 4 32 30
6 4 8 6 4 64 62

На 6 кроці отримали x6 = x12. Підставивши їх значення, отримаємо:

28 * 96 = 264 * 962 або 28 – 64 = 962 – 6 , 2-56 = 956

Логарифмуємо рівність: -56 * log29 = 56 (mod 18), оскільки |Z19*| = 18.

Враховуючи що -56 (mod 18) º 16, 56 (mod 18) º 2, перепишемо рівність у вигляді 16 * log29 = 2 (mod 18) або 8 * log29 = 1 (mod 9). log29 = 8-1 (mod 9) = 8.

Відповідь: log29 = 8.

Індексний алгоритм

Алгоритм, базований на обчисленні індексів, є найпотужним при обчисленні дискретного логарифму. Необхідно побудувати відносно невелику підмножину S елементів групи G, яка називається множниковою основою. Ця підмножина повинна обиратися таким чином, щоб як можна більша частина елементів G могла бути представлена у вигляді добутку її елементів. При обчисленні значення logab (a – генератор G, bÎ G) спочатку обчислюються значення логарифмів елементів з S (які заносяться в тимчасову базу даних), а потім на їх основі обчислюється логарифм числа b.

Алгоритм

Вхід: генератор a циклічної групи G порядка n та елемент bÎ G.

Вихід: дискретний логарифм x = logab.

1. Побудувати множину S – множникову основу. Нехай S = {p1, p2, …, pt}. В якості значень piможна обрати, наприклад, i - те просте число.