Звучит так, как будто вы хотите использовать публичную / частную криптографию для подписи токена лицензии (например, фрагмент XML или файл), чтобы вы могли обнаружить подделку. Самый простой способ справиться с этим - выполнить следующие шаги:
1) Создайте пару ключей для вашей компании. Вы можете сделать это в командной строке Visual Studio с помощью инструмента SN. Синтаксис:
sn -k c:\keypair.snk
2) Используйте пару ключей, чтобы строго назвать (то есть подписать) ваше клиентское приложение. Вы можете установить это, используя вкладку подписи на странице свойств вашего приложения
3) Создайте лицензию для своего клиента, это должен быть документ XML, и подпишите его с помощью своего закрытого ключа. Это включает в себя просто вычисление цифровой подписи и шаги для ее достижения можно найти по адресу:
http://msdn.microsoft.com/en-us/library/ms229745.aspx
4) На клиенте при проверке лицензии вы загружаете XmlDocument и используете свой Открытый ключ для проверки подписи, чтобы доказать, что лицензия не была подделана. Подробности о том, как это сделать, можно найти по адресу:
http://msdn.microsoft.com/en-us/library/ms229950.aspx
Чтобы обойти распространение ключей (т. Е. Убедиться, что ваш клиент использует правильный открытый ключ), вы можете фактически извлечь открытый ключ из самой подписанной сборки. Таким образом, гарантируя, что у вас нет другого ключа для распространения, и даже если кто-то подделает сборку, инфраструктура .net умрет с исключением из-за безопасности, поскольку строгое имя больше не будет соответствовать самой сборке.
Чтобы извлечь открытый ключ из клиентской сборки, вы хотите использовать код, подобный следующему:
/// <summary>
/// Retrieves an RSA public key from a signed assembly
/// </summary>
/// <param name="assembly">Signed assembly to retrieve the key from</param>
/// <returns>RSA Crypto Service Provider initialised with the key from the assembly</returns>
public static RSACryptoServiceProvider GetPublicKeyFromAssembly(Assembly assembly)
{
if (assembly == null)
throw new ArgumentNullException("assembly", "Assembly may not be null");
byte[] pubkey = assembly.GetName().GetPublicKey();
if (pubkey.Length == 0)
throw new ArgumentException("No public key in assembly.");
RSAParameters rsaParams = EncryptionUtils.GetRSAParameters(pubkey);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportParameters(rsaParams);
return rsa;
}
Я загрузил пример класса со множеством полезных утилит шифрования в Snipt по адресу: http://snipt.net/Wolfwyrd/encryption-utilities/, чтобы помочь вам в этом.
Я также включил пример программы по адресу: https://snipt.net/Wolfwyrd/sign-and-verify-example/. Образец требует, чтобы вы добавили его в решение с помощью библиотеки утилиты шифрования и предоставили тестовый файл XML и файл SNK для подписи. Проект должен быть подписан с созданным вами СНК. В нем показано, как подписать тестовый XML-файл с помощью закрытого ключа из SNK, а затем проверить его с помощью открытого ключа сборки.
Обновление
Добавлено актуальное сообщение в блоге с хорошим подробным просмотром файлов лицензий