Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
 Аватар для council_estate
1 / 1 / 0
Регистрация: 18.02.2020
Сообщений: 79

RSA с длинными ключами

15.03.2023, 19:41. Показов 1286. Ответов 14

Студворк — интернет-сервис помощи студентам
Доброе время суток! Есть задача: зачем-то в очередной раз изобрести велосипед реализовать алгоритм RSA с длинными ключами (на p и q не меньше 2^512).

Я нашел кучу примеров алгоритма на Python, но вот проблема: все они заточены под маленькие простые числа чисто для примера. Вот один вариант, из того, что я нашел. Если попробовать сгенерировать ключи хотя бы для 2^6, программа начинает долго думать. Простой перебор подводит, так сказать. Я пытался разобраться, что к чему, но так и не понял, почему виснет, если в этом языке давным-давно есть длинная арифметика.

Есть ли идея, как можно оптимизировать алгоритм или, может, есть готовый пример? Даже если не на Python - мне, по большей части, без разницы. Алгебраист из меня никакой, поэтому прошу помощи здесь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.03.2023, 19:41
Ответы с готовыми решениями:

Как написать шифрование RSA на python без import RSA
Нужнен код без использование RSA библиотеки. Буду блогодарен!

RSA с длинными числами на С++
RSA на C++ Помогите сформировать программу пожалуйста. Задание:Задача заключается в шифровании (или дешифровании) данных с...

RSA с открытым и закрытым ключами
Доброго времени суток. Просто алгоритм шифрования у меня отработан и кодирует/декодирует хорошо #include "stdafx.h" ...

14
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
16.03.2023, 10:12
Цитата Сообщение от council_estate Посмотреть сообщение
зачем-то в очередной раз изобрести велосипед
- тот, кто не изобретал велосипедов, не способен изобрести ничего.
1
 Аватар для council_estate
1 / 1 / 0
Регистрация: 18.02.2020
Сообщений: 79
16.03.2023, 11:29  [ТС]
Catstail, вот спасибо. Помогли так помогли. А главное - все по теме написано.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
16.03.2023, 11:40
council_estate, ну а что ты хочешь услышать, как можно оптимизировать алгоритм, который уже обкатан миллионами людьми? Максимум из приложенного примера, можно сократить, ак это создать множество простых чисел и таблицу делителей (но особо времени это не выиграет), всё.
2
 Аватар для council_estate
1 / 1 / 0
Регистрация: 18.02.2020
Сообщений: 79
16.03.2023, 11:45  [ТС]
Fudthhh, да вот в том-то и дело, что алгоритм обкатан, его используют повсеместно, но я не нашел ни одной его реализации, которая бы не ломалась на действительно больших числах. Почему-то готовая библиотека RSA или тот же вольфрам считают такие числа очень и очень быстро, значит, есть какая-то хитрость. Видимо, стоит начать рыться в этой библиотеке. Может, дойдет до меня что-то.

А по поводу того, что хотел услышать - ну явно не поговорку или чью-то цитату. Да и зачем мне извращаться и писать самому то, что уже есть в библиотеках, на 4 курсе универа? Мне и так есть, чем заняться.
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
16.03.2023, 11:52
Цитата Сообщение от council_estate Посмотреть сообщение
Если попробовать сгенерировать ключи хотя бы для 2^6, программа начинает долго думать.
ты видел как там простые числа генерируются?
Python
1
2
3
4
5
6
for i in range(3, stop + 1, 2):
    for p in primes:
        if i % p == 0:
            break
    else:
        primes.append(i)
Просто бери известные простые числа какие-нибудь, типа Мерсена. Или поищи в сторону "генерация (больших ) простых чисел" в поисковике
1
 Аватар для council_estate
1 / 1 / 0
Регистрация: 18.02.2020
Сообщений: 79
16.03.2023, 11:55  [ТС]
rRczZZ, спасибо большое. Буду пробовать
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
16.03.2023, 12:06
council_estate, только озвучу, если еще кто будет читать, что таким способом криптоскойкость очевидно хромать начнет. Где-то на ютубе лежат лекции по криптографии с Киевского политеха, там чувак давал совет про реализацию RSA - никогда не пишите RSA самостоятельно, и не пользуйтесь библиотеками из "нашел кучу примеров алгоритма на Python"
2
 Аватар для council_estate
