2009-03-30 8 views
38

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

[EDIT]

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

ответ

29

Это зависит от системы криптографической.

В RSA мы (со ссылкой на Википедию):

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

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

Для Эллиптическая кривая Diffie-Hellman, закрытый ключ d, а открытый ключ dG (с G также публичный), так что это тоже тривиально.

+1

В RSA, если мы знаем d и n, мы можем вычислить p и q такие, что pq = n. При этом d и e являются инверсиями друг друга по модулю (p-1) (q-1). –

+3

@Henno Bransma: Как вы вычисляете «p и q такие, что pq = n»? – sleske

+1

@HennoBrandsma Знание * d * не поможет вам фактор * n *, не более, чем знание * e *. – erickson

-2

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

+6

Можете ли вы это объяснить? – Hut8

1

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

+0

Является ли (ваш ответ) применимым к RSA в целом или специфичным для реализации Microsoft CryptoAPI (и как он сериализует ключ в/из XML)? – Hemant

+1

На самом деле это тоже не так - они оба являются продуктами сложных вычислений. – AviD

+2

Вопрос был изначально задан в принципе, поэтому ответ в принципе. Я не знаю внутренности .NET-шифрования, однако закрытые ключи могут хранить исходные p и q. Следует предположить, что открытый ключ выводится из закрытого ключа. – AnthonyWJones

3

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

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

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

+4

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

7

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

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

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

33

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

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

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

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

  • теоретического закрытого ключа пар (d, п) которая разделяет совершенное симметричное (математическое) отношение остроумия h (e, n). Если вы их сравниваете, невозможно вычислить с другого.
  • Практический закрытый ключ (как, например, в реализации openssl), относится к файлу, содержащему (d, n), но также и к нескольким важным промежуточным значениям для цели скорости декодирования. В дополнение к этому теоретически «неизвестная» часть открытого ключа e часто привязывается к общим значениям по соглашению (который по умолчанию равен 0x10001 в openssl и хотя он может быть изменен, настоятельно рекомендуется придерживаться только very specific values). Поэтому вывод открытого ключа (e, n) из закрытого ключа тривиально по нескольким причинам.
+1

В PKCS # 8 вы получаете не только значения для выполнения расчетов по теореме китайской остаточной теории (CRT), но и общедоступный показатель. Поэтому для открытых ключей OpenSSL вам не нужно ничего выводить. Если вы не хотите указывать экспонента открытого ключа во время генерации пары ключей, тогда 'openssl' определяет аргумент' -f4' для использования четвертого числа Fermat, которое действительно 0x010001 (простое число с двумя битами, установленными в 1 по соображениям эффективности, поскольку его легко умножить со значением 0) –

+1

Re 'openssl': библиотека уже давно поддерживает любой разумный pubexpt. Традиционная команда 'genrsa' выполняет по умолчанию' -f4' = 65537, а также поддерживает '-3' = 3 (см. Crypto.SX для нескольких Qs о том, является ли e = 3 хорошим, плохим или уродливым); начиная с версии 1.0.0 в 2010 году, командной строки 'genpkey -algorithm RSA -pkeyopt rsa_keygen_pubexp: $ value' поддерживает любое разумное значение. –

2

Для конкретного случая OpenSSH и ssh-keygen, да вы можете:

SSH-серийник -y

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


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

0

открытый ключ модуль N (и открытый показатель степени е, обычно 65537), закрытый ключ задается двух простых чисел P, Q (и частным показателем д, а иногда и CRT части d_p, d_q для ускорения) по существу, вам имеют N = pq и e d = 1 mod ((p-1) (q-1)), вы также можете вычислить d_p и d_q, используя CRT , данный закрытый ключ, вычисление модуля открытого ключа является «скучным» умножением и публичный экспонент находится в спецификации или вычисляется с использованием расширенного алгоритма евклида, если стандартный e не был достаточно хорош. , данный открытый ключ, для вычисления частного ключа требуется либо поиск d (проблема RSA), либо p, q (факторинг, см. Полевое поле для лучшего алгоритма для этого). Показано, что эти проблемы эквивалентны в разумных условиях [Разрыв RSA в целом эквивалентен факторингу, D. Aggarwal и U. Maurer, 2008]

0

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

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

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

Смежные вопросы