使用本机C#创建ECC专用/公钥

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

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

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

我相信这就是你要找的东西? 如果是,请标记为(我的第一个!)答案:-)

其中大部分与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); } 

Elliptic Curve DiffieHellman不是加密算法,它是一种密钥协商协议。 在不安全的渠道中,它为您和另一方提供了共同的共同秘密。 这通常用于表示用于进行安全通信的AES密钥。

给定另一方的公钥,您可以通过此 api调用获取派生的共享密钥材料。 请注意,根据备注部分 ,CNG APi对派生的秘密进行一些后处理,因此它可能与也可能不同意真正的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) } 

请注意,您可能会收到错误消息,指出导出策略不允许导出私钥。 在这种情况下,您需要使用允许导出的策略创建和使用密钥