1 / 1 / 0
Регистрация: 18.02.2020
Сообщений: 79
16.03.2023, 13:03  [ТС]
rRczZZ, вот и я где-то фразу эту слышал, да вот не вспомнил, откуда. Это больше к посту модератора Catstail насчет того, что изобретать велосипед в этом случае - отличная идея. А насчет пользоваться рандомными библиотеками - так в учебных целях же. Какая разница? Я lorem ipsum максимум зашифрую, никаких важных данных нет. Тем более, я писал о популярной библиотеке RSA, а не о васянских студенческих проектах с гитхаба. Их-то в самый раз можно использовать для собственного такого же васянского примера, чтобы принести преподавателю и понять алгоритм в целом. Преподаватель поставил задачу реализовать самому без использования библиотек, и ничего с этим сделать нельзя.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
16.03.2023, 13:27
Цитата Сообщение от council_estate Посмотреть сообщение
такие числа очень и очень быстро
Готовые библиотеки с большой вероятностью написаны на си. Тем более там применяются все самые шустрые алгоритмы, а в приложенном примере, как заметил rRczZZ, есть достаточно затратные операции.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
16.03.2023, 17:06
Цитата Сообщение от council_estate Посмотреть сообщение
Мне и так есть, чем заняться.
- имею по этому вопросу некоторые сомнения...
0
 Аватар для council_estate
1 / 1 / 0
Регистрация: 18.02.2020
Сообщений: 79
16.03.2023, 17:21  [ТС]
Catstail, послушайте, у меня есть работа, и я учусь в универе, на носу диплом. Я не виноват в том, что нам дают такие "интересные" задачки в рамках семестрового курса, по итогу которого выставляется зачет.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
16.03.2023, 18:44
council_estate, прошу прощения, если задел. Приношу извинения.
0
 Аватар для council_estate
1 / 1 / 0
Регистрация: 18.02.2020
Сообщений: 79
16.03.2023, 18:48  [ТС]
Catstail, все в порядке, спасибо. Я тоже приношу свои извинения, если был груб и чем-нибудь Вас обидел.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
16.03.2023, 19:42
council_estate, в порядке поддержки: вот длинная арифметика (наивная реализация) на C++. Может пригодиться.

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#include <iostream>
using namespace std;
 
string reduce(string const &a)
{
    string sign;
    string z;
    int p;
    
    if (a[0]=='-') 
    {
       sign=string("-");
       z=a.substr(1);
    }
    else
    {
       z=a;    
       sign=string("");
    }
 
    p=-1;
    for (int i=0; i<z.size(); i++)
        if (z[i] != '0')
        {
            p=i;
            break;
        }
    if (p==-1) return string("0");    
    return sign+z.substr(p);
}
 
 
string longSub(string const &a1, string const &a2)
{
     int sz1=a1.size();
     int sz2=a2.size();
     int sz;
     string aa1,aa2,sgn;
     int ii,q1,q2,b;
     
     if (sz1==sz2)
     {
         aa1=a1;
         aa2=a2;
         sz=sz1+1;
     }
     else if (sz1 > sz2)
     {
         aa1=a1;
         aa2=string(sz1-sz2,'0')+a2;
         sz=sz1+1;
     }
     else
     {
         aa1=string(sz2-sz1,'0')+a1;
         aa2=a2;
         sz=sz2+1;
     }
     
     if (aa1 > aa2)
        sgn="";
     else
     {
         swap(aa1,aa2);
         sgn="-";
     }
 
    char tmp[sz];   
 
    for(ii=0; ii<sz; ii++) tmp[ii]=' ';
    tmp[sz-1]=0;
    
    ii=sz-2;
    b=0;
    
    while(1)
    {
        q1=aa1[ii]-'0'-b;
        q2=aa2[ii]-'0';
        if (q1>=q2)
        {
           tmp[ii]=(q1-q2)+'0';
           b=0;
        }
        else
        {
           tmp[ii]=(q1+10-q2)+'0';
           b=1;
        }
        ii--;
        if (ii<0) break;
    }
    
    return sgn+string(tmp);
}
 
string longAdd(string const &a1, string const &a2)
{
    string res;
    int sz1=a1.size();
    int sz2=a2.size();
    int sz=max(sz1,sz2)+2;
    char tmp[sz];
    int i1,i2,ii,q1,q2,z,p;
    
    for(ii=0; ii<sz; ii++) tmp[ii]=' ';
    tmp[sz-1]=0;
 
    i1=sz1-1;
    i2=sz2-1;
    ii=sz-2;
    
    p=0;
    while(1)
    {
        if (i1>=0)
           q1=a1[i1]-'0';
        else
           q1=0;
 
        if (i2>=0)
           q2=a2[i2]-'0';
        else
           q2=0;
        
        z=p+q1+q2;
        tmp[ii]=z%10+'0';
        p=z/10;
        
        ii--;
        i1--;
        i2--;
        if (i1<0 && i2<0) break;
    }
    
    if (p>0) tmp[ii]=p+'0';
    
    for (ii=0; ii<sz; ii++)
       if (tmp[ii] != ' ')
       {
           res=string(tmp+ii);
           break;
       }
 
    return res;
    
}
 
