5

ECDiffieHellmanCngオブジェクトの新しいインスタンスからキーをエクスポートしようとしているので、後で同じキーを使用してそのインスタンスを作成できます。しかし、エクスポートしようとするとエラーが発生します。

//Create new ECDiffieHellmanCng which automatically creates new keys
var ecdh = new ECDiffieHellmanCng();
//Export the keys
var privateKey = ecdh.Key.Export(CngKeyBlobFormat.EccPrivateBlob);

「要求された操作はサポートされていません」というメッセージでExportメソッドを呼び出すと、CryptographicException が発生します。Export メソッドの定義を見ると、 SecuritySafeCriticalAttributeで飾られているため、この属性が実際に例外をスローしているのではないかと疑っています。この例外の原因は何ですか? 後で同じ ECDiffieHellmanCng オブジェクトのインスタンスを作成できるように、キーを保存するにはどうすればよいですか?

4

2 に答える 2

12

デフォルトでは、キーはエクスポートできません。キーは KSP に安全に保存されます。キーを作成するときは、エクスポートを許可するようにマークする必要があります。例:

var ecdh = new ECDiffieHellmanCng(CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null, new CngKeyCreationParameters {ExportPolicy = CngExportPolicies.AllowPlaintextExport}));
//Export the keys
var privateKey = ecdh.Key.Export(CngKeyBlobFormat.EccPrivateBlob);

これを簡単にするために、CngKey から直接エクスポートし、新しいキーを作成して秘密キーをエクスポートするだけの場合は、アルゴリズムを使用しないようにすることができます。

var cngKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null, new CngKeyCreationParameters {ExportPolicy = CngExportPolicies.AllowPlaintextExport});
var privateKey = cngKey.Export(CngKeyBlobFormat.EccPrivateBlob);

エクスポートされた blob から CngKey を再作成するには、それを使用してCngKey.Import(yourBlob, CngKeyBlobFormat.EccPrivateBlob)ECDiffieHellmanCng のコンストラクターに渡します。


SecuritySafeCriticalAttribute は、.NET セキュリティ透過性モデルの一部です。それはあなたのエラーの原因ではありません。

于 2013-12-10T21:47:33.743 に答える
1

間違った BLOB 形式を指定していると思います。試す:

var privateKey = ecdh.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob);

それが失敗した場合は、秘密キーのエクスポートを許可するキー ポリシーを設定する必要があります。問題の詳細については、https ://stackoverflow.com/a/10274270/2420979 の回答を参照してください。

于 2013-12-10T21:39:13.720 に答える