Генерация секретного ключа RSA (d)

Тема в разделе "WASM.CRYPTO", создана пользователем asmlamo, 6 авг 2025.

  1. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.750
    Не совсем понятно как генерировать секретную компоненту (d) в RSA !




    Берем пример из википедии


    Выбираем простые числа p = 3557 q = 2579


    n = p*q = 3557*2579 = 9173503

    Вычисляем функцию Эйлера.

    El = (p-1)*(q-1) = (3557-1)*(2579-1) = 3556*2578 = 9167368


    Выбираем открытую экспоненту e=3


    И теперь самая мякотка ...нам нужно сгенерить секретный ключ d.


    Пишут про мульпликативно обратное к числу e по модулю El (ранее полученного Эйлера) и алгоритм Евклида.

    Для меня это вообще магические заклинания.


    Смотрим что пишет Вики.

    d = (k*El+1)/e = (2*9167368+1)/3 = 6111579

    Непонятно что такое k и откуда она взялась ?

    Почему она равна 2.
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.085
    По-моему реализацию на языке программирования изучать проще, чем закорючки математиков.
    Код (Text):
    1. // Find the Greatest Common Divisor between two numbers
    2. int gcd(int num1, int num2){
    3.     int temp;
    4.  
    5.     while(num2 > 0){
    6.       temp = num1 % num2;
    7.       num1 = num2;
    8.       num2 = temp;
    9.     }
    10.    
    11.     return num1;
    12. }
    13.  
    14. // d = (1/e) mod n
    15. int mod_inverse(int u, int v)
    16. {
    17.     int inv, u1, u3, v1, v3, t1, t3, q;
    18.     int iter;
    19.     /* Step X1. Initialise */
    20.     u1 = 1;
    21.     u3 = u;
    22.     v1 = 0;
    23.     v3 = v;
    24.     /* Remember odd/even iterations */
    25.     iter = 1;
    26.     /* Step X2. Loop while v3 != 0 */
    27.     while (v3 != 0)
    28.     {
    29.         /* Step X3. Divide and "Subtract" */
    30.         q = u3 / v3;
    31.         t3 = u3 % v3;
    32.         t1 = u1 + q * v1;
    33.         /* Swap */
    34.         u1 = v1; v1 = t1; u3 = v3; v3 = t3;
    35.         iter = -iter;
    36.     }
    37.     /* Make sure u3 = gcd(u,v) == 1 */
    38.     if (u3 != 1)
    39.         return 0;   /* Error: No inverse exists */
    40.     /* Ensure a positive result */
    41.     if (iter < 0)
    42.         inv = v - u1;
    43.     else
    44.         inv = u1;
    45.     return inv;
    46. }