【发布时间】:2016-03-09 01:31:27
【问题描述】:
我想从 X509 证书的公钥初始化 ECDiffieHellmanCngPublicKey(证书是使用 ECDH_P384 模板颁发的)。 这是我尝试过的:
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly);
var cert = store.Certificates.Find(X509FindType.FindByTemplateName, "ComputerECC", true)[0];
var keyType = new byte[] { 0x45, 0x43, 0x53, 0x33 };
var keyLength = new byte[] { 0x30, 0x00, 0x00, 0x00 };
var key = cert.PublicKey.EncodedKeyValue.RawData.Skip(1);
var keyImport = keyType.Concat(keyLength).Concat(key).ToArray();
var pubKey = ECDiffieHellmanCngPublicKey.FromByteArray(keyImport, CngKeyBlobFormat.EccPublicBlob);
最后一行抛出 System.Security.Cryptography.CryptographicException: "与 ECDiffieHellmanCng 算法一起使用的密钥必须有一个 ECDiffieHellman 算法组。
使用魔法值来解析密钥的想法来自这个question 我怀疑我的证书模板中缺少某些内容。
【问题讨论】:
-
试过这个:私有静态 ECDiffieHellmanPublicKey ImportEccPublicKeyFromCertificate(X509Certificate2 cert) { var keyType = new byte[] { 0x45, 0x43, 0x53, 0x33 }; var keyLength = 新字节 [] { 0x30, 0x00, 0x00, 0x00 }; var key = cert.PublicKey.EncodedKeyValue.RawData.Skip(1); var keyImport = keyType.Concat(keyLength).Concat(key).ToArray();返回 ECDiffieHellmanCngPublicKey.FromByteArray(keyImport, CngKeyBlobFormat.EccPublicBlob); }
标签: c# cryptography