【问题标题】:How import and export RSAParameters keys to file without making a change to the keys in C#如何在不更改 C# 中的密钥的情况下将 RSAParameters 密钥导入和导出到文件
【发布时间】:2019-02-25 08:47:55
【问题描述】:

我正在使用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.");
}

【问题讨论】:

  • 您必须对整个 RSAParameters 对象进行反序列化/序列化才能加载保存。最简单的是 Newtonsoft JsonConvert
  • 有没有机会使用PemUtils 来代替?
  • @huysentruitw 听起来不错,谢谢。
  • @Oliver 我会看到的,谢谢。

标签: c# digital-signature rsacryptoserviceprovider


【解决方案1】:

您可以获取字符串格式的 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();
        }

【讨论】:

    【解决方案2】:

    这段代码有两个问题:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2017-05-05
      • 2021-11-26
      • 1970-01-01
      相关资源
      最近更新 更多