2

別のマシンにインポートしたい、エクスポートした 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 を試しても問題ありません。すべて例外が発生し、ローカルのキー ストレージ プロバイダーにキーをインポートできません。

これを機能させるには、どのような設定とパラメーターの魔法の組み合わせが必要ですか?

4

1 に答える 1