-->

创建具有本机C#的ECC公钥/私钥(Creating an ECC Private/Public k

2019-06-23 20:50发布

我一直在四处寻找关于如何生成公共和私人ECC密钥对谷歌和微软的加密API小时。 该ECDiffieHellmanCng类( http://msdn.microsoft.com/en-us/library/system.security.cryptography.ecdiffiehellmancng.aspx#Y3081 )列出了一个例子,但我不知道如何直接访问私钥。

有关计划的一些背景,它是用来管理TrueCrypt的会议,AES预共享密钥加密和ECDH / AES加密一个C#控制台应用程序。 我需要一个函数来仅仅创建一个公共/私有密钥对保存到文件中,然后如何使用在包裹的AES加密文件那些生成的密钥文件(而不是在运行时生成它像例子显示)。 另外我知道关与文件保存到硬盘出现不过我不是这个程序担心这个,我考虑到2台客户端计算机是安全的所有漏洞。

另外请注意,我不希望使用BouncyCastle的API。

Answer 1:

我相信这是你在找什么? 如果是,请标记为(我的第一次!)答案:-)

这其中大部分涉及到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);
    }


Answer 2:

椭圆曲线DiffieHellman不是一个加密算法,它是一个密钥协商协议。 在不安全的通道,它可以让你和对方共同共享的秘密。 这是经常用于比如AES密钥进行安全通信。

考虑到另一方的公钥,你可以得到派生共享密钥材料这个 API调用。 请注意,按照上述表示的部分中,CNG API的确对派生秘密的一些后期处理,因此它可能或可能不会有什么真正的加密中产生认同。

要获得实际的私有密钥(这是不共享的秘密),你可以使用使用以下。 您可能需要不同的导出格式,它们列出这里

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

请注意,您可以风与一个错误说出口的政策不允许导出私钥。 在这种情况下,你需要创建和用户与确实允许出口政策的关键



文章来源: Creating an ECC Private/Public key with native C#