Рейтинг:7

Можем ли мы выбрать, какой ключ является закрытым или открытым в асимметричном шифровании? Действительно ли ключи шифруют и расшифровывают зашифрованный текст?

флаг in

Не могли бы вы помочь мне лучше понять, как работает пара ключей в асимметричном шифровании?

Сначала я изучаю криптографию на поверхностном уровне. Читая множество текстов и разговаривая с коллегами, я до сих пор не уверен в двух вещах.

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

  2. Шифруем или расшифровываем шифротекст с заданным ключом? Это технически правильно так говорить? Или, может быть, это какой-то процесс проверки, а алгоритм - это то, что путает сообщение?

Правильно ли говорить, что:

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

DannyNiu avatar
флаг vu
Я собрал этот вопрос в нашем [списке для чтения] (https://crypto.meta.stackexchange.com/a/1523/36960), надеюсь, вы не возражаете.
Tomasz Nazarenko avatar
флаг in
Чтобы добавить, есть вопрос от Security Stack Exchange, который помог мне получить идеи. Я вставляю ссылку, так как она может оказаться полезной https://security.stackexchange.com/questions/81760/what-happens-when-encrypting-with-private-key
флаг mx
Цитата в конце вопроса лишена какого-либо контекста. Там написано "эта пара ключей", но мы понятия не имеем, о какой паре ключей идет речь. Таким образом, мы никак не можем сказать, является ли сделанное утверждение правильным для любой пары ключей, на которую оно ссылается. Это может быть, а может и не быть. Откуда мы могли знать?
jjj avatar
флаг cn
jjj
Вообще обе клавиши могут быть разной формы (например, с эллиптическими кривыми, точкой и цифрой), поэтому их можно поменять местами. Вероятно, вы ссылаетесь на RSA (где их можно поменять местами), добавьте этот тег к своему вопросу.
Рейтинг:21
флаг vu

Нет нет нет! Вы не можете выбрать, какой ключ является закрытым, а какой общедоступным. Это ложное чувство свободы связано с

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

Например, при использовании дискретного логарифма ваш закрытый ключ всегда представляет собой скалярное целое число, а ваш открытый ключ всегда представляет собой мощность. Шифрование и обмен ключами строятся на основе формулы Диффи-Хеллмана, а цифровая подпись — на ассоциативных и коммутативных свойствах скалярной арифметики.

Существуют и другие криптосистемы с открытым ключом (преимущественно постквантовые), в которых пара ключей шифрования/дешифрования математически несовместима с ключом подписи/проверки криптосистемы, основанной на том же семействе математических примитивов.

fgrieu avatar
флаг ng
Дополнение: даже в RSA, как это практикуется, нет свободы выбора, какой ключ является открытым, а какой закрытым. Обычно один из двух имеет малый показатель степени (часто 65537). Это _должен_ быть открытым ключом. Если бы это был закрытый ключ, другой был бы открытым ключом, то есть открытым, то есть известным злоумышленникам, и вся безопасность была бы потеряна, поскольку было бы тривиально найти оба ключа и факторизовать открытый модуль.
fgrieu avatar
флаг ng
Дополнительное дополнение, касающееся Q2: когда есть открытый и закрытый ключ и используется шифрование, мы шифруем с помощью открытого ключа и расшифровываем с помощью закрытого ключа; нет исключений. Утверждения об обратном могут спутать шифрование и подпись: мы подписываем закрытым ключом и проверяем открытым ключом; тоже не исключение.
флаг cn
@fgrieu Разница в том, что для RSA, как обычно определяется, вы «только» нарушаете безопасность. Для многих других ПКЭ это совершенно разные объекты и их переключение не имело бы даже математического смысла.
fgrieu avatar
флаг ng
@Maeher: действительно! Я подтверждал, что ответ на Q1 отрицательный, и RSA (как это практикуется) не является исключением.
ilkkachu avatar
флаг ws
@fgrieu, но использование 65537 - это просто обычай, верно? Вы можете создать, например. сертификат с произвольным показателем шифрования (`openssl req -x509 -newkey rsa:4096 -pkeyopt rsa_keygen_pubexp:12345653`). Не уверен, что какая-то программа будет хрипеть при этом, или если другие контексты действительно жестко закодируют показатель степени.
fgrieu avatar
флаг ng
@ikkachu: да, вы можете, и большинство современных программ примут сертификат, и это будет безопасно.Но все же перестановка $e$ и $d$ небезопасна, потому что после такой перестановки по-прежнему будет легко найти $d$ (необычное значение $e$) и факторизовать $n$ по открытому ключу. Это работает с необычным $e$ примерно до $n^{0,292\ldots}$ из-за [атаки Боне и Дерфи](https://doi.org/10.1007/3-540-48910-X_1). Кроме того, openSSL просто поместит $e$ в закрытый ключ.
Рейтинг:10
флаг ar

Можем ли мы после создания пары ключей выбрать, какой ключ будет закрытым или открытым?

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

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

На практике, однако, даже генерация ключей RSA не работает таким образом по нескольким причинам:

  • Более эффективно выбрать открытый показатель как фиксированное небольшое число с простой двоичной формой. (Обычный выбор: 3 и 65537 = 2.16 + 1.) Это безопасно для открытого ключа, но, очевидно, было бы катастрофически небезопасным для закрытого ключа (поскольку показатель степени — единственная секретная часть закрытого ключа — модуль одинаков для обеих половин ключа). ключевая пара).

  • Существуют способы ускорить операции с закрытым ключом RSA (например, расшифровку или подписание), используя дополнительные математические приемы, такие как Китайская теорема об остатках, но для этого требуется дополнительная информация о том, как были сгенерированы ключи (например, секретные простые множители модуля). Хранение этой дополнительной информации вместе с закрытым ключом не является проблемой, и наиболее часто используемые форматы закрытого ключа RSA действительно делают это. Но его публикация позволит любому взломать пару ключей и расшифровать и/или подделать сообщения.

Результатом всего этого является то, что на практике можно вычислить открытый ключ RSA из закрытого ключа, но не наоборот. Как говорится в связанном ответе (который я написал) на security.SE, теоретически возможно сгенерировать безопасный закрытый ключ RSA, из которого нельзя вычислить открытый ключ, но для этого потребуется использовать как нестандартный алгоритм генерации ключа, так и нестандартный формат хранения закрытого ключа. И даже если бы проблемы с форматом были решены, не все реализации RSA работали бы с такими приватными ключами (из-за отсутствия упомянутой выше дополнительной информации).


Шифруем или расшифровываем шифротекст с заданным ключом? Это технически правильно так говорить?

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

Основная причина использования таких гибридное шифрование заключается в том, что симметричные шифры, такие как AES, предназначены для быстрого шифрования большого количества данных, а асимметричные системы — нет:

  • Асимметричное шифрование имеет тенденцию быть относительно медленным — часто в десятки, сотни или тысячи раз медленнее, чем шифрование того же объема данных с помощью быстрого симметричного шифра, такого как AES. Асимметричное дешифрование часто даже медленнее (тогда как дешифрование AES обычно так же быстро, как и шифрование).

  • Все схемы безопасного асимметричного шифрования создают зашифрованный текст, который длиннее открытого текста, из-за необходимости внесения некоторой случайности в процесс шифрования для предотвращения атак с угадыванием. Некоторые (например, Эль-Гамаль-подобные схемы) удвоит длину открытого текста (после его заполнения до размера блока сообщения). Другие, такие как RSA, требуют заполнения открытого текста в десятки раз по сравнению с исходной длиной. Очевидно, что это нежелательно при шифровании больших объемов данных. В то же время симметричные шифры, такие как AES, обычно добавляют к зашифрованному тексту всего несколько десятков байтов дополнительных данных независимо от его длины (в зависимости от режима работы).

  • В более общем плане схемы асимметричного шифрования просто не предназначены для шифрования сообщений длиннее нескольких десятков байт или около того (в зависимости от размера ключа и других параметров схемы). Ключ AES подойдет, но не подойдет даже одно сообщение чата — и целая веб-страница, или изображение, или видеопоток. определенно не будет.

    (технически то же самое вроде верно для симметричного блочные шифры как и AES: они тоже шифруют данные порциями по несколько десятков байт, а для шифрования длинных сообщений их нужно использовать с подходящим режим работы который применяет шифр к данным блок за блоком. Но существует множество быстрых и доказуемо безопасных режимов работы блочного шифра, которые большинство криптографических программ и аппаратных средств поддерживает «из коробки», тогда как для схем асимметричного шифрования их практически нет. И если вы попытаетесь спроектировать и реализовать его самостоятельно, скорее всего, он не будет ни эффективным, ни безопасным.)


Правильно ли говорить, что:

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

Нет, не совсем. Закрытый ключ в схеме асимметричного шифрования предназначен для расшифровки, а открытый ключ — для шифрования. Как правило, вы не можете ничего зашифровать с помощью закрытого ключа, так же как вы не можете расшифровать с помощью открытого ключа.

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

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

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

Но если вы готовы все упростить до такой степени, вы могли бы также отметить, что обе Шифрование и дешифрование RSA (а также проверка подписи и подписи) — это просто модульные возведения в степень, так что с тем же успехом можно сказать, что они все то же самое, и что подпись RSA на самом деле просто расшифровка RSA, примененная к специальному зашифрованному тексту. Что также было бы технически верным в некотором роде и, вероятно, не более (или менее) вводящим в заблуждение, чем описание этого как «шифрование с закрытым ключом».

Рейтинг:8
флаг in

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

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

Рейтинг:6
флаг xk

Существующие ответы от DannyNiu и Meir Maor хорошо отвечают на путаницу в отношении взаимозаменяемости закрытых и открытых ключей. Но также стоит, я думаю, обратиться к этому фрагменту из вопроса:

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

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

  1. Я публикую свой открытый ключ и храню свой секретный ключ в секрете.
  2. Вы решили отправить мне сообщение. Вы используете мой открытый ключ для шифрования вашего сообщения; Вы отправляете мне зашифрованное сообщение.
  3. Я использую свой закрытый ключ для расшифровки сообщения, чтобы я мог его прочитать.

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

Критически важно, что самые простые обещания шифрования нет предоставить какие-либо гарантии о происхождении. Если Джо передает мне зашифрованное сообщение и говорит, что оно от Боба, у меня нет возможности проверить, действительно ли оно от Боба, и даже если оно от Боба, у меня нет возможности проверить, что сообщение не было изменено. (Например, если Джо знал, что сообщение гласит: «Боб хотел бы перевести \$XXXXX со счета Боба на счет Джо», в некоторых схемах шифрования Джо может изменить сообщение на «Боб хотел бы перевести \$99999». с учетной записи Боба на учетную запись Джо», хотя Джо не может узнать, каким был исходный XXXXX.)

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

  1. Я публикую свой открытый ключ и храню свой секретный ключ в секрете.
  2. Я решаю, что хочу доказать вам, что поддерживаю сообщение. Я использую свой закрытый ключ для подписи сообщения и отправляю подпись (и сообщение) вам.
  3. Вы используете мой открытый ключ, чтобы убедиться, что я создал подпись и что подпись относится к данному сообщению.

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

Двойственно обсуждению выше о вещах нет обещанное шифрование, есть вещи нет обещано подписями. Например, подпись может раскрывать нетривиальную информацию о сообщении, к которому она применяется, поэтому она не обещает секретности, как шифрование. Таким образом, шифрование и подпись являются взаимодополняющими методами.

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

AnoE avatar
флаг ws
Я не совсем понимаю, о чем вы говорите.Фрагмент, который вы цитируете из OP, кажется, правильно указывает аспект подписи криптографии с открытым ключом (возможно, с крошечной оптимизацией, которую можно было бы регулярно подписывать только хэшем сообщения вместо самого сообщения, но технически / криптологически конечный результат будет быть одинаковым). Не могли бы вы уточнить, какая часть блока в кавычках неверна?
флаг xk
@AnoE В цитируемом блоке говорится о шифровании и расшифровке сообщения, а не о подписании и проверке подписи; это основная ошибка. Это не просто разница в терминологии, как обсуждалось в моем ответе: подписи не обещают ни направления информации, которую они подписывают, ни того, что информация может быть восстановлена, ни того, что она не может, поэтому говоря о восстановлении сообщение из подписи с использованием открытого ключа не имеет смысла.
AnoE avatar
флаг ws
Каждое предложение цитируемого блока имеет смысл само по себе, и ни одно из них не противоречит друг другу. Он немного сбивает меня с толку в «формате открытого сообщения» (хотя это может быть проблема с языком — я думаю, он просто хочет сказать, что зашифрованный текст отправляется публично, что довольно очевидно). И, очевидно, ни один из них не имеет практического применения, но, как он сказал, он изучает первые теоретические основы. Но концептуально мне кажется, что это нормально. Отвечая: «Нет, это очень неправильно!» кажется несколько надуманным...
флаг xk
@AnoE «Я могу зашифровать сообщение с помощью своего закрытого ключа, а затем опубликовать его» в целом неверно: во многих (большинстве) схем шифрования закрытый ключ не содержит нужных данных для шифрования. «любой может расшифровать сообщение с помощью моего открытого ключа» неверно по аналогичной причине. «Должно быть, это я сделал сообщение, поскольку только у меня есть мой закрытый ключ» неверно, потому что шифрование не дает обещаний о происхождении. «любой, у кого есть копия соответствующего открытого ключа, может расшифровать сообщение» неверно по той же причине, что и «любой может расшифровать сообщение с помощью моего открытого ключа».
флаг xk
@AnoE Другими словами, вопреки вашему «каждое предложение имеет смысл само по себе», * каждое предложение содержит ошибку *, а некоторые содержат больше.

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

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