Зашифровать строку в C # и расшифровать ее в Delphi - PullRequest
5 голосов
/ 02 июня 2011

Я пишу веб-приложение в ASP.Net, которое создает лицензионный ключ для приложения Windows, написанного на Delphi. Для простоты я собираюсь использовать адрес электронной почты и дату.

Я хочу зашифровать ее в C # и отправить эту информацию по электронной почте этому лицу, а затем при запуске приложения Windows человек вводит в зашифрованную строку.

Каждый раз, когда приложение Windows запускается, оно проверяет эту лицензию, расшифровывая ее и сравнивая с текущей датой.

Как я могу это сделать, чтобы шифрование C # успешно расшифровывалось в Delphi?

Ответы [ 4 ]

8 голосов
/ 03 июня 2011

"мир был полон плохих систем безопасности, разработанных людьми, которые читают Прикладная криптография "

Хотя простой ответ «используйте тот же алгоритм и убедитесь, что у вас одинаковые ключи и исходный вектор», этот ответ только раскрывает истинную проблему, с которой вы столкнетесь: Как вы собираетесь защитить шифрование ключ ? Отправить его вместе с лицензией? Вставить это в приложение? Правда состоит в том, что не существует протокола, который может самозагрузиться без корня доверия, будь то общедоступный доверенный орган или общий секрет. Общий секрет легко кодировать, но на практике он совершенно бесполезен (что означает, что AES, 3DES, XDES или любой другой подобный шифр не ответ), поэтому вам нужна схема, которая запускается на основе криптографии с открытым ключом , Для этого, чтобы что-то зашифровать для получателя лицензии, вам нужен открытый ключ указанного получателя, что затруднит подготовку (сайт лицензии отправляет открытый ключ, вы шифруете лицензию, отправляете электронную почту и т. Д.). Гораздо лучше отправить лицензию открытым текстом, но с подписью с вашим закрытым ключом. Тогда ваше приложение может проверить подпись на лицензии и использовать ее, если не подделано.

S-MIME - такая схема. PGP так же хорошо. Написание собственного кода на C # и Delphi возможно, но настоятельно не рекомендуется. См. Криптографические подписи .

8 голосов
/ 03 июня 2011
2 голосов
/ 03 июня 2011

Вы можете использовать стандартные алгоритмы подписи RSA или DSA, чтобы делать то, что вы хотите. Для C # это стандартные алгоритмы, встроенные в среду выполнения. Для Delphi у вас есть выбор. См. Бесплатная библиотека шифрования для Delphi .

После того как вы выбрали библиотеку шифрования для Delphi, теперь вы можете делать следующее:

  1. Сервер C # подписывает адрес электронной почты пользователя и дату, используя выбранный алгоритм подписи, вашим личным ключом.
  2. Клиент Delphi проверяет лицензию, используя тот же алгоритм подписи.
  3. Как только клиент Delphi узнает, что подпись действительна, вы можете проверить адрес электронной почты / дату и решить, разрешить ли запуск вашей программы.

Я сделал именно ту проверку подписи, которую вы хотите / нуждаетесь, используя алгоритм DSA, LockBox и C #.

Следует помнить, что в шифровании C # используются числа с прямым порядком байтов, а в LockBox / Windows CryptoAPI используются числа с прямым порядком байтов. Это, вероятно, означает, что вам нужно обратить обратный порядок байтов как переменных открытого ключа, так и самой подписи, прежде чем отправлять ее клиенту Delphi для проверки. Проверьте документацию по своей крипто-библиотеке.

Последнее замечание: другие предложили использовать симметричные алгоритмы шифрования, такие как AES / 3DES / и т. Д. Проблема с этим подходом заключается в том, что ваш «секретный» ключ шифрования распределяется между сервером и клиентом. Возможно, что кто-то сможет восстановить ключ, перепроверив ваш скомпилированный EXE-файл, а затем создать «генератор ключей» - в худшем случае это будет поддельный сервер активации, который раздает «подлинные» зашифрованные лицензии. Используя ассиметричное шифрование и сохраняя секретный ключ, у вас не будет этой проблемы. Пользователям придется взламывать каждую новую версию вашего EXE-файла или передавать подписанные подлинные лицензии - гораздо более неудобно.

0 голосов
/ 02 июня 2011

Используйте один и тот же алгоритм шифрования / дешифрования и в delphi, и в c #.

Вы можете найти код алгоритма шифрования для C # и затем преобразовать код в алгоритме дешифрования в Delphi.Скорее всего, если вы выберете популярное шифрование, вы сможете найти алгоритмы шифрования и дешифрования уже на разных языках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...