コンテキスト: VS 2015 winforms、Windows 7、SecurityDriven Inferno ライブラリを使用。
電子メールの添付ファイルとして送信される暗号化されたファイルを生成するオフライン アプリをコーディングしています (したがって、クライアント サーバー コンテキストでは使用されません)。ファイルは最初に Inferno(ETM_Transform) で暗号化され、次に (場合によってはパスワードをリセットするために) 別のファイルと共に送信され、DHM キー交換が処理されます。
各ユーザーの公開鍵は、アプリによって作成および永続化されるデータテーブルに保存されるため、鍵交換プロセス中にすばやくアクセスできます。ただし、秘密鍵については、ユーザー (私を含む) がパス フレーズから秘密鍵を再作成することを好むため、鍵を隠す必要がなくなり、セキュリティと移植性が向上します。そのため、保存された公開鍵とハッシュ化されたパス フレーズから鍵を作成する必要があります。
これは健全なアプローチですか、それともこの特定のコンテキストにより適したアプローチがあるのでしょうか?
「要求された操作はサポートされていません」という例外をスローする非常に短いコード例を次に示します。データをキーにインポートするにはどうすればよいですか?
internal static void CreateKey(string passPhrase)
{
byte[] keyType = new byte[] { 0x45, 0x43, 0x4B, 0x34 };
byte[] keyLength = new byte[] { 0x30, 0x0, 0x0, 0x0 };
CryptoRandom cr = new CryptoRandom(); // rng used for this example
byte[] prKey = cr.NextBytes(48); // salt+hash passphrase and pass it to the private key part
byte[] pbKey = cr.NextBytes(96); // the public part, if I understand the format correctly for a cngkey using ECDH_P384
byte[] blob = Utils.Combine(keyType, keyLength); // same as concat
blob = Utils.Combine(blob, pbKey, prKey);
CngKey key = CngKey.Import(blob, CngKeyBlobFormat.EccPrivateBlob);
}