Розв'язник вправ по дискретній математиці/Кодування/Алгоритм RSA

Матеріал з testwiki
Перейти до навігації Перейти до пошуку

Для розв'язання будемо використовувати Алгоритм RSA.

Також важливо розуміти такі речі:

  1. Взаємно прості числа - не мають жодного спільного дільника, окрім 1;
  2. Розуміти, що результатом amodb буде остача від цілочисленного ділення числа a на число b.

Приклад №1

  1. Оберемо два простих числа: p = 5, q = 11.
  2. Тоді n = p * q = 5 * 11 = 55.
  3. Згідно з властивістю функції Ейлера φ(n)=(p1)(q1)=(51)(111)=40.
  4. Оберемо число, взаємно просте з φ(n) — частину ключа для шифрування. Візьмемо e=3. Воно задовольняє умові НСД(3,φ(n))=1.
  5. Обчислимо d=1e(modφ(55))=13=1403=393=13=27(mod40).

Таким чином, ми отримали публічний ключ (3,55) для шифрування, та приватний ключ (27,55) для розшифрування. Візьмемо якесь значення слова S та зашифруємо і розшифруємо цим ключем.

Нехай S=15. Отримання значення кодованого слова C, яке відповідає слову S відбувається за правилом

C=Se(modn).

Отже C=153(mod55)=152*15=225*15=5*15=75=20.

Розшифруємо C. Для цього скористаємось правилом

S=Cd(modn).
S=2027(mod55)=(4*5)27=(22)27*527=254*527.

Зауважимо, що 26(mod55)=64=9=32, та 53(mod55)=125=15.

Підставимо у вираз:

254*527=(26)9*(53)9=(32)9*(15)9=(3)18*(15)9.

Зауважимо, що ми вже обчислювали 153(mod5)5=20, та обчислимо степені числа 3.

34(mod55)=81=26.
35(mod55)=34*3=26*3=78=23.
36(mod55)=35*3=23*3=69=14.

Підставимо у вираз:

(3)18*(15)9=(36)3*(153)3=143*203=(14*4)3*53=563*15=13*15=15.

Тим самим розшифроване значення співпадає з початковим значенням.

Приклад №2

  1. Оберемо два простих числа: p = 7, q = 13.
  2. Тоді n = p * q = 7 * 13 = 91.
  3. Згідно з властивістю функції Ейлера φ(n)=(p1)(q1)=(71)(131)=6*12=72.
  4. Оберемо число, взаємно просте з φ(n) — частину ключа для шифрування. Візьмемо е = 5. Воно задовольняє умові НСД(5,φ(n))=1.
  5. Обчислимо d=1e(modφ(91))=15=1+2*725=1455=29(mod72).

Таким чином, ми отримали публічний ключ (5,91) для шифрування, та приватний ключ (29,91) для розшифрування. Візьмемо якесь значення слова S та зашифруємо і розшифруємо цим ключем.

Нехай S=11. Отримання значення кодованого слова C, яке відповідає слову S відбувається за правилом

C=Se(modn).

Отже C=115(mod91).

Зауважимо, що 112(mod91)=12191=30(mod91).

Тоді 115(mod91)=(112)2*11=302*11.

Зауважимо, що 302(mod91)=90091*9=81(mod91).

Тоді 302*11=81*11=8919*91=72, отримуємо C=72(mod91)

Розшифруємо C. Для цього скористаємось правилом

S=Cd(modn).
S=7229(mod91).

Зауважимо, що 722(mod91)=(8*9)2=64*81=(6491)*(8191)=27*10=2702*91=8891=3(mod91).

Тоді S=7229(mod91)=72*(722)14=72*(3)14=72*314=8*9*314=8*316=8*(34)4.

Зауважимо також те, що 34(mod91)=8191=10(mod91).

Отримаемо 8*(34)4=8*(10)4=8*10*103=80*1000.

Та врахувавши, що 1000(mod91)=100011*91=1(mod91).

Матимемо 80*1000=80+91=11.

Тим самим розшифроване значення співпадає з початковим значенням.