Search code examples
c#digital-signaturersacryptoserviceprovider

How import and export RSAParameters keys to file without making a change to the keys in C#


I'm writing a digital signing program using C# and I use RSACryptoServiceProvider class that generates public and private keys and signatures depending on the file. If in the program, I check the signature with the public key, signature and file, it works correctly but If I save my keys to any format in the file, In other words, I will change their format and return to the first state It doesn't work. because I can not turn it into RSAParameters correctly. please guide me?

Simple example test to show the change:

var publicParams = rsaWrite.ExportParameters(false); // Generate the public key.
var testpublicParams = publicParams;
string st = Encoding.ASCII.GetString(publicParams.Modulus);
testpublicParams.Modulus = Encoding.ASCII.GetBytes(st);
if(publicParams.Modulus != testpublicParams.Modulus) { 
                Console.WriteLine("The key has been changed.");
}

Solution

  • This code has two problems:

    1. The use of Encoding.ASCII.GetBytes is wrong because it might have a non-ASCII characters so we use the Convert.ToBase64String.
    2. publicParams.Modulus is C# byte array so != probably not the right answer so we use SequenceEqual.

    And the key will not change.

    var rsaWrite = new RSACryptoServiceProvider();
    var publicParams = rsaWrite.ExportParameters(false); // Generate the public key.
    var testpublicParams = publicParams;
    string st = Convert.ToBase64String(publicParams.Modulus);
    testpublicParams.Modulus = Convert.FromBase64String(st);
    if (!publicParams.Modulus.SequenceEqual(testpublicParams.Modulus))
    {
         Console.WriteLine("The key has been changed.");
    }
    else
    {
         Console.WriteLine("The key has not been changed. :D");
     }