3

这与 .NET / C# 有关。假设在 PFX 或 PKCS#12 文件中有证书 + 私钥(P521 ECC 之一)。我们已通过安装(双击 PFX 或运行certutil -f -p myPfxPassword -importPFX MY SomeEcCert.pfx)将此证书及其私钥加载到 Windows 证书存储中。我注意到如果证书兼容(例如 p521 曲线),它会自动安装为 CNG 证书/密钥。

现在,如何将私钥加载到 CngKey 中,以便在ECDiffieHellmanCng类中使用它?我还想加载 X509 (CNG) 证书以读取它的序列号、发行者、通用名称等以进行一些簿记。

var myCngKey = SomehowLoadTheCngKey("my ecc certificate"); // <== ??
var myDH = new ECDiffieHellmanCng(myCngKey);
4

1 回答 1

2

嗯,.NET 没有很好的 CNG API。如果你甚至触及他们 API 的表面,你会立即发现这有点荒谬,特别是考虑到两者都来自微软,而 CNG 是整个 Windows 平台上所有 Crypto API 中最严重的。

因此,您需要使用CLRSecurity,它为 C++ CNG API 提供 C# 接口(通过 P/Invoke)。即使这样,它也不是最好的 API 设计。但它有帮助。

// Load the cert, many ways, one implementation
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindBySubjectName, "My cert subject name", true);
store.Close();

if (certs.Count > 0)
    cert = certs[0];
else
    return;

// Magic happens here! We load the private CngKey (if it exists)
// You need CLR Security for this, it manages the P/Invoke
// into the C++ api behind the scenes. 
var pvtCngKey = cert.GetCngPrivateKey(); 

// Create the DiffieHellman helper
var ecDh = new ECDiffieHellmanCng(ourPvtEcCngKey)
{
   KeyDerivationFunction = ECDiffieHellmanKeyDerivationFunction.Hash,
   HashAlgorithm = CngAlgorithm.Sha256
};

ECDiffieHellmanCngPublicKey theirPubCngKey = LoadOtherPartiesCngPublicKey(theirCert);
byte[] symKey = ecDh.DeriveKeyMaterial(theirPubCngKey);
于 2014-02-05T01:58:52.573 回答