Обеспечение лицензионного ключа с ключом RSA

поздно, я устал, и вероятно быть довольно плотным....

Я записал приложение, которое я должен защитить так, оно будет только работать на машинах, для которых я генерирую ключ. Что я делаю, на данный момент получает порядковый номер 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 с закрытым ключом, когда лицензия приложений сгенерирована, и затем отбросьте открытый ключ в каталоге приложения и использовании что проверить/дешифровать код? Я могу отбросить часть шифрования, если я могу получить работающую правильно часть подписи. Я использовал его в качестве резервного копирования для запутывания источника кода лицензии, от которого я ввожу.

Какое-либо из этого имеет смысл? Действительно ли я - общий остолоп?

Спасибо за любую справку любой может дать мне в этом..

5
задан Jesse Knott 30 March 2010 в 20:22
поделиться

2 ответа

Я использовал этот метод для подписи 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
5
ответ дан 14 December 2019 в 19:08
поделиться

Видимо, проблема в том, что разные пользователи не имеют доступа к ключу, который хранится для 1-го пользователя (прошу заметить: я не специалист по криптографии).

0
ответ дан 14 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: