【发布时间】:2017-09-29 08:44:38
【问题描述】:
我有一个导出的 RSAParameters 私钥,我想将它导入另一台机器。我可以将 new 密钥保存到本地计算机或用户容器中,但我无法尝试导入 现有 密钥。
下面的代码将生成一个新的密钥对,我知道我可以直接在容器中生成一个新密钥 - 但我希望能够生成一个密钥并将同一个密钥导入到少数不同的计算机中.
如何获取 RSAParameters 或 XML 字符串(任一)并将其导入本地用户(或机器)容器?
public async Task<KeyGenerationResult> GenerateNewKeyAsync(int keySize)
{
var csp = new RSACng(keySize);
var privKey = await Task.Run(() => csp.ExportParameters(includePrivateParameters: true));
var pubKey = csp.ExportParameters(includePrivateParameters: false);
var pubKeyString = exportKeyToString(pubKey);
var privKeyString = exportKeyToString(privKey);
return new KeyGenerationResult
{
PrivateKey = privKey,
PublicKey = pubKey,
PrivateKeyCleartext = privKeyString,
PublicKeyCleartext = pubKeyString
};
}
private static string exportKeyToString(RSAParameters key)
{
string keyString;
var sw = new StringWriter();
var xs = new XmlSerializer(typeof(RSAParameters));
xs.Serialize(sw, key);
keyString = sw.ToString();
return keyString;
}
public void SavePrivateKeyToLocalMachine(RSAParameters privateKey, string keyName)
{
//Stuck here. :(
}
CngKey.Import() 需要一个字节[],这看起来很有希望,但我无法找到任何方法来创建 CngKey.Import() 所需的字节[]。
var d = new RSACryptoServiceProvider();
d.ImportParameters(privateKey);
var keyBlob = d.ExportCspBlob(true);
var key = CngKey.Import(keyBlob, CngKeyBlobFormat.Pkcs8PrivateBlob);
这给了我一个字节[],但无论我使用什么 CngKeyBlobFormat,我都会遇到异常。我被卡住了。
更新
我找到了一种使用
获取字节[] 的方法 var cp = new CngKeyCreationParameters();
cp.KeyUsage = CngKeyUsages.AllUsages;
cp.ExportPolicy = CngExportPolicies.AllowPlaintextExport | CngExportPolicies.AllowExport | CngExportPolicies.AllowArchiving | CngExportPolicies.AllowPlaintextArchiving;
cp.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(keySize), CngPropertyOptions.None));
var key = CngKey.Create(CngAlgorithm.Rsa, null, cp);
var bytes = key.Export(CngKeyBlobFormat.{I have tried them all});
这段代码看起来像它应该让我导入字节[]
/* try to save this key to the local user container */
var keyParameters = new CngKeyCreationParameters()
{
KeyCreationOptions = CngKeyCreationOptions.OverwriteExistingKey,
Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider,
KeyUsage = CngKeyUsages.AllUsages,
ExportPolicy = CngExportPolicies.AllowPlaintextExport
};
keyParameters.KeyCreationOptions = CngKeyCreationOptions.None;
keyParameters.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(keySize), CngPropertyOptions.None));
keyParameters.Parameters.Add(new CngProperty(blobType.Format, bytes, CngPropertyOptions.None));
var newKey = CngKey.Create(CngAlgorithm.Rsa, "MyTestName", keyParameters);
...但再一次,没有骰子。我尝试什么 CngKeyBlobFormat 都没关系,它们都给了我例外,我无法将密钥导入本地密钥存储提供程序。
我需要什么神奇的设置和参数组合才能完成这项工作?
【问题讨论】:
-
您到底遇到了什么异常?这不仅可以帮助人们帮助您,还可以让面临相同问题的人更容易发现您的问题(更重要的是您的解决方案!)。
标签: c# .net cryptography rsa cng