Re[2]: Асимметричное шифрование "только для чтения"
От: alexme  
Дата: 23.01.10 00:29
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Здравствуйте, alexme, Вы писали:


A>>Допустим есть файл, в котором содержатся параметры лицензии — дата истечения, кол-во пользователей и т.п. Мне нужно зашифровать эту информацию, что бы пользователь не мог ее произвольно изменить. Но чтобы клиентское приложение могло расшифровать и получить эту информацию.


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


Я понимаю, что подпись позволяет обеспечить неизменность данных. Но когда необходимо шифрование — совместить его с подписью — красиво — не получается. Понятно как легко и красиво зашифровать XML — http://msdn.microsoft.com/ru-ru/library/ms229746.aspx. Понятно как легко и красиво подписать XML — http://msdn.microsoft.com/ru-ru/library/ms229745.aspx. Но вот совместить эти два варианта, что бы это было красиво — непонятно как, т.к. одной парой ключей и подписывать, и шифровать нельзя, т.к. для проверки подписи используется открытый ключ, а для расшифровки — закрытый, и имея оба ключа клиент может попросту создать желаемые данные, подписать и зашифровать их и никто и не догадается, что данные изменены. Т.е. нужно использовать две пары ключей — одну для подписи, другую — для шифрования. Но это как-то громоздко и некрасиво.. Потому, вопрос, собственно, и заключается в том, что неужели не предусмотрен в криптографических схемах вариант, когда нужно послать шифрованное сообщение, которое можно прочитать вторым ключом, но нельзя этим вторым ключом перешифровать для подмены ? Неужели нет таких алгоритмов ? Казалось бы, задача довольно простая/понятная и нет необходимости каскадировать шифрование/подпись..

A>>Исходя из концепции асимметричного шифрования я — отправитель информации — должен зашифровать файл открытым ключом, а клиент (приложение) иметь закрытый ключ, что бы расшифровать файл. Однако, имея и открытый ключ клиент может расшифровать файл и снова его зашифровать с измененной информацией. Получается, что по сути закрытый и открытый ключи должны поменяться ролями — клиенту я отдаю "закрытый", а "открытый", которым шифрую файл — держать в секрете.


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


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

A>>Проблема в том, что я не нашел в .net механизма реализации такого сценария. Классы, предназначенные для асимметричного шифрования (например, RSACryptoServiceProvider) позволяют хранить в хранилище либо только открытый ключ (когда RSACryptoServiceProvider.PublicOnly = true), либо оба ключа вместе.


0K>Там есть метод SingData и SingHash. Их и используйте.


A>>Как отделить закрытый ключ от открытого и расшифровывать только с его помощью ?


0K>В .Net (Windows CAPI) -- никак. А вообще можно, но нужна своя реализация. Но в вашем случае надобности в этом нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.