Protegendo uma Chave de Licença com Chave RSA

é tarde, estou cansado e provavelmente sendo bastante denso ...

Eu escrevi um aplicativo que preciso proteger, para que ele seja executado apenas em máquinas para as quais eu gero uma chave. O que estou fazendo no momento é obter o número de série do BIOS e gerar um hash a partir dele. Depois, criptografo-o usando uma chave privada XML RSA. Eu assino o XML para garantir que ele não seja violado. Estou tentando empacotar a chave pública para descriptografar e verificar a assinatura, mas sempre que tento executar o código como um usuário diferente daquele que gerou a assinatura, recebo uma falha na assinatura.

A maior parte do meu código é modificada a partir do código de amostra que encontrei, pois não estou tão familiarizado com a criptografia RSA como gostaria de estar. Abaixo está o código que eu estava usando e o código que pensei que precisava usar para fazer isso funcionar corretamente ...

Qualquer feedback seria muito apreciado, pois estou bastante perdido neste momento, o código original com o qual eu estava trabalhando era este, esse código funciona bem desde que o usuário que inicia o programa seja o mesmo que assinou o documento originalmente ...

 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,
            };

Esse código é o que eu acredito que deveria estar fazendo, mas está falhando em verificar a assinatura, não importa o que eu faça, independentemente de ser o mesmo usuário ou outro ...

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
            //Load the private key from xml file
            XmlDocument xmlPrivateKey = new XmlDocument();
            xmlPrivateKey.Load("KeyPriv.xml");
            rsaKey.FromXmlString(xmlPrivateKey.InnerXml);

Acredito que isso tenha algo a ver com o nome do contêiner de chave (sendo um idiota real aqui, por favor, com licença). Tenho certeza de que essa é a linha que está fazendo com que ele funcione no primeiro caso e impedindo que ele funcione no segundo caso ....

cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

Existe uma maneira de assinar / criptografar o XML com uma chave privada quando a licença do aplicativo é gerada e soltar a chave pública no diretório do aplicativo e usá-la para verificar / descriptografar o código? Posso descartar a parte de criptografia se conseguir que a parte da assinatura funcione corretamente. Eu estava usando-o como um backup para ofuscar a origem do código de licença do qual estou digitando.

Isso faz sentido? Eu sou um idiota total?

Obrigado por qualquer ajuda que alguém possa me dar neste ..

questionAnswers(2)

yourAnswerToTheQuestion