Рейтинг:1

Как генерируются ключи, используемые в криптографии?

флаг ng

Кажется, в криптографии везде есть ключи. От таких вещей, как HMAC, до шифрования (как асимметричного, так и симметричного).

Теперь я не совсем понимаю, как генерируются криптографические ключи? Я знаю, что они должны быть случайными, но все ли это необходимые свойства?

Отличается ли метод генерации в зависимости от варианта использования? Например, отличается ли метод генерации ключей, используемых в HMAC, по сравнению с ключами, используемыми как часть подписи?

Погуглив, я наткнулся на пару терминов, связанных с ключами и случайными числами. Например, PRNG, RNG, HKDF, VRF, PRP, PRF и т. д.

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

kelalaka avatar
флаг in
Ключевое слово — они должны быть выбраны в «равномерном случайном порядке». Увы, слишком широко и не имеет простого ответа; [Какие проблемы возникают при использовании Linux /dev/urandom для генерации криптографических ключей?](https://crypto.stackexchange.com/q/85533/18298). Я предлагаю вам поискать на нашем сайте и сконцентрироваться по одному.
kelalaka avatar
флаг in
Я искал [генерация ключей] (https://crypto.stackexchange.com/search?q=key+generation), и у нас есть 1551 результат.
Рейтинг:4
флаг ng

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

В некоторых криптосистемах, в том числе в большинстве симметричных, набор действительных ключей представляет собой просто набор битовых строк размером с ключ, например 192-битный для AES-192.

В асимметричной криптографии все сложнее. Одна из причин заключается в том, что он сгенерировал пару ключей, состоящую из секретного закрытого ключа и соответствующего открытого ключа. Другая причина заключается в том, что обычно существуют некоторые математические ограничения. Например, в относительно простом случае ЭЦДСА, допустимый закрытый ключ в виде целого числа $д$ в диапазоне $[1,n-1]$ куда $n$ это порядок генератора $G$ группы эллиптических кривых, и соответствующий открытый ключ затем получается как точка эллиптической кривой $Q:=d\,G$. С RSA все сложнее.

Когда ключевой домен определен, остается объяснить, как он генерирует равномерно случайный ключ. Самым простым является честное подбрасывание монеты, которое повторяется по мере необходимости (например, 192 раза для AES-192). Если нам нужно сгенерировать целое число в диапазоне $[а,б]$, существуют различные способы сделать это, начиная с честного подбрасывания монеты. Самое простое - создать $\left\lceil\log_2(b-a+1)\right\rceil$ биты подбрасыванием честной монеты, собрать биты в целое число $х$ согласно соглашению о двоичном порядке с обратным порядком байтов, вычислить $у=а+х$, используйте это, если $y\leb$, в противном случае повторите процедуру.

Этот метод можно автоматизировать с помощью криптографически стойкого генератора случайных чисел, такого как /dev/urandom в большинстве разновидностей Unix.

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

Рейтинг:1
флаг cn

Я знаю, что они должны быть случайными

Ну типа. Точнее, они должны быть неотличимый от случайного.

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

Случайные значения могут генерироваться с помощью различных непредсказуемых физических процессов. Устройство, реализующее такой процесс, называется аппаратный или «настоящий» генератор случайных чисел (HRNG или TRNG). Почти все современные смартфоны и ПК, а также растущее число встроенных устройств включают HRNG.

После того, как система была «засеяна» истинным случайным значением, она может использовать детерминистический расчет, называемый криптографически безопасный генератор псевдослучайных чисел (CSPRNG) (для краткости генератор псевдослучайных чисел) для генерации практически бесконечного потока случайных значений. Эти значения являются случайными в том смысле, что противник с конечной вычислительной мощностью не может отличить их от «настоящих» случайных значений. В криптографическом контексте генератор случайных чисел (RNG) — это CSPRNG, посеянный HRNG.

это все необходимые свойства?

Каждый ключ должен быть неотличим от случайного с точки зрения потенциальных противников. Это может означать, что ключ генерируется случайным образом (как объяснялось выше). Но не все ключи генерируются случайным образом: некоторые ключи рассчитываются детерминировано из комбинации ключей и других входных данных. Такие процессы называются вывод ключа. HKDF является примером функции вывода ключа. Псевдослучайная функция (PRF) может быть строительным блоком для KDF. Например, когда два компьютера обмениваются данными по зашифрованному каналу, они обычно получают одни и те же ключи из общего секрета.

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

Как правило, симметричное шифрование использует ключи, которые представляют собой просто массив байтов, и, таким образом, генерирует $n$-битный ключ просто означает генерацию $n$ случайные биты и называя это ключом. Это относится, например, к блочным шифрам, таким как AES и Camellia, к потоковым шифрам, таким как Chacha20, к алгоритмам MAC, таким как HMAC и Poly1305, и т. д.

В классическом асимметричном шифровании используются ключи, представляющие собой числа с определенными свойствами, поэтому для создания таких ключей могут потребоваться дополнительные вычисления. Общий способ генерации ключа, который может быть представлен $n$-битовая строка для генерации $n$ случайные биты, проверьте, представляет ли это действительный ключ, и если нет, попробуйте еще раз. (Это предполагает, что представление уникально, т. е. не существует двух одинаковых ключей с одинаковым представлением.) Этот подход хорошо работает для типичных ЕСС ключи, где закрытый ключ — это число между $1$ и $2^n - $ с $а \ll 2^n$, поэтому он хорошо работает для создания случайного $n$-битовая строка и интерпретировать ее как число между $0$ и $2^n-1$ и попробуйте еще раз, если вы нажмете одно из нескольких недопустимых значений. Некоторые другие криптосистемы, такие как ЮАР, включают в себя гораздо более сложные процессы генерации ключей, но даже в этом случае в качестве строительных блоков используются «сгенерировать случайную битовую строку» и «попробовать еще раз, если значение не подходит».

Рейтинг:-2
флаг cn

Кажется, в криптографии везде есть ключи.

Так и кажется. У меня их так много, что я наклеиваю их на стикеры, они прилипают к моим мониторам.

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

Зачем тебе столько ключей? Хороший вопрос. И есть три причины:

  1. Очевидно, что если вам нужно получить доступ к нескольким службам, вам понадобится несколько паролей/ключей. У ИТ-специалистов обычно есть сотни паролей/ключей. Обычно вы выбираете пароли из своего жизненного опыта. Так что имя моей игуаны фигурирует в большинстве из них (Тревор). Электронные таблицы полезны для управления этим.

  2. Вы не доверяете правительству, что обычная криптография не была взломана полиномиальное время. Возможно, вы захотите менять ключи каждые 15 минут. Удивительно, но это всего ~0,1 бит/с энтропии, которую легко сгенерировать с минимальными ресурсами.

  3. Вы не доверяете правительству, что обычная криптография не была взломана полиномиальное время. И поэтому (как это делают дипломатические службы [почему?]) вы используете одноразовый блокнотс. Для этого требуется действительно случайный ключевой символ для каждого отправляемого вами символа открытого текста. Это статистически ничем не отличается от пункта 2.

они больше, чем просто случайные числа?

Нет. Это просто случайные числа с равномерным распределением. Но есть понятие Колгоморовская сложность. Это означает, что источник чисел не является детерминированным. Он универсально уникален. Опять же, легко достигается, но требует некоторого размышления. \dev\urandom является детерминированным, поэтому его нельзя использовать для пункта 3.


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

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

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