Анд*_*рей 3 c# cryptography elliptic-curve
关于如何生成公钥和私钥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.
小智 11
我相信这就是你要找的东西?如果是,请标记为(我的第一个!)答案:-)
其中大部分与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);
}
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可能会收到一条错误消息,指出导出策略不允许导出私钥。在这种情况下,您需要创建并使用一个具有允许导出策略的密钥
| 归档时间: |
|
| 查看次数: |
10161 次 |
| 最近记录: |