title: Securing a license key with RSA key
body: <p>it's late, I'm tired, and probably being quite dense....</p>
  
  <p>I have written an application that I need to secure so it will only run on machines that I generate a key for.
  What I am doing for now is getting the BIOS serial number and generating a hash from that, I then am encrypting it using a XML RSA private key. I then sign the XML to ensure that it is not tampered with.
  I am trying to package the public key to decrypt and verify the signature with, but every time I try to execute the code as a different user than the one that generated the signature I get a failure on the signature. </p>
  
  <p>Most of my code is modified from sample code I have found since I am not as familiar with RSA encryption as I would like to be. Below is the code I was using and the code I thought I needed to use to get this working right...</p>
  
  <p>Any feedback would be greatly appreciated as I am quite lost at this point 
  the original code I was working with was this, this code works fine as long as the user launching the program is the same one that signed the document originally...</p>
  
  <pre><code> 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,
              };
  </code></pre>
  
  <p>This code is what I believe I should be doing but it's failing to verify the signature no matter what I do, regardless if it's the same user or a different one...</p>
  
  <pre><code>RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
              //Load the private key from xml file
              XmlDocument xmlPrivateKey = new XmlDocument();
              xmlPrivateKey.Load("KeyPriv.xml");
              rsaKey.FromXmlString(xmlPrivateKey.InnerXml);
  </code></pre>
  
  <p>I believe this to have something to do with the key container name (Being a real dumbass here please excuse me) I am quite certain that this is the line that is both causing it to work in the first case and preventing it from working in the second case....</p>
  
  <pre><code>cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
  </code></pre>
  
  <p>Is there a way for me to sign/encrypt the XML with a private key when the application license is generated and then drop the public key in the app directory and use that to verify/decrypt the code? I can drop the encryption part if I can get the signature part working right. I was using it as a backup to obfuscate the origin of the license code I am keying from. </p>
  
  <p>Does any of this make sense? 
  Am I a total dunce? </p>
  
  <p>Thanks for any help anyone can give me in this..</p>