Похоже, вы хотите использовать криптографию Public/Private для подписывания токена лицензии (например, фрагмента 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 для подписания. Проект должен быть настроен для подписания с созданным SNK. Он демонстрирует, как подписать тестовый XML-файл с помощью закрытого ключа из SNK, а затем проверить из открытого ключа в сборке.
Update
Добавлена up to date blog post с красивым подробным пробегают на лицензионных файлов
Независимо от того, что вы пытаетесь, если вашему приложению необходимо расшифровать файл лицензии, каждый пользователь может это сделать. Подумайте о другом способе лицензирования вашего программного обеспечения. – 2009-10-29 11:29:26