Могу ли я использовать сборки PublicKey для расшифровки строки, зашифрованной с помощью соответствующего PrivateKey? - PullRequest
2 голосов
/ 04 декабря 2009

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

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

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

Полагаю, было бы хорошо, если бы я только что подписал строку. Но как?

Я немного растерялся, как начать это. У кого-нибудь есть фрагмент кода?

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

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

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

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

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

Я выберу следующий маршрут (в зависимости от моего варианта использования):

  • Я буду использовать закрытый ключ для подписания лицензии.
  • Я буду использовать открытый ключ, чтобы убедиться, что лицензия была подписана закрытым ключом
  • Я опубликую еще один вопрос, направленный на разработчиков PHP, о том, как использовать ключи .NET (созданные sn.exe) для подписи некоторого текста
  • Я не очень беспокоюсь о том, что пользователь увидит лицензию, так как в любом случае это хеш, который вычисляется из того, что он уже знает. Все, что я хочу, - это сделать слишком трудным то, что ваш типичный архитектор здания будет стоить того, чтобы копировать мое программное обеспечение без моего ведома (помните, что программное обеспечение будет бесплатным - все, что мне нужно, - это бумажный след о том, кто его установил ...) )

Большое спасибо за ваши ответы.

Ответы [ 7 ]

1 голос
/ 04 декабря 2009

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

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

1 голос
/ 04 декабря 2009

Это можно сделать с помощью SignedXml http://msdn.microsoft.com/en-us/library/ms229745.aspx. На более низком уровне вы можете использовать RSAPKCS1SignatureDeformatter и RSAPKCS1SignatureFormatter. Они работают, зашифровывая хеш данных, затем сравнивая данные с (дешифрованным) хешем на другом конце. Я считаю, что хеширование используется, потому что шифрование с помощью закрытого ключа может обрабатывать только небольшие данные. Не уверен в повторном использовании открытого ключа сборки, если это вызывает проблемы, просто используйте отдельную пару ключей.

Слово предупреждения, проверьте это, поскольку эти классы могут привести к зависанию на 20 секунд! http://www.pcreview.co.uk/forums/thread-3428177.php

Этот подход уязвим для подделки кода проверки подписи с использованием Reflexil, но это другой вопрос.

Я написал следующее, но перечитывая, думаю, вы уже поняли: вы на самом деле не пытаетесь зашифровать или скрыть данные от пользователя, вы хотите помешать им создать или изменить лицензию. Вы правы, что для этого можно использовать алгоритм шифрования с открытым личным ключом. Это известно как Подписание с использованием закрытого ключа (генерация лицензии на стороне сервера). И проверка подписи с использованием открытого ключа (проверка лицензии в приложении). Я упоминаю эту терминологию, поскольку она поможет в исследованиях.

0 голосов
/ 04 декабря 2009

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

0 голосов
/ 04 декабря 2009

В RSA единственная действительная разница между открытым ключом и закрытым ключом заключается в том, какой из них вы держите в секрете.

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

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

Но, как отметил @Lasse V. Karlsen, .Net может сделать это более трудным, чем должно быть ...

0 голосов
/ 04 декабря 2009

Нет в .NET.

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

Однако в .NET реализация RSA была повреждена, и при подписывании будут генерироваться только дайджесты ввода, а не полная обработанная информация.

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

Я говорю о математике RSA, а не о конкретной реализации RSA.

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

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

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

0 голосов
/ 04 декабря 2009

Внимание! Этот ответ неверен, но я собираюсь оставить его здесь, тем не менее, потому что я прилагаю серию комментариев, которые, я думаю, достаточно интересны для других, чтобы держать ответ. Хорошо, я выгляжу как идиот, но для меня в этом нет ничего нового;) Голосуй как хочешь.

Открытый ключ может использоваться для: -

  • Зашифруйте то, что можно расшифровать только с помощью закрытого ключа
  • Аутентифицировать что-то подписанное с закрытым ключом

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

0 голосов
/ 04 декабря 2009

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

...