Рейтинг:0

Как SSH генерирует ключи для алгоритма RSA?

флаг nz

Насколько я понял, суть алгоритма RSA состоит в том, чтобы иметь 2 (больших) простых числа «p» и «q», так что «n=pq». Тогда «n» — это открытый ключ, а «p» — закрытый. Безопасность исходит из того факта, что при заданном "n" нелегко получить "p" и "q", в то время как тривиально проверить, что "p" действительно разлагается на множители. н.

Мой вопрос: как SSH получает эти числа менее чем за секунду? Есть ли у него «библиотека простых чисел»? Как убедиться, что ваши «p» и «q» уникальны для вас? Существует ли так много «больших простых чисел», которые удовлетворяют требованиям алгоритма без очевидных коллизий?

kelalaka avatar
флаг in
https://github.com/openssl/openssl/blob/4cedf30e995f9789cf6bb103e248d33285a84067/crypto/bn/bn_prime.c
kelalaka avatar
флаг in
Для столкновения [Профф Линделл дал стандартный ответ здесь] (https://crypto.stackexchange.com/a/76766/18298)
Рейтинг:3
флаг mu
Dan

Допустим, вы хотите, чтобы «n» было 2048 бит (RSA 2048). Тогда «p» и «q» будут равны 1024 битам.

Компьютер генерирует случайное 1024-битное число (почти мгновенно) и проверяет его на простоту. Существуют различные виды тесты на простоту, большинство из них статистические. Они очень быстрые (я знаю, что это не поддается количественной оценке, но я работаю на встроенных микроконтроллерах, работающих на частоте 100 МГц без кэша, поэтому я понятия не имею о скорости на рабочем столе).

Таким образом, сгенерировав кучу 1024-битных чисел, вы, наконец, наткнетесь на то, которое проходит несколько итераций тестов на простоту. (не вдаваясь здесь в подробности о статистике и о том, что "достаточно хорошо", это все достаточно легко найти). Сделайте то же самое, чтобы получить свой «q», умножьте их, у вас есть модуль «n». «n» плюс ваш «e» (вероятно, 65537) — ваш открытый ключ.

Как вы понимаете, плотность простых чисел уменьшается по мере увеличения чисел; есть способы оценка простой плотности в зависимости от размера простого числа, которое вы пытаетесь сгенерировать. 40% чисел до 10 являются простыми, но только 25% плотности для чисел до 100 и еще меньше для 1024-битных чисел. Если я правильно помню, в среднем, вам придется попробовать цикл проверки генерации/простоты примерно 360 раз, чтобы найти 1024-битное число, которое проверяется как простое. Это не тысячи и не миллионы. А для 512-битных чисел это, вероятно, менее 100 попыток.

Поскольку числовое пространство 2^1024 такой огромный, маловероятно, что ваши p&q совпадут с чьими-либо еще. На самом деле каждая из этих 1024-битных строк, вероятно, никогда не существовала ни на одном компьютере в истории Земли.

Надеюсь, это дало вам достаточное представление о том, как это работает. Это в основном так просто. Я опустил некоторые детали, обсуждение сильных простых чисел и т. д., потому что они затрагивают детали, выходящие за рамки вашего вопроса.

kelalaka avatar
флаг in
Во-первых, это: [GCD наносит ответный удар RSA в 2019 году - хорошая случайность - единственное решение?] (https://crypto.stackexchange.com/q/76757/18298), а во-вторых, OP спрашивает ssh, ваш ответ является общим , не предоставляет подробности в ssh!
флаг mu
Dan
Хорошие моменты. Но что касается первого, о генерации ключей можно сказать гораздо больше, и вы можете спуститься в кроличью нору, но я попытался ответить на то, что я считал сутью вопроса ОП. И я просмотрел много кода генерации ключей RSA во многих стеках TLS, все они были очень похожи, у меня нет никаких оснований полагать, что реализация SSH сделает это по-другому. У вас есть информация об обратном?
kelalaka avatar
флаг in
например, обычная практика сначала выбирает $e$, затем выбирает простое число, и если $\gcd(\lambda(pq),e) \neq 1$, то выбираются новые простые числа. какой-то старый q [1] (https://crypto.stackexchange.com/a/27294/18298)
Pythonist avatar
флаг nz
Спасибо, это именно тот уровень детализации, который я искал. Мне придется поискать эти тесты на простоту... Я нахожу крайне нелогичным, что так легко находить случайные простые числа. Я бы предположил, что шанс найти простое число путем генерации случайных чисел размером 1024 почти равен нулю. Требование примерно 360 попыток поражает меня.Кроме того, меня совершенно озадачивает, что можно так дешево проверить простоту, в то время как нахождение множителей числа практически невозможно. Здесь происходят действительно нелогичные вещи!
kelalaka avatar
флаг in
Поскольку они используют OpenSSL https://github.com/openssl/openssl/blob/4cedf30e995f9789cf6bb103e248d33285a84067/crypto/bn/bn_prime.c
Swashbuckler avatar
флаг mc
Какой SSH? OpenSSH? Замазка? АОЧ? Парамико? Или любой из десятков других?

Ответить или комментировать

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