5

我已经在 Google 和 Microsoft 的 Crypto API 上寻找了几个小时,了解如何生成公钥和私钥 ECC 密钥对。该类ECDiffieHellmanCnghttp://msdn.microsoft.com/en-us/library/system.security.cryptography.ecdiffiehellmancng.aspx#Y3081)列出了一个示例,但我不知道如何直接访问私钥。

对于该程序的一些背景知识,它是一个 C# 控制台应用程序,用于管理 TrueCrypt 会话、AES 预共享密钥加密和 ECDH/AES 加密。我需要一个函数来仅创建一个公钥/私钥对以保存到文件中,然后记录如何在包装的 AES 加密文件中使用这些生成的密钥(而不是像示例所示在运行时生成它)。此外,我知道将文件保存到硬盘驱动器时出现的所有漏洞,但我并不担心这个程序,我正在考虑 2 台客户端计算机是安全的。

另请注意,我不想使用 BouncyCastle API。

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

Elliptic Curve 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 回答