Могу ли я использовать Assemblies publickey, чтобы расшифровать строку, зашифрованную с соответствующим частным ключом?

StackOverflow https://stackoverflow.com/questions/1847357

Вопрос

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

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

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

Я думаю, все было бы в порядке, если бы я только что подписал строку. Но как?

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

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

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

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

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

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

Маршрут, который я возьму, это (на основе моего варианта использования):

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

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

Это было полезно?

Решение

Не в .net.

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

Но, как отметил @lasse В. Карлсен, .NET может усложнить его более сложным, чем должно быть ...

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

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

Публичный ключ можно использовать для:-

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top