2017-05-01 13 views
0

私は別のマシンにインポートしたいエクスポートされたRSAParameters秘密鍵を持っています。 キーをローカルマシンまたはユーザコンテナに保存できますが、の既存のキーをインポートしようとしています。RSA CngKeyをインポートしてMicrosoftSoftwareKeyStorageProviderに格納します

次のコードは新しいキーペアを生成しますが、コンテナに直接新しいキーを生成することができますが、私は単一のキーを生成し、その同じキーを少数の異なるコンピュータ。

どのように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に関係なく、例外が発生します。私は立ち往生している。

UPDATE

私は

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は何の問題もなく、例外はすべて私に与えられ、キーをローカルのキーストレージプロバイダにインポートすることができません。

この設定にはどのような設定とパラメータが必要ですか?

+0

正確な例外はありますか?それが人々を助けてくれるだけでなく、同じ問題に直面している人々があなたの質問(そしてもっと重要なのはあなたの解決策!)を発見するでしょう。 –

答えて

1

さて、私はついにそれを働かせました。最終的に落ち着いたコードはここにあります。

public class KeyGenerationResult 
{ 
    public RSAParameters PublicKey { get; set; } 
    public string PublicKeyCleartext { get; set; } 
    public string PrivateKeyCleartext { get; set; } 
    public byte[] PrivateBytes { get; set; } 
    public int KeySize { get; set; } 
    public CngKeyBlobFormat BlobFormat { get; set; } 
} 

    public async Task<KeyGenerationResult> GenerateNewKeyAsync(int keySize) 
    { 
     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 = await Task.Run(() => CngKey.Create(CngAlgorithm.Rsa, null, cp)).ConfigureAwait(false); 
     var blobType = CngKeyBlobFormat.GenericPrivateBlob; 
     var bytes = await Task.Run(() => key.Export(blobType)).ConfigureAwait(false); 

     var rsa = new RSACng(key); 
     var pubKey = rsa.ExportParameters(includePrivateParameters: false); 
     var pubKeyString = exportKeyToString(pubKey); 

     return new KeyGenerationResult 
     { 
      PublicKey = pubKey, 
      PrivateKeyCleartext = Convert.ToBase64String(bytes), 
      PublicKeyCleartext = pubKeyString, 
      PrivateBytes = bytes, 
      BlobFormat = blobType, 
      KeySize = keySize 
     }; 
    } 

    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(KeyGenerationResult keyData, string keyName) 
    { 
     var myKSP = CngProvider.MicrosoftSoftwareKeyStorageProvider; 
     const bool MachineKey = false; 

     if (!CngKey.Exists(keyName, myKSP)) 
     { 
      var keyParams = new CngKeyCreationParameters 
      { 
       ExportPolicy = CngExportPolicies.AllowPlaintextExport, 
       KeyCreationOptions = (MachineKey) ? CngKeyCreationOptions.MachineKey : CngKeyCreationOptions.None, 
       Provider = myKSP 
      }; 
      keyParams.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(keyData.KeySize), CngPropertyOptions.None)); 
      keyParams.Parameters.Add(new CngProperty(keyData.BlobFormat.Format, keyData.PrivateBytes, CngPropertyOptions.None)); 

      CngKey.Create(CngAlgorithm.Rsa, keyName, keyParams); 
     } 
     else 
     { 
      throw new CryptographicException($"The key with the name '{keyName}' already exists!"); 
     } 
    } 
+0

参考として、これがこの回答のインスピレーションであると確信しています。https://social.msdn.microsoft.com/Forums/vstudio/en-US/467485eb-1249-406e-86c8-289eb42bd51b/net-cng-full- backup-recovery-of-rsa-keypair-cngkeyimport-cngkeyblobformat-?forum = netfxbcl –

関連する問題