如何在不更改C#中的密钥的情况下将RSAParameters密钥导入和导出到文件

时间:2019-02-25 08:47:56

标签: c# digital-signature rsacryptoserviceprovider

我正在使用C#编写数字签名程序,并且使用RSACryptoServiceProvider类根据文件生成公用和专用密钥以及签名。如果在程序中,我用公钥,签名和文件检查了签名,那么它可以正常工作,但是如果我将密钥保存为文件中的任何格式,换句话说,我将更改其格式并返回到第一个状态。不起作用。因为我无法正确将其转换为RSAParameters。请指导我?

简单的示例测试以显示更改:

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.");
}

2 个答案:

答案 0 :(得分:0)

此代码有两个问题: 1. Encoding.ASCII.GetBytes的使用是错误的,因为它可能包含非ASCII字符,因此我们使用Convert.ToBase64String。 2. publicParams.Modulus是C#字节数组,所以!=可能不是正确的答案,因此我们使用SequenceEqual。

密钥不会更改。

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");
 }

答案 1 :(得分:0)

您可以将PublicKey作为字符串格式并将其保存在另一个文本文件中。

public static string PublicKey(string certSubject)
        {
            var my = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            my.Open(OpenFlags.ReadOnly);
            RSACryptoServiceProvider csp = null;
            byte[] publicKeyByte = null;
            foreach (var cert in my.Certificates)
            {
                if (cert.Subject.Contains(certSubject))
                {
                    csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
                    publicKeyByte = cert.PublicKey.EncodedKeyValue.RawData;
                }
            }
            if (csp == null)
            {
                throw new Exception("No valid cert was found");
            }
            var publicKey = new StringBuilder();
            publicKey.AppendLine("-----BEGIN PUBLIC KEY-----");
            publicKey.AppendLine(Convert.ToBase64String(publicKeyByte, Base64FormattingOptions.InsertLineBreaks));
            publicKey.AppendLine("-----END PUBLIC KEY-----");
            return publicKey.ToString();
        }