Форум программистов, компьютерный форум, киберфорум
Криптография
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 18.02.2026
Сообщений: 1

Два приватных ключа RSA на один публичный

18.02.2026, 14:06. Показов 194. Ответов 0

Студворк — интернет-сервис помощи студентам
Экспериментировал с шифрованием RSA в Python 3.7.7, пакет PyCryptodome 3.23.0.

Написан скрипт gen_rsa.py, который генерирует ключи функцией RSA.generate(), далее извлекаются все параметры формирования ключа: p, q, e, d.
Python
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
 
from Crypto.PublicKey import RSA
 
def mod_inverse(e, phi):
    t, newt = 0, 1
    r, newr = phi, e
    while newr:
        quotient = r // newr  # floor division
        t, newt = newt, t - quotient * newt
        r, newr = newr, r - quotient * newr
    if r > 1:
        return None  # no solution
    if t < 0:
        t = t + phi
    return t
 
rsa_key = RSA.generate(2048)
 
p = rsa_key.p
q = rsa_key.q
e = rsa_key.e
d = rsa_key.d
 
n = p*q
phi = (p-1)*(q-1)
d_new = mod_inverse(e, phi)
 
print('p:')
print(p)
print('q:')
print(q)
print('e:')
print(e)
print('d:')
print(d)
print('d_new (вычисленная):')
print(d_new)
print()
print('k:')
print((d*e)//phi)
if (d*e)%phi == 1:
    print('OK, остаток от деления (d*e)/phi равен 1')
else:
    print('WARNING!!! остаток от деления (d*e)/phi не равен 1')
    
print('k_new:')
print((d_new*e)//phi)
if (d_new*e)%phi == 1:
    print('OK, остаток от деления (d_new*e)/phi равен 1')
else:
    print('WARNING!!! остаток от деления (d_new*e)/phi не равен 1')
Заинтересовало формирование закрытой экспоненты d.
Попробовал сформировать ее самостоятельно из остальных заданных параметров p, q, e по известным формулам.
Но периодически (от раза к разу) при запуске скрипта gen_rsa.py получается так, что d, сформированное функцией RSA.generate() и моей функцией mod_inverse() не совпадают! (Самописная функция использовалась, поскольку pow с отрицательной степенью не работает в питон 3.7, но это не суть). Более того, проверка делением (d*e)/((p-1)(q-1)) не дает остаток 1 (как должно было быть) для d, сформированной функцией RSA.generate().
Во вложении прикладываю 3 файла с выдачей из скрипта.

Для проверки формирования закрытого и открытого ключей по заданным параметрам p, q, e, d написан скрипт gen_keys.py.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from Crypto.PublicKey import RSA
 
p = xxx
q = xxx
e = 65537
d = xxx
n = p*q
 
rsa_key = RSA.construct((n, e, d), consistency_check=True)
 
with open('private.pem', 'wb') as priv:
    priv.write(rsa_key.export_key())
with open('public.pem', 'wb') as pub:
    pub.write(rsa_key.publickey().export_key())
И вот что интересно, при попытке сформировать ключи из полученных параметров p, q, e, d функцией RSA.construct() при обоих значениях d получаются корректные приватные ключи! Т.е. на один открытый ключ удается сформировать два закрытых.
По идее RSA.construct() с параметром consistency_check=True не должна пропускать невалидные данные для формирования ключей, должна быть ошибка по типу "ValueError: Unable to compute factors p and q from exponent d", "ValueError: Invalid RSA private exponent".
Также в приложенных файлах выкладываю эти 3 набора ключей.

Проверка ключей показала, что данные, зашифрованные публичным ключом одинаково корректно разшифровываются ОБОИМИ приватными ключами (скрипт для проверки check_keys.py)
Python
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
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
 
public_key = 'public_sample1.pem'
private_key1 = 'private_sample1.pem'
private_key2 = 'private_sample1_new.pem'
 
public_rsa = RSA.import_key(open(public_key).read())
private_rsa1 = RSA.import_key(open(private_key1).read())
private_rsa2 = RSA.import_key(open(private_key2).read())
 
message1 = b'My Message 1234567890!!!'
print(message1)
 
# шифруем открытым ключом RSA
chips_rsa1 = PKCS1_OAEP.new(public_rsa)
enc_message = chips_rsa1.encrypt(message1)
#print(enc_message)
 
chips_rsa2 = PKCS1_OAEP.new(private_rsa1)
message2 = chips_rsa2.decrypt(enc_message)
print(message2)
 
chips_rsa2 = PKCS1_OAEP.new(private_rsa2)
message2 = chips_rsa2.decrypt(enc_message)
print(message2)
Как это может быть, как это согласуется с фразой: "В алгоритмах с открытым ключом, таких как RSA, на каждый открытый ключ приходится ровно один закрытый ключ, и наоборот"?

Есть подозрения, что числа p и q не простые, но проверить точно не знаю как. Функция isprime() из пакета sympy говорит, что они простые, но как я понимаю, это с какой-то вероятностью только.
Есть какие то варианты, что это такое?
Вложения
Тип файла: zip sample.zip (15.1 Кб, 4 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.02.2026, 14:06
Ответы с готовыми решениями:

Недопонимание в приватных ключах RSA/ECB/Padding1
Вот что моя программка, считывающая ключи RSA/ECB/PKCS1Padding, дала мне: Это приватный ключ...

RSA алгоритм. Закрытый ключ больше или меньше открытого ключа?
Товарищи, ответьте пожалуйста на вопрос. Закрытый ключ больше или меньше открытого ключа? В...

Декрипт приватного ключа RSA
Здравствуйте. Имеется приватный ключ RSA обёрнутый passphrase (который тоже известен). Как...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2026, 14:06
Помогаю со студенческими работами здесь

Что такое длина ключа? Связана ли длина ключа с алгоритмом шифрования?
Здравствуйте уважаемые участники форума! Сразу извините за не информативное название темы, форум...

Расшифровать текст без ключа, длина ключа 4
ОЦЛЛШЬЖЛУНОГЛ_ХЖЪНЮХЪНШЕЪЦУВЬЬНЗСЫПИШНПРЮУЧРС_ЖСНМОГЩНССШЭВАЮУЧРЪЧЖРМАСИЛЬФВОЯМЖРОЖНМШЖПМСФЛЮНЦУФ_ЕЖ...

Как исключить подмену публичного ключа при проверке цифровой подписи
Предположим, что Алиса генерирует пару ключей и с помощью закрытого ключа производит цифровую...

Как защитить приватный ключ?
Всем доброго времени суток! Есть класс RSACryptoServiceProvider, у него есть методы экспорта...

Безопасно ли использовать приватный ключ в качестве пароля для шифрования?
Прошу подсказать спецов по криптографии. Суть вопроса. Я делаю систему на основе web cryptography...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru