別のマシンにインポートしたい、エクスポートした RSAParameters 秘密鍵があります。新しいキーをローカル マシンまたはユーザー コンテナーに保存できますが、既存のキーをインポートしようとして行き詰まります。
以下のコードは新しいキー ペアを生成します。コンテナに直接新しいキーを生成できることはわかっていますが、単一のキーを生成し、その同じキーをいくつかの異なるコンピューターにインポートできるようにしたいと考えています。
RSAParameters または XML の文字列 (いずれか 1 つ) を取得して、それをローカル ユーザー (またはマシン) コンテナーにインポートするにはどうすればよいですか?
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() は byte[] を取り、有望に見えますが、CngKey.Import() が必要とする byte[] を作成する方法を見つけることができませんでした。
var d = new RSACryptoServiceProvider();
d.ImportParameters(privateKey);
var keyBlob = d.ExportCspBlob(true);
var key = CngKey.Import(keyBlob, CngKeyBlobFormat.Pkcs8PrivateBlob);
それは byte[] を取得しますが、使用する CngKeyBlobFormat に関係なく、例外が発生します。私は立ち往生しています。
アップデート
を使用して byte[] を取得する方法を見つけました
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 を試しても問題ありません。すべて例外が発生し、ローカルのキー ストレージ プロバイダーにキーをインポートできません。
これを機能させるには、どのような設定とパラメーターの魔法の組み合わせが必要ですか?