string longDiv(string const &a1, string const &a2)
{
    if (a2=="0") throw "Длинное деление на нуль";
    
    string aa1=a1;
    string aa2=a2;
    
    int l1=aa1.size();
    int l2=aa2.size();
    
    if (l1>l2)
       aa2=string(l1-l2,'0')+aa2;
    
    if (l2>l1)
       aa1=string(l2-l1,'0')+aa1;
    
    string res("0");
 
    while(aa1>=aa2)
    {
        aa1=longSub(aa1,aa2);
        res=longAdd(res,"1");
    }
    
    return reduce(res);
}
 
string longRem(string const &a1, string const &a2)
{
    if (a2=="0") throw "Длинное деление на нуль";
    
    string aa1=a1;
    string aa2=a2;
    
    int l1=aa1.size();
    int l2=aa2.size();
    
    if (l1>l2)
       aa2=string(l1-l2,'0')+aa2;
    
    if (l2>l1)
       aa1=string(l2-l1,'0')+aa1;
    
    //string res("0");
 
    while(aa1>=aa2)
    {
        aa1=longSub(aa1,aa2);
        //res=longAdd(res,"1");
    }
    
    return reduce(aa1);
}
 
string longGcd(string const &a1, string const &a2)
{
 
    string aa1=a1;
    string aa2=a2;
    string tmp;
    string zero=string("0");
    
    while (aa2 != zero)
    {
        tmp=longRem(aa1,aa2);
        aa1=aa2;
        aa2=tmp;
    }
    
    return aa1;
}
 
string longMult(string const &a1, string const &a2)
{
    string add("");
    string res("0");
    string tmp;
    int k,c,p,u;
    
    int sz2=a2.size();
    int sz1=a1.size();
 
    for (int i=sz2-1; i>=0; i--)
    {
        tmp=string("");
 
        k=(a2[i]-'0');
 
        if (k > 0)
        {
            p=0;
            for (int j=sz1-1; j>=0; j--)
            {
                c=(a1[j]-'0')*k+p;
                u=c%10;
                p=c/10;
                tmp=(char)(u+'0')+tmp;
            }
            
            if (p>0) tmp=(char)(p+'0')+tmp;
            
            tmp=tmp+add;
            
            res=longAdd(res,tmp);
 
        }
        
        add=add+"0";
    }
    
    return res;
}
 
string factorial(int n)
{
    string f("1");
    string a("1");
    
    for (int i=2; i<=n; i++)
    {
        a=longAdd(a,string("1"));
        f=longMult(f,a);
    }
    
    return f;
    
}
 
 
int main()
{
 
    // 300 первых чисел Фибоначчи
    
    string c="0", p="1", t;
    
    for (int i=1; i<=300; i++)
    {
        t=longAdd(c,p);
        
        cout << i << " " << t << endl;
        
        p=c;
        c=t;
        
    }
 
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.03.2023, 19:42
Помогаю со студенческими работами здесь

Криптография с асимметричными ключами | Расшифруйте/Зашифруйте по алгоритму RSA
Добрый вечер, уважаемые пользователи форума! Подскажите, пожалуйста, желательно примером ниже, как решаются задачи по типу: ...

Создать хеш-таблицу со случайными целыми ключами от -10 до 10 и удалить из нее записи с отрицательными ключами
Создать хеш-таблицу со случайными целыми ключами в диапазоне от –10 до 10 и удалить из него записи с отрицательными ключами

Создать хеш-таблицу со случайными целыми ключами и удалить из него записи с чётными ключами
Помогите пожалуйста создать хеш-таблицу со случайными целыми ключами и удалить из него записи с чётными ключами.(код на С желательно)

Про RSA. В чём отличие класса RSA от RSACryptoServiceProvider (правда, что он сохраняет где-то ключ в Windows?)
Коллеги, разбираюсь потихоньку с реализацией RSA на C#. Есть несколько вопросов. Первый, самый волнующий на данный момент - чем в...

Реализация функции вычисления электронно-цифровой подписи RSA. Реализация функции проверки ЭЦП RSA
Последовательность выполняемых действий включает следующие шаги. 1. Сформировать два простых числа p и q длиной 2 десятичных знака. 2....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru