Может ли открытый ключ иметь длину (шифрование), отличную от закрытого ключа?

У меня есть закрытый ключ размером 1024 бита, и я использую его для создания открытого ключа. Означает ли это автоматически, что мой открытый ключ также имеет шифрование 1024? Или может быть меньшего размера шифрования? (512, 256 ...)

PS: Что меня больше всего интересует и о чем я говорю, так это размер модуля («n») в ключах RSA. Размер обычно составляет 1024 или 2048 бит. Но я рад видеть, что это вызвало дискуссию, и все это подогревает мой интерес к криптографии.


person Rolf    schedule 13.10.2013    source источник
comment
Мне сложно выбрать, какой ответ принять. Ответ Бена был первым, он был прямым (и правильным), но сначала мне нужно было услышать какое-то подтверждение, предоставленное позже CodesInChaos в довольно информативном ответе. Хотел бы я выбрать оба, так как оба ответа на мой взгляд дополняют друг друга.   -  person Rolf    schedule 18.10.2013


Ответы (5)


Нет. Открытый ключ в паре ключей всегда соответствует размеру закрытого ключа, фактически он является производным от закрытого ключа.

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

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

Единственное изменение размеров ключей, которое вы увидите, - это когда асимметричное шифрование используется в сочетании с симметричным шифрованием. Симметричное шифрование (сеансовый ключ) будет меньше, но оно использует совершенно другие алгоритмы (например, AES, TWOFISH и т. Д.) И не является частью открытого ключа (за исключением OpenPGP, где параметры симметричного шифрования могут быть сохранены, потому что это не так. использовать активное соединение для установления симметрично зашифрованной связи и обмена данными сеансового ключа).

РЕДАКТИРОВАТЬ: Более подробная информация о взаимосвязи между данными открытого и закрытого ключей (также известная как доказательство того, что Дэвид ошибается)

Указание на RSA - это все очень хорошо, но это зависит от протокола обмена ключами, и для этого мы переходим на обмен ключами Диффи-Хеллмана и оригинальный патент, который срок действия истек. В обоих есть примеры и объяснения методов обмена ключами и взаимосвязи между открытым и закрытым ключами.

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

Описания генерации ключей для RSA и Эль-Гамаля объясняют общие данные между открытым и закрытым ключами и, в частности, то, что все компоненты открытого ключа являются частью закрытого ключа, но закрытый ключ содержит дополнительные данные, необходимые для дешифрования данных. и / или подписать данные. В Эль-Гамале общедоступными компонентами являются G, q, g и h, а частными компонентами - G, q, g, h и x.

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

static int
do_create( int algo, unsigned int nbits, KBNODE pub_root, KBNODE sec_root,
           DEK *dek, STRING2KEY *s2k, PKT_secret_key **sk, u32 timestamp,
       u32 expiredate, int is_subkey )
{
  int rc=0;

  if( !opt.batch )
    tty_printf(_(
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
"generator a better chance to gain enough entropy.\n") );

  if( algo == PUBKEY_ALGO_ELGAMAL_E )
    rc = gen_elg(algo, nbits, pub_root, sec_root, dek, s2k, sk, timestamp,
         expiredate, is_subkey);
  else if( algo == PUBKEY_ALGO_DSA )
    rc = gen_dsa(nbits, pub_root, sec_root, dek, s2k, sk, timestamp,
         expiredate, is_subkey);
  else if( algo == PUBKEY_ALGO_RSA )
    rc = gen_rsa(algo, nbits, pub_root, sec_root, dek, s2k, sk, timestamp,
         expiredate, is_subkey);
  else
    BUG();

  return rc;
}

Небольшие различия между этими тремя алгоритмами относятся к значениям для элементов, упомянутых в опубликованных алгоритмах, но в каждом случае «nbits» является константой.

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

person Ben    schedule 13.10.2013
comment
Спасибо (бла-бла-бла, спасибо stackoverflow, надеюсь, этого достаточно, чтобы я мог поблагодарить Бена за его доброту) - person Rolf; 13.10.2013
comment
Не проблема. Если вы довольны ответом, не стесняйтесь его принимать. :) - person Ben; 13.10.2013
comment
С уважением, вы заявили, что это невозможно, не показали и не доказали, что это невозможно. Я предоставил алгоритм генерации пар ключей, вы - нет. Обычные реализации используют ключи одинакового размера, что не означает, что это невозможно. Алгоритм генерации ключей использует абстрактную целочисленную математику, биты вообще не упоминаются, за исключением конкретных компьютерных реализаций. - person David Cummins; 13.10.2013
comment
Да неужели? Вы хотите привести этот аргумент. Вы понимаете, что размер в битах - это часть данных, которые рассчитываются для генерации закрытого ключа, верно? Что ж, вы хотели больше подробностей, вы их понимаете. Вместе с вызовом. Я очень надеюсь, что вы хотя бы попытаетесь принять это. - person Ben; 13.10.2013
comment
Бен: вы и Дэвид на самом деле говорите о разных определениях размера ключа. Это возможно, потому что размер ключа неоднозначен в контексте RSA. Дэвид говорит о размерах простых чисел, вы говорите о другом. Никто не знает, о чем говорит ОП. - person President James K. Polk; 13.10.2013
comment
Хех. Подождите ... вы говорите, что мы с Дэвидом ошибаемся и правы? Блестяще! :) Это делает его еще более интересным (и информативным, может быть и то, и другое). Мне будет любопытно посмотреть, вернется ли Рольф и прояснит ли тогда, что он имел в виду под размером бит. - person Ben; 13.10.2013
comment
Ваш ответ немного сбивает с толку, поэтому я не могу сказать, правы вы или нет. По крайней мере, для Диффи-Хеллмана мы часто используем закрытые ключи намного меньшего размера, чем открытый ключ. Сначала вы исправляете параметры группы, например используя 2048-битный модуль. Некоторые считают эти параметры частью открытого ключа, некоторые исправляют их как часть протокола. Затем вы выбираете закрытый ключ x, который может быть 256-битным числом. Затем вы вычисляете открытый ключ как Y = G^x, который представляет собой 2048-битное число. Выбор закрытого ключа определяет открытый ключ, но открытый ключ может быть больше. - person CodesInChaos; 13.10.2013
comment
Что ж, я уже какое-то время страдаю бессонницей, так что вполне возможно, что предложения убежали от меня где-то посередине. Однако я знаю, к чему стремился, поэтому проверю ответ после того, как высплюсь, и посмотрю, смогу ли я его уточнить, или я слишком сильно отклонился от темы. - person Ben; 13.10.2013
comment
Спасибо за другие комментарии. Я оставил его на несколько дней, потому что он немного нагрелся, и у меня не было никаких амбиций ни увидеть съеденную шляпу, ни работать, чтобы опровергнуть кого-то до конца своей / их жизни. Я думал поработать над внедрением такой системы, как я описал, но у меня нет времени. Надеюсь, мои правки, приведенные ниже, прояснят мою точку зрения, возможно, разница не так велика, как мы думали. - person David Cummins; 16.10.2013
comment
Да, я оставил его почти по той же причине, и я удалил часть, поедающую шляпу, потому что, честно говоря, это было просто смешно (и я не хочу покупать шляпу: P). Особенно после того, как GregS указал, что каждый из нас использовал разные определения размера ключа (см. Также: размер имеет значение, но это не то, что мы думаем, и если криптограф говорит, что ваш ключ имеет «хороший размер», он / она думает, что он маленький) . - person Ben; 17.10.2013

Это зависит от алгоритма шифрования и от того, что именно вы называете открытым / закрытым ключом. Иногда можно использовать другой размер ОЗУ по сравнению с сериализацией на диске или в сети.

ЮАР

Открытый ключ RSA состоит из модуля n и открытого показателя e. Обычно мы выбираем маленькое значение для e (обычно 3 или 65537). Размер e мало влияет на безопасность. Поскольку e обычно меньше четырех байтов и n больше сотни, в общем размере преобладает модуль. Если вы действительно хотите, вы можете исправить e как часть спецификации вашего протокола, чтобы сохранить только n.

Закрытый ключ RSA может быть представлен в разных формах, но обычно мы храним значения p, q, dp, dq, e, d, n, InvQ. Их общий размер больше открытого ключа. Большинство из них не является строго обязательным, но их удобно иметь в наличии, а не восстанавливать. Регенерировать все из них с учетом e, p и q просто.

