RSA - 如何检查公钥信息?

时间:2011-12-10 12:17:24

标签: c# bytearray rsa

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

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

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

澄清一下,以下是相关代码:

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,只是为了导入密钥并检查它。这可能吗?

1 个答案:

答案 0 :(得分:1)

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