Я знаю, что они должны быть случайными
Ну типа. Точнее, они должны быть неотличимый от случайного.
Цель при выборе ключа состоит в том, чтобы противник («плохой парень») не смог найти ключ. Поскольку противник может знать, как работает наша система (Принцип Керкхоффса), нам нужно найти способ генерировать ключи, которые не зависят только от детерминированных вычислений (которые злоумышленник может воспроизвести). Следовательно, все ключи должны зависеть от чего-то, чего противник не знает. Такая вещь называется «истинным» случайным значением.
Случайные значения могут генерироваться с помощью различных непредсказуемых физических процессов. Устройство, реализующее такой процесс, называется аппаратный или «настоящий» генератор случайных чисел (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$ и попробуйте еще раз, если вы нажмете одно из нескольких недопустимых значений. Некоторые другие криптосистемы, такие как ЮАР, включают в себя гораздо более сложные процессы генерации ключей, но даже в этом случае в качестве строительных блоков используются «сгенерировать случайную битовую строку» и «попробовать еще раз, если значение не подходит».