Взаимозаменяемы ли открытый ключ и закрытый ключ? - PullRequest
13 голосов
/ 09 февраля 2012

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

Но с другой стороны, ключи, сгенерированные RSA, имеют разную длину, а в другой теме шифрование с помощью закрытого ключа называлось «подписывание» и считалось менеебезопаснее, чем шифрование с открытым ключом.(2)

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

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

Должен ли я распространять открытый ключ и шифровать его с помощью частного (2)или наоборот?

Примечание: в моем случае производительность не является проблемой.

Ответы [ 3 ]

28 голосов
/ 10 февраля 2012

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

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

  • С математической точки зрения ответ OTOH "да", предполагая, что вы используете внутреннее представлениезакрытого ключа, который содержит только модуль N и показатель степени D, а другой показатель E генерируется случайным образом.Формула, которая описывает отношение между двумя показателями, имеет вид 1 = E * D (mod phi (N)), поэтому с математической точки зрения не имеет значения, какой показатель является каким.

Но, с другой стороны, ключи, сгенерированные RSA, по-видимому, имеют разную длину

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

  • Публичный показатель E не генерируется случайным образом, а представляет собой небольшую фиксированную константу, такую ​​как 3 или 0x10001.Частный показатель D будет, с другой стороны, почти таким же большим, как и модуль, поэтому данные закрытого ключа будут почти в два раза больше данных открытого ключа.Если вы получили только закрытый ключ RSA (N, D), ваше первое предположение об открытом показателе будет иметь либо значения 3, либо 0x10001, и было бы легко проверить правильность предположения.Если вы хотите, чтобы ключи были взаимозаменяемыми, показатель, который вы выбираете первым, должен быть выбран случайным образом как нечетное целое число, большее 1 и меньше, чем phi (N), и без простых факторов, общих с N или phi (N).
  • Данные закрытого ключа включают в себя факторы P, Q модуля открытого ключа N.
  • Данные закрытого ключа включают показатель открытого ключа E.
6 голосов
/ 09 февраля 2012

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

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

0 голосов
/ 09 февраля 2012

открытых ключей шифрования.закрытые ключи расшифровывают.они не переключаются вокруг.

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

...