我如何检测AsymmetricAlgorithm是私钥还是公钥

问题描述 投票:0回答:1

是否有一种简单的方法来检查给定的AsymmetricAlgorithm是私钥还是公钥?考虑以下示例:

private void SavePrivateKey(AsymmetricAlgorithm asymmetricAlgorithm)
{
    // if (asymmetricAlgorithm.IsPrivateKey == false)
    //     throw new ArgumentException();
}

private void SavePrivateKeys()
{
    var certificate = CreateCertificate();
    var privateKey = RSACertificateExtensions.GetRSAPrivateKey(certificate);
    var publicKey = RSACertificateExtensions.GetRSAPublicKey(certificate);
    SavePrivateKey(privateKey);
    SavePrivateKey(publicKey); // this should throw an exception
}

private X509Certificate2 CreateCertificate()
{
    CngKeyCreationParameters keyParams = new CngKeyCreationParameters();
    keyParams.KeyUsage = CngKeyUsages.Signing;
    keyParams.Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider;
    keyParams.ExportPolicy = CngExportPolicies.AllowExport | CngExportPolicies.AllowPlaintextExport;
    keyParams.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(2048), CngPropertyOptions.None));
    var cngKey = CngKey.Create(CngAlgorithm.Rsa, Guid.NewGuid().ToString(), keyParams);
    var rsaKey = new RSACng(cngKey);
    var req = new CertificateRequest("cn=mycert", rsaKey, HashAlgorithmName.SHA256, RSASignaturePadding.Pss);
    var cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(5));
    return cert;
}

在这里,私钥和公钥都具有相同的类型-RSACng。从理论上讲,我可以尝试导出密钥参数,并查看公钥是否无法导出私钥参数。但是后来我不知道出口是否由于公开密钥失败,或者由于缺少出口政策或其他原因而失败。基础密钥类型也可能不同,可以是RSACng,RSACryptoServiceProvider,DSA等。

c# cryptography private-key public-key
1个回答
0
投票

ToXmlString()方法采用includePrivateParameters参数。如果设置了该参数,并且AsymmetricAlgorithm对象不包含有关私钥的信息,则ToXmlString()将引发CryptographicException异常:

private void SavePrivateKey(AsymmetricAlgorithm aa)
{
    System.Console.Write("This is ");
    try
    {
        aa.ToXmlString(true);
    }
    catch(CryptographicException ce)
    {
        System.Console.Write("not ");
    }
    System.Console.WriteLine("a private key");
}
© www.soinside.com 2019 - 2024. All rights reserved.