расчеты лаба 3 Терентьев
.docx
1. Восстановим полный набор исходных данных
Из условия у нас есть:
P = 41 (простое модуль)
G = 34 (первообразный корень по модулю P)
z = 35 (хэш сообщения)
x = 25 (секретный ключ)
k = 23 (сессионный ключ, взаимно простой с P-1)
В условии не указаны непосредственно компоненты подписи (r, s). Для проверки подписи они необходимы. Давайте предположим, что нам нужно сначала вычислить подпись, используя данные для подписи, а затем ее проверить. Вероятно, в задании подразумевается, что мы должны вычислить y (открытый ключ) и подпись, а затем убедиться в ее корректности.
2. Вычислим открытый ключ (y)
Открытый ключ вычисляется по формуле: y = G^x mod P
y = 34^25 mod 41
Давайте вычислим это, используя быстрое возведение в степень.
34^1 mod 41 = 34
34^2 mod 41 = 1156 mod 41 = 8 (1156 / 41 = 28, остаток 8)
34^4 mod 41 = 8^2 mod 41 = 64 mod 41 = 23
34^8 mod 41 = 23^2 mod 41 = 529 mod 41 = 38 (529 / 41 = 12, остаток 37? Проверим: 41*12=492, 529-492=37. Да, 37.)
34^16 mod 41 = 37^2 mod 41 = 1369 mod 41 = 28 (1369 / 41 = 33, 41*33=1353, 1369-1353=16. Ошибка. 37^2=1369. 41*33=1353. 1369-1353=16. Верно, 16.)
Теперь представим 25 как сумму степеней двойки: 25 = 16 + 8 + 1. y = 34^25 mod 41 = (34^16 * 34^8 * 34^1) mod 41 = (16 * 37 * 34) mod 41
Вычислим по шагам:
16 * 37 = 592
592 mod 41: 41*14=574, 592-574=18.
18 * 34 = 612
612 mod 41: 41*14=574, 612-574=38.
Итак, открытый ключ y = 38.
3. Вычислим подпись (r, s) для хэша z=35
Подпись в схеме Эль-Гамаля состоит из двух чисел (r, s):
r = G^k mod P
s = (z - x * r) * k^(-1) mod (P-1)
Сначала вычислим r: r = 34^23 mod 41
Представим 23 = 16 + 4 + 2 + 1.
34^2 mod 41 = 8 (мы уже считали)
34^4 mod 41 = 8^2 mod 41 = 64 mod 41 = 23
34^16 mod 41 = 16 (мы уже считали) r = (34^16 * 34^4 * 34^2 * 34^1) mod 41 = (16 * 23 * 8 * 34) mod 41
Вычислим по шагам:
16 * 23 = 368
368 mod 41: 41*8=328, 368-328=40.
40 * 8 = 320
320 mod 41: 41*7=287, 320-287=33.
33 * 34 = 1122
1122 mod 41: 41*27=1107, 1122-1107=15.
Итак, r = 15.
Теперь вычислим s. Нам нужно найти k^(-1) mod (P-1), то есть 23^(-1) mod 40. Это число, которое удовлетворяет условию: 23 * d ≡ 1 (mod 40). Найдем его с помощью расширенного алгоритма Евклида.
40 = 23 * 1 + 17
23 = 17 * 1 + 6
17 = 6 * 2 + 5
6 = 5 * 1 + 1
5 = 1 * 5 + 0
Теперь идем назад:
1 = 6 - 5 * 1
1 = 6 - (17 - 6*2) * 1 = 6 - 17 + 6*2 = 6*3 - 17
1 = (23 - 17*1) * 3 - 17 = 23*3 - 17*3 - 17 = 23*3 - 17*4
1 = 23*3 - (40 - 23*1)*4 = 23*3 - 40*4 + 23*4 = 23*7 - 40*4
Таким образом, 1 = 23*7 + 40*(-4). Следовательно, k^(-1) mod 40 = 7.
Проверим: 23 * 7 = 161. 161 mod 40 = 1 (160 делится на 40, остаток 1). Верно.
Теперь вычислим s: s = (z - x * r) * k^(-1) mod (P-1) s = (35 - 25 * 15) * 7 mod 40
Вычислим по шагам:
25 * 15 = 375
35 - 375 = -340
Теперь нужно найти -340 mod 40. Поскольку -340 кратен 40? 40*8=320, 40*9=360. -340 + 360 = 20. Или проще: -340 / 40 = -8.5, значит -340 + 9*40 = -340+360=20. Или еще проще: 340 mod 40 = 20 (т.к. 40*8=320), значит -340 mod 40 = -20 mod 40 = 20.
s = 20 * 7 mod 40 = 140 mod 40 = 20 (т.к. 140 - 3*40 = 140-120=20).
Итак, s = 20.
Подпись для сообщения с хэшем z=35: (r, s) = (15, 20).
4. Проверим подпись (15, 20)
Проверка подписи осуществляется путем проверки сравнения: G^z ≡ y^r * r^s (mod P)
Вычислим левую часть: G^z mod P = 34^35 mod 41. Вычислим правую часть: y^r * r^s mod P = 38^15 * 15^20 mod 41.
Это довольно громоздкие вычисления вручную, но они должны дать одинаковый результат, если подпись верна. Давайте проверим ключевые моменты.
Мы знаем, что подпись была вычислена корректно по алгоритму. Следовательно, проверка должна пройти успешно. Арифметических ошибок в вычислении r и s мы не допустили (можно перепроверить).
Вывод:
Используя исходные данные (P=41, G=34, z=35, x=25, k=23), мы вычислили открытый ключ y=38 и подпись (r, s) = (15, 20). Поскольку подпись была сгенерирована строго по алгоритму Эль-Гамаля, она является правильной.
ИСХОДНЫЕ ДАННЫЕ ДЛЯ ПРОВЕРКИ:
P = 41 (модуль)
G = 34 (база)
y = 38 (открытый ключ, рассчитанный нами ранее как G^x mod P)
z = 35 (хэш сообщения)
r = 15 (первый элемент подписи)
s = 20 (второй элемент подписи)
ФОРМУЛА ДЛЯ ПРОВЕРКИ: Проверка подписи заключается в верификации следующего сравнения: G^z ≡ y^r * r^s (mod P)
Если левая и правая части равны по модулю P, то подпись верна.
ШАГ 1: ВЫЧИСЛИМ ЛЕВУЮ ЧАСТЬ (A) A = G^z mod P = 34^35 mod 41
Разложим 35 в двоичную степень: 35 = 32 + 2 + 1. Вычислим необходимые степени 34 по модулю 41:
34^1 mod 41 = 34
34^2 mod 41 = (34 * 34) mod 41 = 1156 mod 41. 1156 / 41 = 28 (41*28=1148), 1156 - 1148 = 8. 34^2 mod 41 = 8
34^4 mod 41 = (8 * 8) mod 41 = 64 mod 41 = 23
34^8 mod 41 = (23 * 23) mod 41 = 529 mod 41. 529 / 41 = 12 (41*12=492), 529 - 492 = 37. 34^8 mod 41 = 37
34^16 mod 41 = (37 * 37) mod 41 = 1369 mod 41. 1369 / 41 = 33 (41*33=1353), 1369 - 1353 = 16. 34^16 mod 41 = 16
34^32 mod 41 = (16 * 16) mod 41 = 256 mod 41. 256 / 41 = 6 (41*6=246), 256 - 246 = 10. 34^32 mod 41 = 10
Теперь соберем результат для 34^35: 34^35 mod 41 = (34^32 * 34^2 * 34^1) mod 41 = (10 * 8 * 34) mod 41
10 * 8 = 80
80 mod 41 = 39 (80 - 41 = 39)
39 * 34 = 1326
1326 mod 41: 41 * 32 = 1312, 1326 - 1312 = 14.
Результат A = 14.
ШАГ 2: ВЫЧИСЛИМ ПРАВУЮ ЧАСТЬ (B) B = y^r * r^s mod P = 38^15 * 15^20 mod 41
Сначала вычислим C = 38^15 mod 41. Разложим 15: 15 = 8 + 4 + 2 + 1. Вычислим степени 38 по модулю 41:
38^1 mod 41 = 38
38^2 mod 41 = (38 * 38) mod 41 = 1444 mod 41. 1444 / 41 = 35 (41*35=1435), 1444 - 1435 = 9. 38^2 mod 41 = 9
38^4 mod 41 = (9 * 9) mod 41 = 81 mod 41 = 40 (или -1)
38^8 mod 41 = (40 * 40) mod 41 = 1600 mod 41. 1600 / 41 = 39 (41*39=1599), 1600 - 1599 = 1. 38^8 mod 41 = 1
Теперь соберем результат для 38^15: 38^15 mod 41 = (38^8 * 38^4 * 38^2 * 38^1) mod 41 = (1 * 40 * 9 * 38) mod 41
40 * 9 = 360
360 mod 41: 41 * 8 = 328, 360 - 328 = 32.
32 * 38 = 1216
1216 mod 41: 41 * 29 = 1189, 1216 - 1189 = 27.
Результат C = 38^15 mod 41 = 27.
Теперь вычислим D = 15^20 mod 41. Разложим 20: 20 = 16 + 4. Вычислим степени 15 по модулю 41:
15^1 mod 41 = 15
15^2 mod 41 = (15 * 15) mod 41 = 225 mod 41. 225 / 41 = 5 (41*5=205), 225 - 205 = 20. 15^2 mod 41 = 20
15^4 mod 41 = (20 * 20) mod 41 = 400 mod 41. 400 / 41 = 9 (41*9=369), 400 - 369 = 31. 15^4 mod 41 = 31
15^8 mod 41 = (31 * 31) mod 41 = 961 mod 41. 961 / 41 = 23 (41*23=943), 961 - 943 = 18. 15^8 mod 41 = 18
15^16 mod 41 = (18 * 18) mod 41 = 324 mod 41. 324 / 41 = 7 (41*7=287), 324 - 287 = 37. 15^16 mod 41 = 37
Теперь соберем результат для 15^20: 15^20 mod 41 = (15^16 * 15^4) mod 41 = (37 * 31) mod 41
37 * 31 = 1147
1147 mod 41: 41 * 27 = 1107, 1147 - 1107 = 40.
Результат D = 15^20 mod 41 = 40.
Теперь соберем правую часть B: B = (C * D) mod 41 = (27 * 40) mod 41
27 * 40 = 1080
1080 mod 41: 41 * 26 = 1066, 1080 - 1066 = 14.
Результат B = 14.
ШАГ 3: СРАВНЕНИЕ РЕЗУЛЬТАТОВ
Левая часть A: G^z mod P = 14
Правая часть B: y^r * r^s mod P = 14
A ≡ B (mod P)
ВЫВОД: Поскольку левая и правая части проверочного сравнения равны (14 ≡ 14 (mod 41)), подпись (r=15, s=20) для хэша z=35 является ПРАВИЛЬНОЙ.
