RSA -如何检查公钥信息

本文关键字:检查 公钥 信息 何检查 RSA | 更新日期: 2023-09-27 18:17:30

我使用c#中的RSACryptoServiceProvider加密和解密数据,当我生成一个新的密钥对时,我将私钥返回给方法的调用者,然后将公钥保存到自制的PKI(只是一个具有keyBlob和唯一标识符的字典)。

我的问题是:因为我需要存储公钥,我不想意外地在PKI中存储私钥。但是,由于我还需要实际地将私钥写入文件,因此我正在使用用ExportCspBlob方法导出的字节数组。


我的问题:我如何确保,通过检查我解析到我的StoreKey方法的byte[],它实际上是一个公钥,它不包含私钥信息?

为澄清起见,以下是相关代码:

public static bool StoreKey(byte[] publicKeyParameters, string uniqueIdentifier)
{
    bool success = false;
    if (!keyCollection.ContainsKey(uniqueIdentifier))
    {
        if (!keyCollection.ContainsValue(publicKeyParameters))
        {
            keyCollection.Add(uniqueIdentifier, publicKeyParameters);
            success = true;
        }
    }
    return success;
}

GenerateKeys方法:

public static byte[] GenerateKeys(string uniqueIdentifier)
{
    byte[] privateKeyBlob;
    using (var rsa = new RSACryptoServiceProvider(4096))
    {
        try
        {
            byte[] publicKey = rsa.ExportCspBlob(false);
            privateKeyBlob = rsa.ExportCspBlob(true);
            PublicKeyInfrastructure.StoreKey(publicKey, uniqueIdentifier);
        }
        finally
        {
            //// Clear the RSA key container, deleting generated keys.
            rsa.PersistKeyInCsp = false;
        }
    }
    return privateKeyBlob;
}

由于我正在处理两个不同的类,我想避免在PKI中初始化RSACryptoServiceProvider,只是为了导入密钥并检查它。这可能吗?

RSA -如何检查公钥信息

根据MSDN, ExportCspBlob的输出与CAPI兼容,并且根据CAPI BLOBHEADER的文档,第一个字节表示密钥类型。具体来说,如果第一个字节是0x07,则它是私钥,而0x06是公钥。