В чем разница между шифрованием и подписью в асимметричном шифровании? - PullRequest
227 голосов
/ 18 января 2009

В чем разница между шифрованием некоторых данных и подписью некоторых данных (с использованием RSA)?

Это просто меняет роль открытых и закрытых ключей?

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

Полезно ли в этом сценарии подписание?

Ответы [ 11 ]

346 голосов
/ 18 января 2009

При шифровании вы используете их открытый ключ , чтобы написать сообщение, и они используют их закрытый ключ , чтобы прочитать его.

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

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

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

Это подпись , это делается с вашим личным ключом.

Я хочу иметь возможность шифровать определенную информацию и использовать ее в качестве ключа продукта для моего программного обеспечения.

Меня волнует только то, что я единственный, кто может их генерировать.

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

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

Я хотел бы включить свой открытый ключ в свое программное обеспечение для расшифровки / чтения подписи ключа

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

95 голосов
/ 18 января 2009

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

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

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

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

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

Итак:

  • Чтобы сгенерировать подпись, сделайте хеш-код из открытого текста, зашифруйте его своим закрытым ключом, включите его вместе с открытым текстом.
  • Чтобы проверить подпись, сделайте хеш-код из открытого текста, расшифруйте подпись с помощью открытого ключа отправителя, убедитесь, что оба хеша совпадают.
17 голосов
/ 18 января 2009

Да, думайте о подписании данных, как о том, что вы ставите свою собственную восковую печать, которой никто не имеет. Это сделано для достижения целостности и непризнания . Шифрование так, чтобы никто не мог видеть данные. Это сделано для достижения конфиденциальности . Смотрите википедию http://en.wikipedia.org/wiki/Information_security#Key_concepts

Подпись - это хэш вашего сообщения, подписанный с помощью вашего личного ключа.

14 голосов
/ 18 января 2009

Подписание создает «хеш» с вашим закрытым ключом, который можно проверить с помощью вашего открытого ключа. Текст отправляется в открытом виде.

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

Таким образом, использование ключей не отменяется (иначе ваш закрытый ключ больше не будет закрытым!).

8 голосов
/ 13 января 2018

Существуют две разные, но тесно связанные проблемы в установлении безопасного общения

  1. Шифрование данных, так что только уполномоченные лица могут дешифровать и читать их.
  2. Проверка личности / аутентификации отправителя.

Обе эти проблемы могут быть элегантно решены с помощью криптографии с открытым ключом.

I. Шифрование и дешифрование данных

Алиса хочет отправить Бобу сообщение, которое никто не сможет прочитать.

  • Алиса шифрует сообщение открытым ключом Боба и отправляет его.
  • Боб получает сообщение и расшифровывает его, используя свой закрытый ключ.

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

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

II. Проверка личности отправителя (Аутентификация)

Алиса хочет снова отправить сообщение Бобу. Проблема шифрования данных решается с помощью вышеуказанного метода.

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

Есть ли способ, которым Боб может подтвердить, что получаемые им сообщения действительно отправлены Алисой?

  • Алиса подписывает сообщение своим закрытым ключом и отправляет его. (На практике подписанным является хеш сообщения, например, SHA-256 или SHA-512.)
  • Боб получает его и проверяет, используя открытый ключ Алисы. Поскольку открытый ключ Алисы успешно подтвердил сообщение, Боб может сделать вывод, что сообщение было подписано Алисой.
8 голосов
/ 18 января 2009

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

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

6 голосов
/ 18 января 2009

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

3 голосов
/ 18 января 2009

В вашем сценарии вы не шифруете в смысле асимметричного шифрования; Я бы лучше назвал это «кодировать».

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

2 голосов
/ 18 января 2009

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

Подпись, которую вы используете, чтобы сообщить получателю, что вы создали сообщение, и оно не изменилось во время передачи. Подписание сообщения осуществляется с использованием вашего личного ключа.

Что касается используемого алгоритма: он включает простые числа. Я бы сделал поиск в Google для лучшего объяснения.

1 голос
/ 16 марта 2019

В чем разница между шифрованием некоторых данных и подписью некоторых данных (с использованием RSA)?

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

Это просто меняет роль открытых и закрытых ключей?

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

Для того же сообщения вы должны использовать закрытый ключ отправителя для подписи и доверенный открытый ключ получателя для шифрования. Обычно используется sign-then-encrypt, иначе злоумышленник может заменить подпись своей собственной. Аналогично, вы должны использовать закрытый ключ получателя для расшифровки и доверенный открытый ключ отправителя для проверки.

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

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

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

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

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

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

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

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

Шифрование используется для обеспечения конфиденциальности. В прошлом создание подписи RSA часто считалось «шифрованием с помощью закрытого ключа». Однако операции, как объяснено выше, совсем другие, и более поздние стандарты отчаянно пытаются разделить шифрование и генерацию подписи.

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

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

Например, существует Microsoft Authenticode. Магазины приложений, такие как iStore и магазин приложений Android, могут использовать или не использовать подписывание кода, но они дают некоторую уверенность в том, что ваше приложение не клонировано или, по крайней мере, не клонировано в магазине. В конце концов, криптография не всегда является решением проблемы.

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

Полезно ли в этом сценарии подписание?

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

...