5

私は、パブリックとプライベートのECCキーペアを生成する方法について、GoogleとMicrosoftのCryptoAPIを何時間も探していました。ECDiffieHellmanCngクラス(http://msdn.microsoft.com/en-us/library/system.security.cryptography.ecdiffiehellmancng.aspx#Y3081 )に例がリストされていますが、秘密鍵に直接アクセスする方法がわかりません。

プログラムの背景については、TrueCryptセッション、AES事前共有キー暗号化、およびECDH / AES暗号化を管理するためのC#コンソールアプリです。ファイルに保存する公開鍵と秘密鍵のペアを作成するだけの関数が必要です。次に、ラップされたAES暗号化ファイルで生成された鍵を使用する方法のドキュメントを作成します(例のように実行時に生成するのではありません)。また、ファイルをハードドライブに保存する際に発生するすべての脆弱性を認識していますが、このプログラムではそのことを心配しておらず、2台のクライアントコンピューターは安全であると考えています。

また、BouncyCastleAPIを使用したくないことにも注意してください。

4

2 に答える 2

13

私はこれがあなたが探しているものだと思いますか?はいの場合は、(私の最初の!)回答としてマークしてください:-)

これのほとんどは、多くのバリエーションで使用できる CngKey に関連しています。

    static void test1()
    {
        CngKey k;

        if (CngKey.Exists("myECDH", CngProvider.MicrosoftSoftwareKeyStorageProvider, CngKeyOpenOptions.MachineKey))
        {
            k = CngKey.Open("myECDH", CngProvider.MicrosoftSoftwareKeyStorageProvider, CngKeyOpenOptions.MachineKey);
        }
        else
        {
            k = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, "myECDH", new CngKeyCreationParameters
        {
            ExportPolicy = CngExportPolicies.AllowPlaintextExport,
            KeyCreationOptions = CngKeyCreationOptions.MachineKey,
            KeyUsage = CngKeyUsages.AllUsages,
            Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider,
            UIPolicy = new CngUIPolicy(CngUIProtectionLevels.None)
        });
        }

        byte[] privateBytes = k.Export(CngKeyBlobFormat.EccPrivateBlob);
        byte[] publicBytes = k.Export(CngKeyBlobFormat.EccPublicBlob);

        //This:
        var privateTester1 =
            new ECDiffieHellmanCng(CngKey.Import(privateBytes, CngKeyBlobFormat.EccPrivateBlob,
                CngProvider.MicrosoftSoftwareKeyStorageProvider));

        //Or that:
        var privateTester2 = new ECDiffieHellmanCng(k);
    }
于 2014-03-25T14:30:03.047 に答える
3

楕円曲線 DiffieHellmanは暗号化アルゴリズムではなく、鍵合意プロトコルです。安全でないチャネルを介して、あなたと相手に共通の共有秘密を提供します. これは、安全な通信を行うための AES キーなどによく使用されます。

別のパーティの公開鍵を指定すると、このAPI 呼び出しで派生共有秘密鍵マテリアルを取得できます。注意事項のセクションに従って、CNG API は派生したシークレットに対して何らかの後処理を行うため、true-crypt が生成するものと一致する場合と一致しない場合があることに注意してください。

実際の秘密鍵 (共有秘密鍵ではない) を取得するには、以下を使用できます。別のエクスポート形式が必要な場合があります。それらはここにリストされています

using (ECDiffieHellmanCng alice = new ECDiffieHellmanCng())
    { 
    // Any  code you have  specifies the key your using or generates  one 
    var privatekey = alice.Key.Export(CngKeyBlobFormat.Pkcs8PrivateBlob)
    }

エクスポート ポリシーで秘密鍵のエクスポートが許可されていないというエラーが表示される場合があることに注意してください。その場合、エクスポートを許可するポリシーでキーを作成して使用する必要があります

于 2012-04-23T02:52:22.257 に答える