Имея закрытый ключ, можно ли получить его открытый ключ?

StackOverflow https://stackoverflow.com/questions/696472

Вопрос

Из того немногого, что я понимаю, читая различные материалы, пара открытого и закрытого ключей является основой асимметричного шифрования, а также кое-что о выборе двух простых чисел (что примерно является вашим закрытым ключом) и их умножении (что примерно является вашим открытым ключом), я Похоже, что можно сгенерировать открытый ключ, если вы знаете закрытый ключ.Это правильно или я что-то путаю?

[РЕДАКТИРОВАТЬ]

Еще больше меня смутило то, что невозможно сериализовать ключ RSA в XML с помощью только закрытый ключ (с использованием класса .NET RSACryptoServiceProvider).Не уверен, является ли это ограничение намеренным или нет!

Это было полезно?

Решение

Это зависит от криптосистемы.

В ЮАР, имеем (цитата из Википедии):

Открытый ключ состоит из модуля n и публичного (или шифрования) показателя e.Частный ключ состоит из модуля N и частного (или дешифрования) показателя D, который должен храниться в секрете.

Теперь, если у нас есть n и d (закрытый ключ), нам не хватает только e для открытого ключа.Но e часто довольно мало (менее трех цифр) или даже фиксировано (обычное значение — 65537).В этих случаях получить открытый ключ тривиально.

Для Эллиптическая кривая Диффи-Хеллмана, закрытый ключ — d, а открытый ключ — dG (G также является открытым), так что это тоже тривиально.

Другие советы

В большинстве реализаций асимметричных криптосистем гарантируется только то, что вы не сможете найти закрытый ключ из открытого ключа.И наоборот, найти открытый ключ из закрытого ключа в большинстве случаев тривиально.

Например, в RSA вы можете создать открытый ключ из закрытого ключа с помощью:

openssl rsa -in private.pem -pubout -out public.pem

Что вводит в заблуждение, так это терминология:«закрытый ключ» относится к двум различным концепциям, говорите ли вы о теории или говорите о практической реализации:

  • А теоретический закрытый ключ — это пара (д, н) который имеет совершенно симметричное (математическое) отношение с (е, н).Если вы их сравниваете, одно невозможно вычислить из другого.
  • А практичный закрытый ключ (например, как в реализации openssl) относится к файлу, содержащему (д, н) но также несколько важных промежуточных значений для целей скорости декодирования.Кроме того, теоретически «неизвестная» часть открытого ключа е часто фиксируется к общим значениям по соглашению (что 0x10001 по умолчанию в openssl, и хотя его можно изменить, настоятельно рекомендуется придерживаться только очень специфические ценности).Итак, выводим открытый ключ (е, н) из закрытого ключа тривиально по нескольким причинам.

Это зависит от алгоритма и того, что вы подразумеваете под «закрытым ключом».

Закрытые ключи RSA часто хранятся в форме «Китайской теоремы об остатках».Например, RSAPrivateKey Структура, определенная в PKCS #1 и повторно используемая во многих других криптографических стандартах, принимает эту форму.Эта форма включает в себя два секретных числа, часто обозначаемых p и q, из которого вычисляется тотент.При использовании totient и частного показателя быстро вычисляется публичный показатель.

В любом случае, большинство пар ключей RSA используют 65537 в качестве публичного показателя степени, а модуль всегда передается как часть закрытого ключа.

В ЛЮБОЙ криптосистеме с открытым ключом открытый ключ математически связан с закрытым ключом.Это очень просто.

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

Пойти другим путем невозможно.Имея открытый ключ, нелегко получить закрытый ключ.Вот почему мы можем безопасно делиться открытыми ключами с другими людьми.Если у вас достаточно времени/циклов ЦП, вы можете перебрать его, но, вероятно, проще дождаться математической атаки на ключ.

В конкретном случае OpenSSH и ssh-кейген, Да, ты можешь:

ssh-keygen -y

Эта опция прочитает частный файл формата OpenSSH и выведет открытый ключ на стандартный вывод.


Как правило, это зависит от алгоритма и того, как вы называете закрытый ключ.Однако любая разумная реализация будет включать полную информацию (открытый и закрытый ключи) в секретный файл.

Существует неправильное представление о том, что такое закрытый ключ.Закрытый ключ — это всего лишь пара (d,n), и, учитывая только это, невозможно сгенерировать из нее открытый ключ, если только вы не можете предположить, что открытый показатель равен 65537, что имеет место почти для всех ключей RSA.

Если по какой-либо причине публичный показатель больше, вы не сможете создать открытый ключ из закрытого.

Тем не менее, значение, хранящееся как «закрытый ключ» для файлов pem, является не только закрытым ключом, но также содержит простые множители (среди прочего), и, следовательно, из него легко сгенерировать открытый ключ.

Да, при наличии доступа к закрытому ключу можно сгенерировать открытый ключ.

Общедоступный ключ - это модуль N (и общественный показатель E, обычно 65537), личный ключ определяется двумя простыми primes P, Q (и частным показателем D, иногда также также CRT Parts D_P, D_Q для ускорения), по существу, у вас есть n = pq и ed=1 мод ((p-1)(Q-1)), вы также можете вычислить D_P и D_Q, используя CRT, учитывая закрытый ключ, вычисление модуля открытых ключей является «скучным» умножением, а общедоступный показатель находится в спецификации или вычисляется с использованием расширенного алгоритма Euclid, если стандарт E был недостаточно хорошим.при наличии открытого ключа вычисление закрытого ключа требует либо нахождения d (проблема RSA), либо p,q (факторинг, лучший алгоритм для этого см. в разделе «Сито числового поля»).Показано, что эти проблемы эквивалентны при разумных условиях [Нарушение RSA в целом эквивалентно факторингу, Д.Аггарвал и У.Маурер, 2008]

Теоретически это возможно, но для больших ключей вычислительно невозможно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top