Когда мы говорим о размере ключа в контексте RSA, мы всегда имеем в виду размер модуля, игнорируя все остальные элементы. Это полезное соглашение, поскольку это единственное значение, которое влияет на безопасность. Типичный размер n составляет 2048 бит.

Крипто с конечным полем (Diffie-Hellman, DSA и т. Д.)

Секретный ключ - это скаляр, в два раза превышающий уровень безопасности. Типичное значение - 256 бит.

Открытый ключ - это групповой элемент, который намного больше, чем закрытый ключ. Типичное значение - 2048 бит.

Таким образом, с криптографией с конечным полем открытый ключ намного больше, чем закрытый ключ.

Эллиптические кривые

Секретный ключ - это скаляр, в два раза превышающий уровень безопасности. Типичное значение - 256 бит. Эта часть идентична криптографии с конечным полем.

Открытый ключ - это групповой элемент. Есть две формы сериализации такого элемента. Сжатая форма немного больше закрытого ключа (максимум пара бит). Несжатая форма примерно в два раза больше закрытого ключа. Типичное значение для сжатой формы - 256 бит и 512 бит для несжатой формы.

Закрытый ключ как семя

Когда вы сами генерируете пары открытого и закрытого ключей, вы всегда можете сохранить их как начальные числа для ГПСЧ. Таким образом, они довольно маленькие, 160 бит или около того, независимо от используемой вами схемы. Обратной стороной этого является то, что восстановление естественной формы закрытого ключа может быть дорогостоящим. Требуется, чтобы метод создания пары ключей оставался неизменным.

Отпечаток открытого ключа

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

Резюме

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

person CodesInChaos    schedule 13.10.2013
comment
Да, я имел в виду размер модуля ключей RSA n, должны ли они быть одинакового размера в закрытом и открытом ключах или они могут отличаться? Спасибо за разоблачение :) - person Rolf; 13.10.2013
comment
@Rolf Поля e и n закрытого ключа идентичны общему ключу. Это одни и те же числа, а не одного размера. Если вы возьмете полный закрытый ключ со всеми упомянутыми мною полями и удалите все, кроме e и n, вы получите открытый ключ. - person CodesInChaos; 13.10.2013

Я искал из разных источников и пришел к выводу, что модуль (n = p * q), используемый для генерации ключа RSA, одинаков для открытого и закрытого ключей. Модуль определяет длину ключа для обоих.

person Jorge Caceres    schedule 20.01.2015

Для RSA ваш открытый ключ может иметь размер всего 2 бита. То есть цифра 3 может быть вашим открытым ключом. Популярный выбор для открытого ключа RSA - 17.

person Vlad Krasnov    schedule 13.10.2013
comment
Обычно мы называем размер модульного ключа размером, а не размером публичной экспоненты. - person CodesInChaos; 13.10.2013
comment
Я согласен, но ясно, что в этом контексте он спрашивал не о том, где можно использовать разные модули для открытых и закрытых ключей, а скорее экспоненты. - person Vlad Krasnov; 14.10.2013
comment
Вопрос неоднозначный, но я не понимаю, что это касается экспонентов. - person CodesInChaos; 14.10.2013

Насколько я понимаю, необязательно, чтобы оба ключа были одинакового размера. Ниже описано, как сгенерировать ключи:
http://en.wikipedia.org/wiki/RSA_algorithm#Key_generation

Однако я считаю, что если один ключ (или фактор модуля) будет значительно меньше, это ослабит защиту от криптоанализа.

Редактировать:

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

Чтобы прояснить свою точку зрения, я просто говорю, что если e ‹* d (или d ‹< e), вы можете распределить ключи по разным размерам. Они будут генерироваться с помощью одного и того же алгоритма с использованием той же математики размера бит (например, 256 бит), и аналогичным образом для шифрования и дешифрования потребуется одинаковое количество бит. Если вы посмотрите (ради аргумента) на числа 1 и 128, у вас будет целый ряд вариантов их представления. Оба они могут быть 8-битными, или 1 может быть представлен любым числом битов от 1 до 7 бит. Это можно считать дешевым трюком, если только ваш метод генерации ключей не гарантирует, что величины d и e будут значительно различаться предсказуемым образом. Однако, как уже говорилось, я не вижу в этом особого смысла.

person David Cummins    schedule 13.10.2013
comment
Нет, см. Мой ответ, почему это не так (и не может быть). - person Ben; 13.10.2013