Professional Documents
Culture Documents
Приклад шифрування і дешифрування в RSA
Приклад шифрування і дешифрування в RSA
В КРИПТОСИСТЕМІ RSA
RSA - криптографічний система з відкритим ключем, що забезпечує такі механізми
захисту інформації, як шифрування і цифровий підпис (аутентифікація - встановлення
автентичності). Криптосистема RSA розроблена в 1977 році і названа на честь її розробників
Ronald Rivest, Adi Shamir і Leonard Adleman.
Безпека алгоритму RSA побудована на принципі складності факторизації цілих
чисел. Алгоритм використовує два ключі— відкритий (public) і секретний (private), разом
відкритий і відповідний йому секретний ключі утворюють пари ключів (keypair). Відкритий
ключ не потрібно зберігати в таємниці, він використовується для шифрування даних. Якщо
повідомлення було зашифровано відкритим ключем, то розшифрувати його можна тільки
відповідним секретним ключем.
Генерування ключів:
Для того, щоб згенерувати пари ключів виконуються такі дії:
Беруться два досить великих простих числа p і q;
Обчислюється їх добуток n = p * q, n називається модулем;
Обчислюється функція Ейлера φ(n)=(p-1) • (q-1);
Вибираємо відкритий ключ e, як довільне число (0<e<n) взаємно просте зі
значенням функції Ейлера φ(n);
За допомогою розширеного алгоритму Евкліда знаходиться число d таке, що
𝑒 • 𝑑 ≡ 1 (𝑚𝑜𝑑 𝜑 𝑛 );
Відкритий (public) ключ визначається числами n і e , а секретний (private) ключ – n
і d.
Подільники (фактори) p і q можна або знищити або зберегти разом з секретним
(private) ключем.
№ Операція Приклад
1 Вибираємо два простих числа p і q P=7 і q=13
332 Обчислюємо добуток ( модуль) n = p * q n=91
3 Обчислюємо функцію Ейлера φ(n)=(p-1) • (q-1) φ(n)=(7-1) • (13-1)=72
Вибираємо відкритий ключ e, як довільне число
4 (0<e<n) взаємно просте зі значенням функції Ейлера e=5
φ(n)
Обчислюємо закритий ключ d, як зворотне число до e за
5 (d *5)mod 72=1, d=29
модулем φ(n), з співвідношення (d *e)mod φ(n)=1
Примітки.
1) Просте число - це натуральне число, більше одиниці яке не має інших натуральних
дільників, окрім самого себе і одиниці.
2) Результат розрахунку функція Ейлера ((n) дорівнює кількості позитивних чисел, не
перевершуючих n і взаємно простих з n.
3) Взаємно прості числа - числа, що не мають загальних дільників, окрім 1, тобто
найбільший загальний дільник яких дорівнює 1.
4) Слід також зазначити, що ключі e і d рівноправні, тобто повідомлення можна
шифрувати як ключем e, так і ключем d, при цьому розшифровка повинна бути проведена за
допомогою іншого ключа.
Процедури шифрування і дешифрування виконуються згідно наступних формул:
e
C = Т mod n , Т = C d mod n.
де Т, C - числові еквіваленти символів відкритого і шифрованого повідомлення.
Приклад шифрування та розшифрування згідно алгоритму RSA повідомлення
«PRESIDENT» ( e=5, n=91, d=29 ) наведений в наступній таблиці. Коди літер відповідають
їх положенню в англійському алфавіті (починаючи з 1).
Буква Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj
№ 1 2 3 4 5 6 7 8 9 10
Буква Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt
№ 11 12 13 14 15 16 17 18 19 20
Буква Uu Vv Ww Xx Yy Zz
№ 21 22 23 24 25 26
Відкрите Символ P R E S I D E N T
повідомлення
Код 16 18 05 19 09 04 05 14 20
Зашифроване
повідомлення
74 44 31 80 81 23 31 14 76
Розшифроване
P R E S I D E N T
повідомлення
Слід зазначити, що p і q вибираються так, щоб n було більше коду будь-якого символу
відкритого повідомлення. У автоматизованих системах початкове повідомлення
переводитися в двійкове представлення, після чого шифрування виконується над блоками біт
рівної довжини. При цьому довжина блоку має бути менше, ніж довжина двійкового
представлення n.
e
Закодуємо літеру P. Код літери Т(Р)=16, тоді C(Р) = Т mod n =165 mod 91=
1 048 576 mod 91=74.
Приложение 1
Напомним, что НОД двух чисел можно вычислить согласно следующей рекуррентности:
if (b == 0) return a;
d = x’ · b + y’ · (a mod b)
x = y’, y = x’ – y’ · (2)
d = x’ · b + y’ · (a – · b) = y’ · a + (x’ – y’ · ) · b = x · a + y · b,
Функция gcdext(int a, int b, int *d, int *x, int *y), приведенная ниже, по входным числам a и b
находит d = НОД(a, b) и такие x, y что d = a · x + b · y. Для поиска неизвестных x и y
необходимо рекурсивно запустить функцию gcdext(b, a mod b, d, x, y) и пересчитать значения
x и y по выше приведенной формуле. Рекурсия заканчивается, когда b = 0. При b = 0 НОД(a,
0) = a и a = a · 1 + 0 · 0, поэтому полагаем x = 1, y = 0.
void gcdext (int a, int b, int *d, int *x, int *y)
int s;
if (b == 0)
*d = a; *x = 1; *y = 0;
return;
gcdext(b,a % b,d,x,y);
s = *y;
*y = *x - (a / b) * (*y);
*x = s;
а) Сначала вычислим НОД(a, b), используя первые два столбца таблицы и соотношение (1).
В последней строке в колонке а будет находиться значение d = НОД(a, b).
Рассмотрим, например, как получены значения (x, y) для первой строки. Со второй строки
берем значения (x’, y’) = (1, -1). По формулам (2) получим:
x = y’ = -1,
y = x’ – y’ · = 1 – (-1) · =1+1=2
Линейным сравнением называется уравнение вида ax = b (mod n). Оно имеет решение
тогда и только тогда, когда b делится на d = НОД(a, n). Если d > 1, то уравнение можно
упростить, заменив его на a’x = b’ (mod n’), где a’ = a / d, b’ = b / d, n’ = n / d. После такого
преобразования числа a’ и n’ являются взаимно простыми.
2. Умножим на b’ равенство a’x0 = 1 (mod n’). Получим a’(b’x0) = b’ (mod n’), откуда
решением исходного уравнения a’x = b’ (mod n’) будет x = b’x0 (mod n’).
Приложение 2
1. См. тут