2

コンテキスト: 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);                        
    }
4

2 に答える 2

2

公開鍵をランダムに生成することはできません。公開鍵は秘密鍵 (および曲線) から計算され、a) 公開 X が秘密鍵から期待されるものと一致しない、b) Y 座標が公開鍵に対して正しくないというエラーが発生する可能性があります。指定された X 座標。

選択した秘密鍵から公開鍵の値を計算する必要があります。私の知る限り、.Net も Windows CNG もその機能を公開していません。

于 2016-11-26T08:37:02.980 に答える