Asegurar una clave de licencia con clave RSA

es tarde, estoy cansado y probablemente sea bastante denso ...

He escrito una aplicación que necesito asegurar para que solo se ejecute en máquinas para las que genero una clave. Lo que estoy haciendo por ahora es obtener el número de serie del BIOS y generar un hash a partir de eso, luego lo cifro usando una clave privada XML RSA. Luego firmo el XML para asegurarme de que no sea alterado. Estoy tratando de empaquetar la clave pública para descifrar y verificar la firma, pero cada vez que intento ejecutar el código como un usuario diferente al que generó la firma, aparece una falla en la firma.

La mayor parte de mi código se modifica a partir del código de muestra que he encontrado ya que no estoy tan familiarizado con el cifrado RSA como me gustaría estar. A continuación se muestra el código que estaba usando y el código que pensé que necesitaba usar para que esto funcionara correctamente ...

Cualquier comentario sería muy apreciado ya que estoy bastante perdido en este punto, el código original con el que estaba trabajando era este, este código funciona bien siempre que el usuario que inicia el programa sea el mismo que firmó el 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,
            };

Este código es lo que creo que debería estar haciendo, pero no puede verificar la firma sin importar lo que haga, independientemente de si es el mismo usuario o uno diferente ...

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

Creo que esto tiene algo que ver con el nombre del contenedor de claves (siendo un verdadero imbécil aquí, discúlpeme) Estoy bastante seguro de que esta es la línea que está causando que funcione en el primer caso y evitando que funcione en el segundo caso ...

cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

¿Hay alguna forma de firmar / cifrar el XML con una clave privada cuando se genera la licencia de la aplicación y luego soltar la clave pública en el directorio de la aplicación y usarla para verificar / descifrar el código? Puedo eliminar la parte de cifrado si puedo hacer que la parte de la firma funcione correctamente. Lo estaba usando como copia de seguridad para ofuscar el origen del código de licencia del que estoy escribiendo.

¿Algo de esto tiene sentido? ¿Soy un tonto total?

Gracias por cualquier ayuda que alguien me pueda dar en esto ...

Respuestas a la pregunta(2)

Su respuesta a la pregunta