поздно, я устал, и вероятно быть довольно плотным....
Я записал приложение, которое я должен защитить так, оно будет только работать на машинах, для которых я генерирую ключ. Что я делаю, на данный момент получает порядковый номер BIOS и генерирует хеш от этого, я затем шифрую его с помощью закрытого ключа RSA XML. Я затем подписываю XML, чтобы гарантировать, что в него не вмешиваются. Я пытаюсь упаковать открытый ключ, чтобы дешифровать и проверить подпись с, но каждый раз я пытаюсь выполнить код как различный пользователь, чем тот, который генерировал подпись, я получаю отказ на подписи.
Большая часть моего кода изменяется из примера кода, который я нашел, так как я не так знаком с шифрованием RSA, как я хотел бы быть. Ниже код, который я использовал и код, я думал, что должен был использовать для получения этого работать правильно...
Любая обратная связь значительно ценилась бы, поскольку я вполне потерян в этой точке исходный код, с которым я работал, было это, этот код хорошо работает, пока пользователь, запускающий программу, является тем же, который подписал документ первоначально...
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
// Create a new RSA signing key and save it in the container.
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams)
{
PersistKeyInCsp = true,
};
Этот код - то, что я полагаю, что должен делать, но ему не удается проверить подпись независимо от того, что я делаю, независимо если это - тот же пользователь или другой...
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
//Load the private key from xml file
XmlDocument xmlPrivateKey = new XmlDocument();
xmlPrivateKey.Load("KeyPriv.xml");
rsaKey.FromXmlString(xmlPrivateKey.InnerXml);
Я полагаю, что это имеет некоторое отношение к ключевому контейнерному имени (Являющийся настоящим тупицей здесь, извините меня), я совершенно уверен, что это - строка, которая и заставляет его работать в первом случае и препятствует тому, чтобы оно работало во втором случае....
cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
Существует ли способ для меня подписываться/шифровать XML с закрытым ключом, когда лицензия приложений сгенерирована, и затем отбросьте открытый ключ в каталоге приложения и использовании что проверить/дешифровать код? Я могу отбросить часть шифрования, если я могу получить работающую правильно часть подписи. Я использовал его в качестве резервного копирования для запутывания источника кода лицензии, от которого я ввожу.
Какое-либо из этого имеет смысл? Действительно ли я - общий остолоп?
Спасибо за любую справку любой может дать мне в этом..
Я использовал этот метод для подписи XML-документов с использованием закрытого ключа, хранящегося в XML-файле, который я затем встроил в DLL-файл приложения в качестве ресурса. Я думаю, что у вас могут возникнуть проблемы с разрешениями на доступ к хранилищу ключей, и это также создало бы проблемы с передачей кода на другие серверы и т. Д.
Вот код для получения закрытого ключа в качестве встроенного ресурса и подписи документа: {{1 }} (Знак - это имя класса, в котором расположен этот метод, Licensing.Private.Private.xml - это комбинация пространства имен по умолчанию + папка + имя файла ресурса)
public static void SignDocument(XmlDocument xmldoc)
{
//Get the XML content from the embedded XML privatekey.
Stream s = null;
string xmlkey = string.Empty;
try
{
s = typeof(Sign).Assembly.GetManifestResourceStream("Licensing.Private.Private.xml");
// Read-in the XML content.
StreamReader reader = new StreamReader(s);
xmlkey = reader.ReadToEnd();
reader.Close();
}
catch (Exception e)
{
throw new Exception("Error: could not import key:",e);
}
// Create an RSA crypto service provider from the embedded
// XML document resource (the private key).
RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.FromXmlString(xmlkey);
//Creating the XML signing object.
SignedXml sxml = new SignedXml(xmldoc);
sxml.SigningKey = csp;
//Set the canonicalization method for the document.
sxml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigCanonicalizationUrl; // No comments.
//Create an empty reference (not enveloped) for the XPath transformation.
Reference r = new Reference("");
//Create the XPath transform and add it to the reference list.
r.AddTransform(new XmlDsigEnvelopedSignatureTransform(false));
//Add the reference to the SignedXml object.
sxml.AddReference(r);
//Compute the signature.
sxml.ComputeSignature();
// Get the signature XML and add it to the document element.
XmlElement sig = sxml.GetXml();
xmldoc.DocumentElement.AppendChild(sig);
}
Используйте следующий код, чтобы сгенерировать частный. xml и public.xml ключи. Очевидно, сохраните файл private.xml в безопасности.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
File.WriteAllText(@"C:\privateKey.xml", rsa.ToXmlString(true)); // Private Key
File.WriteAllText(@"C:\publicKey.xml", rsa.ToXmlString(false)); // Public Key
Видимо, проблема в том, что разные пользователи не имеют доступа к ключу, который хранится для 1-го пользователя (прошу заметить: я не специалист по криптографии).