我使用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
,只是为了导入密钥并检查它。这可能吗?
答案 0 :(得分:1)
根据MSDN,ExportCspBlob
的输出与CAPI兼容,并且根据CAPI BLOBHEADER的文档,第一个字节表示密钥类型。具体来说,如果第一个字节是0x07,则它是私钥,而0x06是公钥。